1 let descriptor_type_max = 11 2 let max_descriptors_per_pool = 64 3 4 let descriptor_types = 5 [DescriptorType/Sampler 6 DescriptorType/CombinedImageSampler 7 DescriptorType/SampledImage 8 DescriptorType/StorageImage 9 DescriptorType/UniformTexelBuffer 10 DescriptorType/StorageTexelBuffer 11 DescriptorType/UniformBuffer 12 DescriptorType/StorageBuffer 13 DescriptorType/UniformBufferDynamic 14 DescriptorType/StorageBufferDynamic 15 DescriptorType/InputAttachment] 16 17 type DescriptorCounts = struct 18 array : [u16; descriptor_type_max] 19 20 fun get (index : DescriptorType) = array[index as u32] 21 22 fun set @mut (index : DescriptorType) (value : u16) = 23 array[index as u32] = value 24 25 fun hash state = 26 for i = 0 until descriptor_type_max do 27 Kd.hash array[i].as<u32> state 28 29 type DescriptorPoolCache = 30 val instance : Instance 31 val counts_pools = Map<DescriptorCounts, mut List<(VkDescriptorPool, u32)>>.new 32 33 def get (counts : DescriptorCounts) : VkDescriptorPool = 34 if not counts_pools.contains counts then 35 counts_pools.insert counts List.new 36 37 let list = counts_pools[counts] 38 case list.try_last of 39 Some (pool, count) if count < max_descriptors_per_pool -> 40 list[list.size - 1] = (pool, count + 1) 41 pool 42 43 else -> 44 let sizes = List<DescriptorPoolSize>.new 45 for i = 0 until descriptor_types.size do 46 let descriptor_type = descriptor_types[i] 47 if counts[descriptor_type] == 0 then 48 continue 49 50 let size = DescriptorPoolSize 51 type = descriptor_type 52 descriptor_count = counts[descriptor_type] as u32 53 * max_descriptors_per_pool 54 sizes.add size 55 56 let descriptor_pool_create_info = DescriptorPoolCreateInfo 57 type = StructureType/DescriptorPoolCreateInfo 58 next = null 59 flags = DescriptorPoolCreateFlags/FreeDescriptorSet 60 max_sets = max_descriptors_per_pool 61 pool_size_count = sizes.size 62 pool_sizes = sizes.as_ptr 63 64 let mut descriptor_pool = null 65 vk/create_descriptor_pool self.instance.device 66 descriptor_pool_create_info@ptr 67 null descriptor_pool@mut_ptr 68 69 counts_pools[counts].add (descriptor_pool, 1) 70 71 descriptor_pool 72