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