@@ -9,7 +9,6 @@ pub struct AshBackend {
9
9
device : ash:: Device ,
10
10
queue : vk:: Queue ,
11
11
command_pool : vk:: CommandPool ,
12
- descriptor_pool : vk:: DescriptorPool ,
13
12
memory_properties : vk:: PhysicalDeviceMemoryProperties ,
14
13
_entry : ash:: Entry ,
15
14
}
@@ -152,31 +151,11 @@ impl ComputeBackend for AshBackend {
152
151
)
153
152
. context ( "Failed to create command pool" ) ?;
154
153
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
-
174
154
Ok ( Self {
175
155
instance,
176
156
device,
177
157
queue,
178
158
command_pool,
179
- descriptor_pool,
180
159
memory_properties,
181
160
_entry : entry,
182
161
} )
@@ -263,11 +242,34 @@ impl ComputeBackend for AshBackend {
263
242
}
264
243
265
244
// 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" ) ?;
266
268
let descriptor_set = self
267
269
. device
268
270
. allocate_descriptor_sets (
269
271
& vk:: DescriptorSetAllocateInfo :: default ( )
270
- . descriptor_pool ( self . descriptor_pool )
272
+ . descriptor_pool ( descriptor_pool)
271
273
. set_layouts ( & [ descriptor_set_layout] ) ,
272
274
)
273
275
. context ( "Failed to allocate descriptor sets" ) ?[ 0 ] ;
@@ -374,6 +376,7 @@ impl ComputeBackend for AshBackend {
374
376
self . device . destroy_buffer ( * buffer, None ) ;
375
377
self . device . free_memory ( * memory, None ) ;
376
378
}
379
+ self . device . destroy_descriptor_pool ( descriptor_pool, None ) ;
377
380
self . device . destroy_pipeline ( pipeline, None ) ;
378
381
self . device . destroy_pipeline_layout ( pipeline_layout, None ) ;
379
382
self . device
@@ -387,8 +390,6 @@ impl ComputeBackend for AshBackend {
387
390
impl Drop for AshBackend {
388
391
fn drop ( & mut self ) {
389
392
unsafe {
390
- self . device
391
- . destroy_descriptor_pool ( self . descriptor_pool , None ) ;
392
393
self . device . destroy_command_pool ( self . command_pool , None ) ;
393
394
self . device . destroy_device ( None ) ;
394
395
self . instance . destroy_instance ( None ) ;
0 commit comments