@@ -105,6 +105,67 @@ struct FrameDescriptors
105105 uint32_t descriptorOffsetEnd;
106106};
107107
108+ #if VK_EXT_descriptor_heap
109+ static uint32_t pushDescriptorHeap (FrameDescriptors& framedesc, const Program& program, const DescriptorInfo* descriptors)
110+ {
111+ assert (framedesc.descriptorOffset + program.pushDescriptorCount <= framedesc.descriptorOffsetEnd );
112+
113+ uint32_t result = framedesc.descriptorOffset ;
114+
115+ for (int i = 0 ; i < 32 ; ++i)
116+ if (program.resourceMask & (1 << i))
117+ {
118+ const DescriptorInfo& info = descriptors[i];
119+
120+ char descriptor[128 ];
121+
122+ switch (program.resourceTypes [i])
123+ {
124+ case VK_DESCRIPTOR_TYPE_SAMPLER:
125+ {
126+ // mapped via constant offsets (statically)
127+ continue ;
128+ }
129+ case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE:
130+ case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
131+ {
132+ const Image* image = static_cast <const Image*>(info.resource );
133+ assert (image);
134+ uint32_t mipLevel = (info.resourceMip < 0 ) ? 0 : uint32_t (info.resourceMip );
135+ uint32_t levelCount = (info.resourceMip < 0 ) ? VK_REMAINING_MIP_LEVELS : 1 ;
136+ getDescriptor (framedesc.device , image->image , image->format , mipLevel, levelCount, program.resourceTypes [i], descriptor, framedesc.descriptorSize );
137+ break ;
138+ }
139+
140+ case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
141+ case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
142+ {
143+ const Buffer* buffer = static_cast <const Buffer*>(info.resource );
144+ assert (buffer);
145+ getDescriptor (framedesc.device , buffer->address , buffer->size , program.resourceTypes [i], descriptor, framedesc.descriptorSize );
146+ break ;
147+ }
148+
149+ case VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR:
150+ {
151+ VkAccelerationStructureDeviceAddressInfoKHR addressInfo = { VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_DEVICE_ADDRESS_INFO_KHR };
152+ addressInfo.accelerationStructure = info.accelerationStructure ;
153+ VkDeviceAddress address = vkGetAccelerationStructureDeviceAddressKHR (framedesc.device , &addressInfo);
154+ getDescriptor (framedesc.device , address, 0 , program.resourceTypes [i], descriptor, framedesc.descriptorSize );
155+ break ;
156+ }
157+ default :
158+ assert (!" Unsupported descriptor type" );
159+ }
160+
161+ memcpy (static_cast <char *>(framedesc.descriptorHeap ) + framedesc.descriptorOffset * framedesc.descriptorSize , descriptor, framedesc.descriptorSize );
162+ framedesc.descriptorOffset ++;
163+ }
164+
165+ return result;
166+ }
167+ #endif
168+
108169template <typename PushConstants>
109170void pushConstants (VkCommandBuffer commandBuffer, FrameDescriptors& framedesc, const Program& program, const PushConstants& constants)
110171{
@@ -132,65 +193,14 @@ void pushDescriptors(VkCommandBuffer commandBuffer, FrameDescriptors& framedesc,
132193 if (program.descriptorSize )
133194 {
134195#if VK_EXT_descriptor_heap
135- assert (framedesc. descriptorOffset + program. pushDescriptorCount <= framedesc. descriptorOffsetEnd );
196+ uint32_t descriptorOffset = pushDescriptorHeap ( framedesc, program, descriptors );
136197
137- uint32_t descriptorOffset = framedesc.descriptorOffset ;
138198 VkPushDataInfoEXT pushDataInfo = { VK_STRUCTURE_TYPE_PUSH_DATA_INFO_EXT };
139199 pushDataInfo.offset = program.pushConstantSize ;
140200 pushDataInfo.data .address = &descriptorOffset;
141201 pushDataInfo.data .size = sizeof (descriptorOffset);
142202
143203 vkCmdPushDataEXT (commandBuffer, &pushDataInfo);
144-
145- for (int i = 0 ; i < 32 ; ++i)
146- if (program.resourceMask & (1 << i))
147- {
148- const DescriptorInfo& info = descriptors[i];
149-
150- char descriptor[128 ];
151-
152- switch (program.resourceTypes [i])
153- {
154- case VK_DESCRIPTOR_TYPE_SAMPLER:
155- {
156- // mapped via constant offsets (statically)
157- continue ;
158- }
159- case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE:
160- case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
161- {
162- const Image* image = static_cast <const Image*>(info.resource );
163- assert (image);
164- uint32_t mipLevel = (info.resourceMip < 0 ) ? 0 : uint32_t (info.resourceMip );
165- uint32_t levelCount = (info.resourceMip < 0 ) ? VK_REMAINING_MIP_LEVELS : 1 ;
166- getDescriptor (framedesc.device , image->image , image->format , mipLevel, levelCount, program.resourceTypes [i], descriptor, framedesc.descriptorSize );
167- break ;
168- }
169-
170- case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
171- case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
172- {
173- const Buffer* buffer = static_cast <const Buffer*>(info.resource );
174- assert (buffer);
175- getDescriptor (framedesc.device , buffer->address , buffer->size , program.resourceTypes [i], descriptor, framedesc.descriptorSize );
176- break ;
177- }
178-
179- case VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR:
180- {
181- VkAccelerationStructureDeviceAddressInfoKHR addressInfo = { VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_DEVICE_ADDRESS_INFO_KHR };
182- addressInfo.accelerationStructure = info.accelerationStructure ;
183- VkDeviceAddress address = vkGetAccelerationStructureDeviceAddressKHR (framedesc.device , &addressInfo);
184- getDescriptor (framedesc.device , address, 0 , program.resourceTypes [i], descriptor, framedesc.descriptorSize );
185- break ;
186- }
187- default :
188- assert (!" Unsupported descriptor type" );
189- }
190-
191- memcpy (static_cast <char *>(framedesc.descriptorHeap ) + framedesc.descriptorOffset * framedesc.descriptorSize , descriptor, framedesc.descriptorSize );
192- framedesc.descriptorOffset ++;
193- }
194204#endif
195205 }
196206 else
0 commit comments