1    type CommandBuffer =
2        val instance : Instance
3        let command_buffers : List<VkCommandBuffer>
4        let scissors : mut List<Rect2D>
5        let mut index : u32 = 0
6        var object = command_buffers[index]
7    
8    object CommandBuffer =
9        def create (count : u32) =
10           let instance : Instance @auto
11           let command_buffers = List<VkCommandBuffer>.new
12           let scissors = List<Rect2D>.new
13           for i = 0 until count do
14               let command_pool_create_info = CommandPoolCreateInfo
15                   type = StructureType/CommandPoolCreateInfo
16                   next = null
17                   flags = CommandPoolCreateFlags/ResetCommandBuffer
18                   queue_family_index = instance.graphics_queue_family_index
19   
20               let mut command_pool = null
21               vk/create_command_pool instance.device command_pool_create_info@ptr
22                                      null command_pool@mut_ptr
23               |> assert_success
24   
25               let allocate_info = CommandBufferAllocateInfo
26                   type = StructureType/CommandBufferAllocateInfo
27                   next = null
28                   =command_pool
29                   level = CommandBufferLevel/Primary
30                   command_buffer_count = 1
31   
32               let mut command_buffer = null
33               vk/allocate_command_buffers instance.device allocate_info@ptr
34                                           command_buffer@mut_ptr
35               |> assert_success
36   
37               command_buffers.add command_buffer
38               scissors.add Rect2D@zero
39   
40           let command_buffer_begin_info = CommandBufferBeginInfo
41               type = StructureType/CommandBufferBeginInfo
42               next = null
43               flags = CommandBufferUsageFlags/OneTimeSubmit
44               inheritance_info = null
45   
46           vk/begin_command_buffer command_buffers[0]
47                                   command_buffer_begin_info@ptr
48           |> assert_success
49   
50           CommandBuffer instance command_buffers scissors
51   
52   type CommandBuffer
53       def end =
54           vk/end_command_buffer object
55   
56       def scissor (rect : Rect2D) =
57           let command_buffer = command_buffers[index]
58           if scissors[index] <> rect then
59               scissors[index] = rect
60               vk/cmd_set_scissor command_buffer 0 1 (scissors.as_ptr + index)
61   
62       def next_frame =
63           index = (index + 1) % command_buffers.size
64           object = command_buffers[index]
65   
66           let command_buffer_begin_info = CommandBufferBeginInfo
67               type = StructureType/CommandBufferBeginInfo
68               next = null
69               flags = CommandBufferUsageFlags/OneTimeSubmit
70               inheritance_info = null
71   
72           vk/begin_command_buffer object command_buffer_begin_info@ptr
73           |> assert_success
74