1     module vulkan_object
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 =
81                    sync.ready_for_present_semaphores[ptr swapchain.image_index]
82                swapchain_count = 1
83                swapchains = swapchain.swapchain@ptr
84                image_indices = swapchain.image_index@ptr
85                results = null
86    
87            let result = vk/queue_present_khr instance.graphics_queue
88                                              present_info@ptr
89            case result of
90                Result/Success -> ()
91                Result/ErrorOutOfDateKhr -> swapchain.update
92                else -> fail
93    
94    object DescriptorSet
95        def create (binding_resources : Slice<(String, OneMany<Resource>)>
96                    layout : DescriptorSetLayout) =
97            let vulkan : Vulkan @auto
98    
99            DescriptorSet.create vulkan.instance vulkan.descriptor_pool_cache
100                                vulkan.sampler binding_resources layout
101