1     object Shader =
2         val font_vertex = "font.vert"
3         val font_fragment = "font.frag"
4         val font_rgba_vertex = "font_rgba.vert"
5         val font_rgba_fragment = "font_rgba.frag"
6         val color_vertex = "color.vert"
7         val color_fragment = "color.frag"
8         val bitmap_vertex = "bitmap.vert"
9         val bitmap_fragment = "bitmap.frag"
10        val local_fragment = "local.frag"
11        val default_vertex = "default.vert"
12        val default_fragment = "default.frag"
13        val depth_vertex = "depth.vert"
14        val depth_skinned_vertex = "depth_skinned.vert"
15        val depth_fragment = "depth.frag"
16        val tonemap_vertex = "tonemap.vert"
17        val tonemap_fragment = "tonemap.frag"
18        val blit_vertex = "blit.vert"
19        val blit_fragment = "blit.frag"
20        val resolve_depth = "resolve_depth.comp"
21        val default_fragment_xz = "default_xz.frag"
22        val default_fragment_xyz = "default_xyz.frag"
23    
24    type ShaderStage =
25        val shader_stage : ShaderStageFlags
26        val spir_v : Array<u8>
27    
28    type Shader @abstract =
29        val push_constant_size : u32
30        val push_constant_stages : ShaderStageFlags
31        val entry_point : CString
32        val metadata : Metadata
33        val create_info : PipelineShaderStageCreateInfo
34        let bytes : Array<u8>
35    
36        fun destruct =
37            bytes.discard
38    
39    typealias GetShader = String -> Shader
40    
41    type VertexShader =
42        inherit Shader
43    
44        val input_mask : u32
45    
46    type FragmentShader =
47        inherit Shader
48    
49        val output_mask : u32
50    
51    type ComputeShader =
52        inherit Shader
53    
54        val compute_local_size : [u32; 3]
55    
56    let create (name : String
57                stage : ShaderStageFlags
58                bytes : Slice<u8>) =
59        let instance : Instance @auto
60    
61        let shader_module_create_info = ShaderModuleCreateInfo
62            type = StructureType/ShaderModuleCreateInfo
63            next = null
64            flags = ShaderModuleCreateFlags@zero
65            code_size = bytes.size as usize
66            code = bytes.ptr as Ptr<u32>
67    
68        let mut module = null
69        vk/create_shader_module instance.device shader_module_create_info@ptr
70                                null module@mut_ptr
71        |> assert_success
72    
73        set_name ObjectType/ShaderModule module.unwrap.as<u64> name
74    
75        PipelineShaderStageCreateInfo
76            type = StructureType/PipelineShaderStageCreateInfo
77            next = null
78            flags = PipelineShaderStageCreateFlags@zero
79            =stage
80            =module
81            name = "main"
82            specialization_info = null
83    
84    object ComputeShader =
85        def create (name : String
86                    bytes : Array<u8>
87                    metadata : Metadata) =
88            let create_info = create name ShaderStageFlags/Compute bytes.as_slice
89    
90            ComputeShader push_constant_size = metadata.push_constant_size
91                          push_constant_stages = metadata.push_constant_stages
92                          compute_local_size = [8, 8, 1]
93                          entry_point = create_info.name
94                          =metadata =create_info =bytes
95    
96    object VertexShader =
97        def create (name : String
98                    bytes : Array<u8>
99                    metadata : Metadata) =
100           let create_info = create name ShaderStageFlags/Vertex bytes.as_slice
101   
102           VertexShader input_mask = metadata.vertex_input_mask
103                        push_constant_size = metadata.push_constant_size
104                        push_constant_stages = metadata.push_constant_stages
105                        entry_point = create_info.name
106                        =metadata =create_info =bytes
107   
108   object FragmentShader =
109       def create (name : String
110                   bytes : Array<u8>
111                   metadata : Metadata) =
112           let create_info = create name ShaderStageFlags/Fragment bytes.as_slice
113   
114           FragmentShader output_mask = metadata.fragment_output_mask
115                          push_constant_size = metadata.push_constant_size
116                          push_constant_stages = metadata.push_constant_stages
117                          entry_point = create_info.name
118                          =metadata =create_info =bytes
119