1    type BufferType =
2        | Vertex
3        | Index
4        | Storage
5        | Image
6        | Uniform
7    
8    type Buffer @abstract =
9        val type : BufferType
10       var object : VkBuffer
11       var size : u32
12       val offset : u64
13       val usage : BufferUsageFlags
14   
15       def info = DescriptorBufferInfo
16           buffer = object
17           offset = offset
18           range = size as u64
19   
20   type ResizeBuffer @abstract =
21       inherit Buffer object = null
22                      offset = 0
23                      size = 0
24   
25       let physical_device : VkPhysicalDevice
26       let device : VkDevice
27       var memory : VkMemory = null
28       let mut prev_object : VkBuffer = null
29       let mut prev_memory : VkMemory = null
30   
31       def ensure_size self (size : u32) =
32           if self.size < size then
33               if self.prev_object <> null then
34                   vk/destroy_buffer self.device self.prev_object null
35                   vk/free_memory self.device self.prev_memory null
36   
37               self.prev_object = self.object
38               self.prev_memory = self.memory
39               let adjusted_size = if self.size <> 0
40                                   then size as f32 * 1.5 |> as<u32>
41                                   else size
42   
43               let (buffer, memory) =
44                   buffer/create self.physical_device self.device adjusted_size.as<u64>
45                                 self.usage MemoryPropertyFlags/DeviceLocal
46   
47               self.size = adjusted_size
48                    object = buffer
49                    memory = memory
50   
51       def discard =
52           if prev_object <> null then
53               vk/destroy_buffer device prev_object null
54               vk/free_memory device prev_memory null
55   
56           vk/destroy_buffer device object null
57           vk/free_memory device memory null
58