1    begin@ vulkan
2    
3    type Vulkan @[mut internal] =
4        val sync : Sync
5        val instance : Instance
6        val buffer_pool : BufferPool
7        val command_buffer : CommandBuffer
8        var gpu_state = GpuState/None
9        val raster_images = Set<Image>.new
10       val compute_images = Set<Image>.new
11       val transfer_images = Set<Image>.new
12       val material_images = Bimultimap<Material, String>.new
13       val swapchain : Swapchain
14       val sampler : VkSampler
15       val quad_index_buffer : IndexBuffer
16       val render_pass_cache : RenderPassCache
17       val descriptor_pool_cache : DescriptorPoolCache
18       val shader_pipeline_caches @[mut local] = Map<PipelineSettings, PipelineCache>.new
19       val unused_buffers = List<StorageBuffer>.new
20       val discard_buffers @[mut private] = List<StorageBuffer>.new
21       var framebuffer_scissor = Rect2D@zero
22       val resolve : Resolve
23       val tonemap : Tonemap
24       val blit : Blit
25       val depth_shader : (VertexShader, FragmentShader)
26       val depth_skinned_shader : (VertexShader, FragmentShader)
27       val get_shader : GetShader
28       var time : f64 = 0
29       local token : Token @late
30   
31       def discard = token.discard
32   
33       def next_frame =
34           for buffer in discard_buffers do
35               buffer.discard
36   
37           discard_buffers.clear
38           discard_buffers.add_all unused_buffers
39           unused_buffers.clear
40   
41           raster_images.clear
42           compute_images.clear
43           transfer_images.clear
44   
45           sync.next_frame
46           command_buffer.next_frame
47           buffer_pool.next_frame
48   
49       def acquire_next_image =
50           vk/wait_for_fences instance.device 1
51                              sync.fences[ptr sync.sync_index]
52                              1 u64.max
53   
54           vk/reset_fences instance.device 1
55                           sync.fences[ptr sync.sync_index]
56   
57           sync.semaphore_acquired = false
58           if swapchain.swapchain == null then
59               return
60   
61           repeat
62               let result = vk/acquire_next_image_khr
63                   instance.device swapchain.swapchain u64.max
64                   sync.image_acquired_semaphores[sync.sync_index]
65                   VkFence@zero swapchain.image_index@mut_ptr
66   
67               case result of
68                   Result/ErrorOutOfDateKhr -> swapchain.update
69                   Result/SuboptimalKhr | Result/Success ->
70                       sync.semaphore_acquired = true
71                       break
72   
73                   else -> fail
74   
75       def present =
76           let present_info = PresentInfoKhr
77               type = StructureType/PresentInfoKhr
78               next = null
79               wait_semaphore_count = 1
80               wait_semaphores = sync.ready_for_present_semaphores[ptr swapchain.image_index]
81               swapchain_count = 1
82               swapchains = swapchain.swapchain@ptr
83               image_indices = swapchain.image_index@ptr
84               results = null
85   
86           let result = vk/queue_present_khr instance.graphics_queue present_info@ptr
87           case result of
88               Result/Success -> ()
89               Result/ErrorOutOfDateKhr -> swapchain.update
90               else -> fail
91   
92   object DescriptorSet
93       def create (binding_resources : Slice<(String, OneMany<Resource>)>
94                   layout : DescriptorSetLayout) =
95           let vulkan : Vulkan @auto
96   
97           DescriptorSet.create vulkan.instance vulkan.descriptor_pool_cache
98                                vulkan.sampler binding_resources layout
99