@@ -9,7 +9,6 @@ pub struct AshBackend {
99 device : ash:: Device ,
1010 queue : vk:: Queue ,
1111 command_pool : vk:: CommandPool ,
12- descriptor_pool : vk:: DescriptorPool ,
1312 memory_properties : vk:: PhysicalDeviceMemoryProperties ,
1413 _entry : ash:: Entry ,
1514}
@@ -152,31 +151,11 @@ impl ComputeBackend for AshBackend {
152151 )
153152 . context ( "Failed to create command pool" ) ?;
154153
155- // Create descriptor pool
156- let descriptor_pool = device
157- . create_descriptor_pool (
158- & vk:: DescriptorPoolCreateInfo :: default ( )
159- . pool_sizes ( & vec ! [
160- vk:: DescriptorPoolSize {
161- ty: DescriptorType :: STORAGE_BUFFER ,
162- descriptor_count: 16 ,
163- } ,
164- vk:: DescriptorPoolSize {
165- ty: DescriptorType :: UNIFORM_BUFFER ,
166- descriptor_count: 16 ,
167- } ,
168- ] )
169- . max_sets ( 16 ) ,
170- None ,
171- )
172- . context ( "Failed to create descriptor pool" ) ?;
173-
174154 Ok ( Self {
175155 instance,
176156 device,
177157 queue,
178158 command_pool,
179- descriptor_pool,
180159 memory_properties,
181160 _entry : entry,
182161 } )
@@ -263,11 +242,34 @@ impl ComputeBackend for AshBackend {
263242 }
264243
265244 // Allocate descriptor set
245+ let count_descriptor_types = |desc_type : DescriptorType | vk:: DescriptorPoolSize {
246+ ty : desc_type,
247+ descriptor_count : buffers
248+ . iter ( )
249+ . filter ( |buffer| buffer_usage_to_descriptor_type ( buffer. usage ) == desc_type)
250+ . count ( ) as u32 ,
251+ } ;
252+ let pool_sizes = [
253+ count_descriptor_types ( DescriptorType :: STORAGE_BUFFER ) ,
254+ count_descriptor_types ( DescriptorType :: UNIFORM_BUFFER ) ,
255+ ]
256+ . into_iter ( )
257+ . filter ( |a| a. descriptor_count != 0 )
258+ . collect :: < Vec < _ > > ( ) ;
259+ let descriptor_pool = self
260+ . device
261+ . create_descriptor_pool (
262+ & vk:: DescriptorPoolCreateInfo :: default ( )
263+ . pool_sizes ( & pool_sizes)
264+ . max_sets ( 1 ) ,
265+ None ,
266+ )
267+ . context ( "Failed to create descriptor pool" ) ?;
266268 let descriptor_set = self
267269 . device
268270 . allocate_descriptor_sets (
269271 & vk:: DescriptorSetAllocateInfo :: default ( )
270- . descriptor_pool ( self . descriptor_pool )
272+ . descriptor_pool ( descriptor_pool)
271273 . set_layouts ( & [ descriptor_set_layout] ) ,
272274 )
273275 . context ( "Failed to allocate descriptor sets" ) ?[ 0 ] ;
@@ -374,6 +376,7 @@ impl ComputeBackend for AshBackend {
374376 self . device . destroy_buffer ( * buffer, None ) ;
375377 self . device . free_memory ( * memory, None ) ;
376378 }
379+ self . device . destroy_descriptor_pool ( descriptor_pool, None ) ;
377380 self . device . destroy_pipeline ( pipeline, None ) ;
378381 self . device . destroy_pipeline_layout ( pipeline_layout, None ) ;
379382 self . device
@@ -387,8 +390,6 @@ impl ComputeBackend for AshBackend {
387390impl Drop for AshBackend {
388391 fn drop ( & mut self ) {
389392 unsafe {
390- self . device
391- . destroy_descriptor_pool ( self . descriptor_pool , None ) ;
392393 self . device . destroy_command_pool ( self . command_pool , None ) ;
393394 self . device . destroy_device ( None ) ;
394395 self . instance . destroy_instance ( None ) ;
0 commit comments