1    object Vulkan
2        def create (instance : Instance
3                    command_buffer : CommandBuffer
4                    buffer_pool : BufferPool
5                    sampler : VkSampler
6                    swapchain : Swapchain
7                    get_shader : GetShader
8                    image_changed : obs/Stream<String>) =
9            let sync = Sync.create swapchain.image_count
10           let render_pass_cache = RenderPassCache.new
11           let resolve =
12               let shader = get_shader Shader.resolve_depth as ComputeShader
13               Resolve.create shader
14   
15           let tonemap =
16               let vertex_shader = get_shader Shader.tonemap_vertex as VertexShader
17               let fragment_shader = get_shader Shader.tonemap_fragment as FragmentShader
18               Tonemap.create vertex_shader fragment_shader
19   
20           let blit =
21               let vertex_shader = get_shader Shader.blit_vertex as VertexShader
22               let fragment_shader = get_shader Shader.blit_fragment as FragmentShader
23               Blit.create render_pass_cache swapchain.format vertex_shader
24                           fragment_shader
25   
26           let depth_shader =
27               let vertex_shader = get_shader Shader.depth_vertex as VertexShader
28               let fragment_shader = get_shader Shader.depth_fragment as FragmentShader
29               (vertex_shader, fragment_shader)
30   
31           let depth_skinned_shader =
32               let vertex_shader = get_shader Shader.depth_skinned_vertex as VertexShader
33               let fragment_shader = get_shader Shader.depth_fragment as FragmentShader
34               (vertex_shader, fragment_shader)
35   
36           let quad_index_buffer =
37               let buffer = IndexBuffer.create
38               buffer.ensure_size (6 * 4)
39                      update [0, 1, 2, 0, 2, 3] BarrierFlags@all
40   
41               buffer
42   
43           let vulkan = Vulkan =sync =instance =buffer_pool =command_buffer =swapchain
44                               =sampler =quad_index_buffer =render_pass_cache
45                               descriptor_pool_cache = DescriptorPoolCache instance
46                               =resolve =tonemap =blit =depth_shader
47                               =depth_skinned_shader =get_shader
48   
49           vulkan.token = image_changed.subscribe { path ->
50               let maybe_materials = vulkan.material_images.try_get_back path
51               if maybe_materials ? Some materials then
52                   for material in materials do
53                       material.descriptor_set = null }
54   
55           vulkan
56   
57   end@ vulkan
58