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