diff --git a/build.zig.zon b/build.zig.zon index f786c2b..dbf3ccb 100644 --- a/build.zig.zon +++ b/build.zig.zon @@ -4,8 +4,8 @@ .dependencies = .{ // sokol only needed for the actual emulators .sokol = .{ - .url = "git+https://github.com/floooh/sokol-zig.git#fe47d2055d7b86bdcbaf02610109b1f1aa5dfdc1", - .hash = "12201b62a6fd9e15e0b78a4fbcda3ac907a423446c68c6b8614c9b3b21d24a955639", + .url = "git+https://github.com/floooh/sokol-zig.git#6ac38c06751b320fdf67ba81e86e03aebaf1a0d4", + .hash = "1220f0dab58f9fa0d140f8087405d1bcad99b7a913a9d78abf9c4d74a266992ab898", }, }, .paths = .{ diff --git a/emus/host/gfx.zig b/emus/host/gfx.zig index a4afaba..2113dd6 100644 --- a/emus/host/gfx.zig +++ b/emus/host/gfx.zig @@ -275,9 +275,9 @@ pub fn draw(opts: DrawOptions) void { sg.applyBindings(init: { var bind: sg.Bindings = .{}; bind.vertex_buffers[0] = state.offscreen.vbuf; - bind.fs.images[shaders.SLOT_fb_tex] = state.fb.img; - bind.fs.images[shaders.SLOT_pal_tex] = state.fb.pal_img; - bind.fs.samplers[shaders.SLOT_smp] = state.fb.smp; + bind.images[shaders.IMG_fb_tex] = state.fb.img; + bind.images[shaders.IMG_pal_tex] = state.fb.pal_img; + bind.samplers[shaders.SMP_smp] = state.fb.smp; break :init bind; }); const vs_params = shaders.OffscreenVsParams{ .uv_offset = .{ @@ -287,7 +287,7 @@ pub fn draw(opts: DrawOptions) void { asF32(state.offscreen.view.width) / asF32(state.fb.dim.width), asF32(state.offscreen.view.height) / asF32(state.fb.dim.height), } }; - sg.applyUniforms(.VS, shaders.SLOT_offscreen_vs_params, sg.asRange(&vs_params)); + sg.applyUniforms(shaders.UB_offscreen_vs_params, sg.asRange(&vs_params)); sg.draw(0, 4, 1); sg.endPass(); @@ -304,8 +304,8 @@ pub fn draw(opts: DrawOptions) void { sg.applyBindings(init: { var bind = sg.Bindings{}; bind.vertex_buffers[0] = state.display.vbuf; - bind.fs.images[shaders.SLOT_tex] = state.offscreen.img; - bind.fs.samplers[shaders.SLOT_smp] = state.offscreen.smp; + bind.images[shaders.IMG_tex] = state.offscreen.img; + bind.samplers[shaders.SMP_smp] = state.offscreen.smp; break :init bind; }); sg.draw(0, 4, 1); diff --git a/emus/host/shaders.glsl b/emus/host/shaders.glsl index 8f4c21b..c93aa2c 100644 --- a/emus/host/shaders.glsl +++ b/emus/host/shaders.glsl @@ -2,7 +2,7 @@ layout(location=0) in vec2 in_pos; layout(location=1) in vec2 in_uv; -uniform offscreen_vs_params { +layout(binding=0) uniform offscreen_vs_params { vec2 uv_offset; vec2 uv_scale; }; @@ -15,8 +15,8 @@ void main() { @end @fs offscreen_fs -uniform texture2D fb_tex; -uniform sampler smp; +layout(binding=0) uniform texture2D fb_tex; +layout(binding=0) uniform sampler smp; in vec2 uv; out vec4 frag_color; void main() { @@ -26,9 +26,9 @@ void main() { // offscreen shader with color palette decoding @fs offscreen_pal_fs -uniform texture2D fb_tex; -uniform texture2D pal_tex; -uniform sampler smp; +layout(binding=0) uniform texture2D fb_tex; +layout(binding=1) uniform texture2D pal_tex; +layout(binding=0) uniform sampler smp; in vec2 uv; out vec4 frag_color; void main() { @@ -48,8 +48,8 @@ void main() { @end @fs display_fs -uniform texture2D tex; -uniform sampler smp; +layout(binding=0) uniform texture2D tex; +layout(binding=0) uniform sampler smp; in vec2 uv; out vec4 frag_color; diff --git a/emus/host/shaders.zig b/emus/host/shaders.zig index 4b97523..199d9d9 100644 --- a/emus/host/shaders.zig +++ b/emus/host/shaders.zig @@ -1,4 +1,5 @@ const sg = @import("sokol").gfx; +const std = @import("std"); // // #version:1# (machine generated, don't edit!) // @@ -11,82 +12,68 @@ const sg = @import("sokol").gfx; // ========= // Shader program: 'display': // Get shader desc: shd.displayShaderDesc(sg.queryBackend()); -// Vertex shader: display_vs -// Attributes: -// ATTR_display_vs_in_pos => 0 -// ATTR_display_vs_in_uv => 1 -// Fragment shader: display_fs -// Image 'tex': -// Image type: ._2D -// Sample type: .FLOAT -// Multisampled: false -// Bind slot: SLOT_tex => 0 -// Sampler 'smp': -// Type: .FILTERING -// Bind slot: SLOT_smp => 0 -// Image Sampler Pair 'tex_smp': -// Image: tex -// Sampler: smp +// Vertex Shader: display_vs +// Fragment Shader: display_fs +// Attributes: +// ATTR_display_in_pos => 0 +// ATTR_display_in_uv => 1 // Shader program: 'offscreen': // Get shader desc: shd.offscreenShaderDesc(sg.queryBackend()); -// Vertex shader: offscreen_vs -// Attributes: -// ATTR_offscreen_vs_in_pos => 0 -// ATTR_offscreen_vs_in_uv => 1 -// Uniform block 'offscreen_vs_params': -// Zig struct: OffscreenVsParams -// Bind slot: SLOT_offscreen_vs_params => 0 -// Fragment shader: offscreen_fs -// Image 'fb_tex': -// Image type: ._2D -// Sample type: .FLOAT -// Multisampled: false -// Bind slot: SLOT_fb_tex => 0 -// Sampler 'smp': -// Type: .FILTERING -// Bind slot: SLOT_smp => 0 -// Image Sampler Pair 'fb_tex_smp': -// Image: fb_tex -// Sampler: smp +// Vertex Shader: offscreen_vs +// Fragment Shader: offscreen_fs +// Attributes: +// ATTR_offscreen_in_pos => 0 +// ATTR_offscreen_in_uv => 1 // Shader program: 'offscreen_pal': // Get shader desc: shd.offscreenPalShaderDesc(sg.queryBackend()); -// Vertex shader: offscreen_vs -// Attributes: -// ATTR_offscreen_vs_in_pos => 0 -// ATTR_offscreen_vs_in_uv => 1 -// Uniform block 'offscreen_vs_params': -// Zig struct: OffscreenVsParams -// Bind slot: SLOT_offscreen_vs_params => 0 -// Fragment shader: offscreen_pal_fs -// Image 'fb_tex': -// Image type: ._2D -// Sample type: .FLOAT -// Multisampled: false -// Bind slot: SLOT_fb_tex => 0 -// Image 'pal_tex': -// Image type: ._2D -// Sample type: .FLOAT -// Multisampled: false -// Bind slot: SLOT_pal_tex => 1 -// Sampler 'smp': -// Type: .FILTERING -// Bind slot: SLOT_smp => 0 -// Image Sampler Pair 'fb_tex_smp': -// Image: fb_tex -// Sampler: smp -// Image Sampler Pair 'pal_tex_smp': -// Image: pal_tex -// Sampler: smp -// -pub const ATTR_display_vs_in_pos = 0; -pub const ATTR_display_vs_in_uv = 1; -pub const ATTR_offscreen_vs_in_pos = 0; -pub const ATTR_offscreen_vs_in_uv = 1; -pub const SLOT_offscreen_vs_params = 0; -pub const SLOT_fb_tex = 0; -pub const SLOT_pal_tex = 1; -pub const SLOT_tex = 0; -pub const SLOT_smp = 0; +// Vertex Shader: offscreen_vs +// Fragment Shader: offscreen_pal_fs +// Attributes: +// ATTR_offscreen_pal_in_pos => 0 +// ATTR_offscreen_pal_in_uv => 1 +// Bindings: +// Uniform block 'offscreen_vs_params': +// Zig struct: OffscreenVsParams +// Bind slot: UB_offscreen_vs_params => 0 +// Image 'tex': +// Image type: ._2D +// Sample type: .FLOAT +// Multisampled: false +// Bind slot: IMG_tex => 0 +// Image 'fb_tex': +// Image type: ._2D +// Sample type: .FLOAT +// Multisampled: false +// Bind slot: IMG_fb_tex => 0 +// Image 'pal_tex': +// Image type: ._2D +// Sample type: .FLOAT +// Multisampled: false +// Bind slot: IMG_pal_tex => 1 +// Sampler 'smp': +// Type: .FILTERING +// Bind slot: SMP_smp => 0 +// Image Sampler Pair 'tex_smp': +// Image: tex +// Sampler: smp +// Image Sampler Pair 'fb_tex_smp': +// Image: fb_tex +// Sampler: smp +// Image Sampler Pair 'pal_tex_smp': +// Image: pal_tex +// Sampler: smp +// +pub const ATTR_display_in_pos = 0; +pub const ATTR_display_in_uv = 1; +pub const ATTR_offscreen_in_pos = 0; +pub const ATTR_offscreen_in_uv = 1; +pub const ATTR_offscreen_pal_in_pos = 0; +pub const ATTR_offscreen_pal_in_uv = 1; +pub const UB_offscreen_vs_params = 0; +pub const IMG_tex = 0; +pub const IMG_fb_tex = 0; +pub const IMG_pal_tex = 1; +pub const SMP_smp = 0; pub const OffscreenVsParams = extern struct { uv_offset: [2]f32 align(16), uv_scale: [2]f32 align(1), @@ -1092,76 +1079,80 @@ pub fn displayShaderDesc(backend: sg.Backend) sg.ShaderDesc { desc.label = "display_shader"; switch (backend) { .GLCORE => { - desc.attrs[0].name = "in_pos"; - desc.attrs[1].name = "in_uv"; - desc.vs.source = &display_vs_source_glsl410; - desc.vs.entry = "main"; - desc.fs.source = &display_fs_source_glsl410; - desc.fs.entry = "main"; - desc.fs.images[0].used = true; - desc.fs.images[0].multisampled = false; - desc.fs.images[0].image_type = ._2D; - desc.fs.images[0].sample_type = .FLOAT; - desc.fs.samplers[0].used = true; - desc.fs.samplers[0].sampler_type = .FILTERING; - desc.fs.image_sampler_pairs[0].used = true; - desc.fs.image_sampler_pairs[0].image_slot = 0; - desc.fs.image_sampler_pairs[0].sampler_slot = 0; - desc.fs.image_sampler_pairs[0].glsl_name = "tex_smp"; + desc.vertex_func.source = &display_vs_source_glsl410; + desc.vertex_func.entry = "main"; + desc.fragment_func.source = &display_fs_source_glsl410; + desc.fragment_func.entry = "main"; + desc.attrs[0].glsl_name = "in_pos"; + desc.attrs[1].glsl_name = "in_uv"; + desc.images[0].stage = .FRAGMENT; + desc.images[0].multisampled = false; + desc.images[0].image_type = ._2D; + desc.images[0].sample_type = .FLOAT; + desc.samplers[0].stage = .FRAGMENT; + desc.samplers[0].sampler_type = .FILTERING; + desc.image_sampler_pairs[0].stage = .FRAGMENT; + desc.image_sampler_pairs[0].image_slot = 0; + desc.image_sampler_pairs[0].sampler_slot = 0; + desc.image_sampler_pairs[0].glsl_name = "tex_smp"; }, .GLES3 => { - desc.attrs[0].name = "in_pos"; - desc.attrs[1].name = "in_uv"; - desc.vs.source = &display_vs_source_glsl300es; - desc.vs.entry = "main"; - desc.fs.source = &display_fs_source_glsl300es; - desc.fs.entry = "main"; - desc.fs.images[0].used = true; - desc.fs.images[0].multisampled = false; - desc.fs.images[0].image_type = ._2D; - desc.fs.images[0].sample_type = .FLOAT; - desc.fs.samplers[0].used = true; - desc.fs.samplers[0].sampler_type = .FILTERING; - desc.fs.image_sampler_pairs[0].used = true; - desc.fs.image_sampler_pairs[0].image_slot = 0; - desc.fs.image_sampler_pairs[0].sampler_slot = 0; - desc.fs.image_sampler_pairs[0].glsl_name = "tex_smp"; + desc.vertex_func.source = &display_vs_source_glsl300es; + desc.vertex_func.entry = "main"; + desc.fragment_func.source = &display_fs_source_glsl300es; + desc.fragment_func.entry = "main"; + desc.attrs[0].glsl_name = "in_pos"; + desc.attrs[1].glsl_name = "in_uv"; + desc.images[0].stage = .FRAGMENT; + desc.images[0].multisampled = false; + desc.images[0].image_type = ._2D; + desc.images[0].sample_type = .FLOAT; + desc.samplers[0].stage = .FRAGMENT; + desc.samplers[0].sampler_type = .FILTERING; + desc.image_sampler_pairs[0].stage = .FRAGMENT; + desc.image_sampler_pairs[0].image_slot = 0; + desc.image_sampler_pairs[0].sampler_slot = 0; + desc.image_sampler_pairs[0].glsl_name = "tex_smp"; }, .D3D11 => { - desc.attrs[0].sem_name = "TEXCOORD"; - desc.attrs[0].sem_index = 0; - desc.attrs[1].sem_name = "TEXCOORD"; - desc.attrs[1].sem_index = 1; - desc.vs.source = &display_vs_source_hlsl4; - desc.vs.d3d11_target = "vs_4_0"; - desc.vs.entry = "main"; - desc.fs.source = &display_fs_source_hlsl4; - desc.fs.d3d11_target = "ps_4_0"; - desc.fs.entry = "main"; - desc.fs.images[0].used = true; - desc.fs.images[0].multisampled = false; - desc.fs.images[0].image_type = ._2D; - desc.fs.images[0].sample_type = .FLOAT; - desc.fs.samplers[0].used = true; - desc.fs.samplers[0].sampler_type = .FILTERING; - desc.fs.image_sampler_pairs[0].used = true; - desc.fs.image_sampler_pairs[0].image_slot = 0; - desc.fs.image_sampler_pairs[0].sampler_slot = 0; + desc.vertex_func.source = &display_vs_source_hlsl4; + desc.vertex_func.d3d11_target = "vs_4_0"; + desc.vertex_func.entry = "main"; + desc.fragment_func.source = &display_fs_source_hlsl4; + desc.fragment_func.d3d11_target = "ps_4_0"; + desc.fragment_func.entry = "main"; + desc.attrs[0].hlsl_sem_name = "TEXCOORD"; + desc.attrs[0].hlsl_sem_index = 0; + desc.attrs[1].hlsl_sem_name = "TEXCOORD"; + desc.attrs[1].hlsl_sem_index = 1; + desc.images[0].stage = .FRAGMENT; + desc.images[0].multisampled = false; + desc.images[0].image_type = ._2D; + desc.images[0].sample_type = .FLOAT; + desc.images[0].hlsl_register_t_n = 0; + desc.samplers[0].stage = .FRAGMENT; + desc.samplers[0].sampler_type = .FILTERING; + desc.samplers[0].hlsl_register_s_n = 0; + desc.image_sampler_pairs[0].stage = .FRAGMENT; + desc.image_sampler_pairs[0].image_slot = 0; + desc.image_sampler_pairs[0].sampler_slot = 0; }, .METAL_MACOS => { - desc.vs.source = &display_vs_source_metal_macos; - desc.vs.entry = "main0"; - desc.fs.source = &display_fs_source_metal_macos; - desc.fs.entry = "main0"; - desc.fs.images[0].used = true; - desc.fs.images[0].multisampled = false; - desc.fs.images[0].image_type = ._2D; - desc.fs.images[0].sample_type = .FLOAT; - desc.fs.samplers[0].used = true; - desc.fs.samplers[0].sampler_type = .FILTERING; - desc.fs.image_sampler_pairs[0].used = true; - desc.fs.image_sampler_pairs[0].image_slot = 0; - desc.fs.image_sampler_pairs[0].sampler_slot = 0; + desc.vertex_func.source = &display_vs_source_metal_macos; + desc.vertex_func.entry = "main0"; + desc.fragment_func.source = &display_fs_source_metal_macos; + desc.fragment_func.entry = "main0"; + desc.images[0].stage = .FRAGMENT; + desc.images[0].multisampled = false; + desc.images[0].image_type = ._2D; + desc.images[0].sample_type = .FLOAT; + desc.images[0].msl_texture_n = 0; + desc.samplers[0].stage = .FRAGMENT; + desc.samplers[0].sampler_type = .FILTERING; + desc.samplers[0].msl_sampler_n = 0; + desc.image_sampler_pairs[0].stage = .FRAGMENT; + desc.image_sampler_pairs[0].image_slot = 0; + desc.image_sampler_pairs[0].sampler_slot = 0; }, else => {}, } @@ -1172,90 +1163,100 @@ pub fn offscreenShaderDesc(backend: sg.Backend) sg.ShaderDesc { desc.label = "offscreen_shader"; switch (backend) { .GLCORE => { - desc.attrs[0].name = "in_pos"; - desc.attrs[1].name = "in_uv"; - desc.vs.source = &offscreen_vs_source_glsl410; - desc.vs.entry = "main"; - desc.vs.uniform_blocks[0].size = 16; - desc.vs.uniform_blocks[0].layout = .STD140; - desc.vs.uniform_blocks[0].uniforms[0].name = "offscreen_vs_params"; - desc.vs.uniform_blocks[0].uniforms[0].type = .FLOAT4; - desc.vs.uniform_blocks[0].uniforms[0].array_count = 1; - desc.fs.source = &offscreen_fs_source_glsl410; - desc.fs.entry = "main"; - desc.fs.images[0].used = true; - desc.fs.images[0].multisampled = false; - desc.fs.images[0].image_type = ._2D; - desc.fs.images[0].sample_type = .FLOAT; - desc.fs.samplers[0].used = true; - desc.fs.samplers[0].sampler_type = .FILTERING; - desc.fs.image_sampler_pairs[0].used = true; - desc.fs.image_sampler_pairs[0].image_slot = 0; - desc.fs.image_sampler_pairs[0].sampler_slot = 0; - desc.fs.image_sampler_pairs[0].glsl_name = "fb_tex_smp"; + desc.vertex_func.source = &offscreen_vs_source_glsl410; + desc.vertex_func.entry = "main"; + desc.fragment_func.source = &offscreen_fs_source_glsl410; + desc.fragment_func.entry = "main"; + desc.attrs[0].glsl_name = "in_pos"; + desc.attrs[1].glsl_name = "in_uv"; + desc.uniform_blocks[0].stage = .VERTEX; + desc.uniform_blocks[0].layout = .STD140; + desc.uniform_blocks[0].size = 16; + desc.uniform_blocks[0].glsl_uniforms[0].type = .FLOAT4; + desc.uniform_blocks[0].glsl_uniforms[0].array_count = 1; + desc.uniform_blocks[0].glsl_uniforms[0].glsl_name = "offscreen_vs_params"; + desc.images[0].stage = .FRAGMENT; + desc.images[0].multisampled = false; + desc.images[0].image_type = ._2D; + desc.images[0].sample_type = .FLOAT; + desc.samplers[0].stage = .FRAGMENT; + desc.samplers[0].sampler_type = .FILTERING; + desc.image_sampler_pairs[0].stage = .FRAGMENT; + desc.image_sampler_pairs[0].image_slot = 0; + desc.image_sampler_pairs[0].sampler_slot = 0; + desc.image_sampler_pairs[0].glsl_name = "fb_tex_smp"; }, .GLES3 => { - desc.attrs[0].name = "in_pos"; - desc.attrs[1].name = "in_uv"; - desc.vs.source = &offscreen_vs_source_glsl300es; - desc.vs.entry = "main"; - desc.vs.uniform_blocks[0].size = 16; - desc.vs.uniform_blocks[0].layout = .STD140; - desc.vs.uniform_blocks[0].uniforms[0].name = "offscreen_vs_params"; - desc.vs.uniform_blocks[0].uniforms[0].type = .FLOAT4; - desc.vs.uniform_blocks[0].uniforms[0].array_count = 1; - desc.fs.source = &offscreen_fs_source_glsl300es; - desc.fs.entry = "main"; - desc.fs.images[0].used = true; - desc.fs.images[0].multisampled = false; - desc.fs.images[0].image_type = ._2D; - desc.fs.images[0].sample_type = .FLOAT; - desc.fs.samplers[0].used = true; - desc.fs.samplers[0].sampler_type = .FILTERING; - desc.fs.image_sampler_pairs[0].used = true; - desc.fs.image_sampler_pairs[0].image_slot = 0; - desc.fs.image_sampler_pairs[0].sampler_slot = 0; - desc.fs.image_sampler_pairs[0].glsl_name = "fb_tex_smp"; + desc.vertex_func.source = &offscreen_vs_source_glsl300es; + desc.vertex_func.entry = "main"; + desc.fragment_func.source = &offscreen_fs_source_glsl300es; + desc.fragment_func.entry = "main"; + desc.attrs[0].glsl_name = "in_pos"; + desc.attrs[1].glsl_name = "in_uv"; + desc.uniform_blocks[0].stage = .VERTEX; + desc.uniform_blocks[0].layout = .STD140; + desc.uniform_blocks[0].size = 16; + desc.uniform_blocks[0].glsl_uniforms[0].type = .FLOAT4; + desc.uniform_blocks[0].glsl_uniforms[0].array_count = 1; + desc.uniform_blocks[0].glsl_uniforms[0].glsl_name = "offscreen_vs_params"; + desc.images[0].stage = .FRAGMENT; + desc.images[0].multisampled = false; + desc.images[0].image_type = ._2D; + desc.images[0].sample_type = .FLOAT; + desc.samplers[0].stage = .FRAGMENT; + desc.samplers[0].sampler_type = .FILTERING; + desc.image_sampler_pairs[0].stage = .FRAGMENT; + desc.image_sampler_pairs[0].image_slot = 0; + desc.image_sampler_pairs[0].sampler_slot = 0; + desc.image_sampler_pairs[0].glsl_name = "fb_tex_smp"; }, .D3D11 => { - desc.attrs[0].sem_name = "TEXCOORD"; - desc.attrs[0].sem_index = 0; - desc.attrs[1].sem_name = "TEXCOORD"; - desc.attrs[1].sem_index = 1; - desc.vs.source = &offscreen_vs_source_hlsl4; - desc.vs.d3d11_target = "vs_4_0"; - desc.vs.entry = "main"; - desc.vs.uniform_blocks[0].size = 16; - desc.vs.uniform_blocks[0].layout = .STD140; - desc.fs.source = &offscreen_fs_source_hlsl4; - desc.fs.d3d11_target = "ps_4_0"; - desc.fs.entry = "main"; - desc.fs.images[0].used = true; - desc.fs.images[0].multisampled = false; - desc.fs.images[0].image_type = ._2D; - desc.fs.images[0].sample_type = .FLOAT; - desc.fs.samplers[0].used = true; - desc.fs.samplers[0].sampler_type = .FILTERING; - desc.fs.image_sampler_pairs[0].used = true; - desc.fs.image_sampler_pairs[0].image_slot = 0; - desc.fs.image_sampler_pairs[0].sampler_slot = 0; + desc.vertex_func.source = &offscreen_vs_source_hlsl4; + desc.vertex_func.d3d11_target = "vs_4_0"; + desc.vertex_func.entry = "main"; + desc.fragment_func.source = &offscreen_fs_source_hlsl4; + desc.fragment_func.d3d11_target = "ps_4_0"; + desc.fragment_func.entry = "main"; + desc.attrs[0].hlsl_sem_name = "TEXCOORD"; + desc.attrs[0].hlsl_sem_index = 0; + desc.attrs[1].hlsl_sem_name = "TEXCOORD"; + desc.attrs[1].hlsl_sem_index = 1; + desc.uniform_blocks[0].stage = .VERTEX; + desc.uniform_blocks[0].layout = .STD140; + desc.uniform_blocks[0].size = 16; + desc.uniform_blocks[0].hlsl_register_b_n = 0; + desc.images[0].stage = .FRAGMENT; + desc.images[0].multisampled = false; + desc.images[0].image_type = ._2D; + desc.images[0].sample_type = .FLOAT; + desc.images[0].hlsl_register_t_n = 0; + desc.samplers[0].stage = .FRAGMENT; + desc.samplers[0].sampler_type = .FILTERING; + desc.samplers[0].hlsl_register_s_n = 0; + desc.image_sampler_pairs[0].stage = .FRAGMENT; + desc.image_sampler_pairs[0].image_slot = 0; + desc.image_sampler_pairs[0].sampler_slot = 0; }, .METAL_MACOS => { - desc.vs.source = &offscreen_vs_source_metal_macos; - desc.vs.entry = "main0"; - desc.vs.uniform_blocks[0].size = 16; - desc.vs.uniform_blocks[0].layout = .STD140; - desc.fs.source = &offscreen_fs_source_metal_macos; - desc.fs.entry = "main0"; - desc.fs.images[0].used = true; - desc.fs.images[0].multisampled = false; - desc.fs.images[0].image_type = ._2D; - desc.fs.images[0].sample_type = .FLOAT; - desc.fs.samplers[0].used = true; - desc.fs.samplers[0].sampler_type = .FILTERING; - desc.fs.image_sampler_pairs[0].used = true; - desc.fs.image_sampler_pairs[0].image_slot = 0; - desc.fs.image_sampler_pairs[0].sampler_slot = 0; + desc.vertex_func.source = &offscreen_vs_source_metal_macos; + desc.vertex_func.entry = "main0"; + desc.fragment_func.source = &offscreen_fs_source_metal_macos; + desc.fragment_func.entry = "main0"; + desc.uniform_blocks[0].stage = .VERTEX; + desc.uniform_blocks[0].layout = .STD140; + desc.uniform_blocks[0].size = 16; + desc.uniform_blocks[0].msl_buffer_n = 0; + desc.images[0].stage = .FRAGMENT; + desc.images[0].multisampled = false; + desc.images[0].image_type = ._2D; + desc.images[0].sample_type = .FLOAT; + desc.images[0].msl_texture_n = 0; + desc.samplers[0].stage = .FRAGMENT; + desc.samplers[0].sampler_type = .FILTERING; + desc.samplers[0].msl_sampler_n = 0; + desc.image_sampler_pairs[0].stage = .FRAGMENT; + desc.image_sampler_pairs[0].image_slot = 0; + desc.image_sampler_pairs[0].sampler_slot = 0; }, else => {}, } @@ -1266,120 +1267,132 @@ pub fn offscreenPalShaderDesc(backend: sg.Backend) sg.ShaderDesc { desc.label = "offscreen_pal_shader"; switch (backend) { .GLCORE => { - desc.attrs[0].name = "in_pos"; - desc.attrs[1].name = "in_uv"; - desc.vs.source = &offscreen_vs_source_glsl410; - desc.vs.entry = "main"; - desc.vs.uniform_blocks[0].size = 16; - desc.vs.uniform_blocks[0].layout = .STD140; - desc.vs.uniform_blocks[0].uniforms[0].name = "offscreen_vs_params"; - desc.vs.uniform_blocks[0].uniforms[0].type = .FLOAT4; - desc.vs.uniform_blocks[0].uniforms[0].array_count = 1; - desc.fs.source = &offscreen_pal_fs_source_glsl410; - desc.fs.entry = "main"; - desc.fs.images[0].used = true; - desc.fs.images[0].multisampled = false; - desc.fs.images[0].image_type = ._2D; - desc.fs.images[0].sample_type = .FLOAT; - desc.fs.images[1].used = true; - desc.fs.images[1].multisampled = false; - desc.fs.images[1].image_type = ._2D; - desc.fs.images[1].sample_type = .FLOAT; - desc.fs.samplers[0].used = true; - desc.fs.samplers[0].sampler_type = .FILTERING; - desc.fs.image_sampler_pairs[0].used = true; - desc.fs.image_sampler_pairs[0].image_slot = 0; - desc.fs.image_sampler_pairs[0].sampler_slot = 0; - desc.fs.image_sampler_pairs[0].glsl_name = "fb_tex_smp"; - desc.fs.image_sampler_pairs[1].used = true; - desc.fs.image_sampler_pairs[1].image_slot = 1; - desc.fs.image_sampler_pairs[1].sampler_slot = 0; - desc.fs.image_sampler_pairs[1].glsl_name = "pal_tex_smp"; + desc.vertex_func.source = &offscreen_vs_source_glsl410; + desc.vertex_func.entry = "main"; + desc.fragment_func.source = &offscreen_pal_fs_source_glsl410; + desc.fragment_func.entry = "main"; + desc.attrs[0].glsl_name = "in_pos"; + desc.attrs[1].glsl_name = "in_uv"; + desc.uniform_blocks[0].stage = .VERTEX; + desc.uniform_blocks[0].layout = .STD140; + desc.uniform_blocks[0].size = 16; + desc.uniform_blocks[0].glsl_uniforms[0].type = .FLOAT4; + desc.uniform_blocks[0].glsl_uniforms[0].array_count = 1; + desc.uniform_blocks[0].glsl_uniforms[0].glsl_name = "offscreen_vs_params"; + desc.images[0].stage = .FRAGMENT; + desc.images[0].multisampled = false; + desc.images[0].image_type = ._2D; + desc.images[0].sample_type = .FLOAT; + desc.images[1].stage = .FRAGMENT; + desc.images[1].multisampled = false; + desc.images[1].image_type = ._2D; + desc.images[1].sample_type = .FLOAT; + desc.samplers[0].stage = .FRAGMENT; + desc.samplers[0].sampler_type = .FILTERING; + desc.image_sampler_pairs[0].stage = .FRAGMENT; + desc.image_sampler_pairs[0].image_slot = 0; + desc.image_sampler_pairs[0].sampler_slot = 0; + desc.image_sampler_pairs[0].glsl_name = "fb_tex_smp"; + desc.image_sampler_pairs[1].stage = .FRAGMENT; + desc.image_sampler_pairs[1].image_slot = 1; + desc.image_sampler_pairs[1].sampler_slot = 0; + desc.image_sampler_pairs[1].glsl_name = "pal_tex_smp"; }, .GLES3 => { - desc.attrs[0].name = "in_pos"; - desc.attrs[1].name = "in_uv"; - desc.vs.source = &offscreen_vs_source_glsl300es; - desc.vs.entry = "main"; - desc.vs.uniform_blocks[0].size = 16; - desc.vs.uniform_blocks[0].layout = .STD140; - desc.vs.uniform_blocks[0].uniforms[0].name = "offscreen_vs_params"; - desc.vs.uniform_blocks[0].uniforms[0].type = .FLOAT4; - desc.vs.uniform_blocks[0].uniforms[0].array_count = 1; - desc.fs.source = &offscreen_pal_fs_source_glsl300es; - desc.fs.entry = "main"; - desc.fs.images[0].used = true; - desc.fs.images[0].multisampled = false; - desc.fs.images[0].image_type = ._2D; - desc.fs.images[0].sample_type = .FLOAT; - desc.fs.images[1].used = true; - desc.fs.images[1].multisampled = false; - desc.fs.images[1].image_type = ._2D; - desc.fs.images[1].sample_type = .FLOAT; - desc.fs.samplers[0].used = true; - desc.fs.samplers[0].sampler_type = .FILTERING; - desc.fs.image_sampler_pairs[0].used = true; - desc.fs.image_sampler_pairs[0].image_slot = 0; - desc.fs.image_sampler_pairs[0].sampler_slot = 0; - desc.fs.image_sampler_pairs[0].glsl_name = "fb_tex_smp"; - desc.fs.image_sampler_pairs[1].used = true; - desc.fs.image_sampler_pairs[1].image_slot = 1; - desc.fs.image_sampler_pairs[1].sampler_slot = 0; - desc.fs.image_sampler_pairs[1].glsl_name = "pal_tex_smp"; + desc.vertex_func.source = &offscreen_vs_source_glsl300es; + desc.vertex_func.entry = "main"; + desc.fragment_func.source = &offscreen_pal_fs_source_glsl300es; + desc.fragment_func.entry = "main"; + desc.attrs[0].glsl_name = "in_pos"; + desc.attrs[1].glsl_name = "in_uv"; + desc.uniform_blocks[0].stage = .VERTEX; + desc.uniform_blocks[0].layout = .STD140; + desc.uniform_blocks[0].size = 16; + desc.uniform_blocks[0].glsl_uniforms[0].type = .FLOAT4; + desc.uniform_blocks[0].glsl_uniforms[0].array_count = 1; + desc.uniform_blocks[0].glsl_uniforms[0].glsl_name = "offscreen_vs_params"; + desc.images[0].stage = .FRAGMENT; + desc.images[0].multisampled = false; + desc.images[0].image_type = ._2D; + desc.images[0].sample_type = .FLOAT; + desc.images[1].stage = .FRAGMENT; + desc.images[1].multisampled = false; + desc.images[1].image_type = ._2D; + desc.images[1].sample_type = .FLOAT; + desc.samplers[0].stage = .FRAGMENT; + desc.samplers[0].sampler_type = .FILTERING; + desc.image_sampler_pairs[0].stage = .FRAGMENT; + desc.image_sampler_pairs[0].image_slot = 0; + desc.image_sampler_pairs[0].sampler_slot = 0; + desc.image_sampler_pairs[0].glsl_name = "fb_tex_smp"; + desc.image_sampler_pairs[1].stage = .FRAGMENT; + desc.image_sampler_pairs[1].image_slot = 1; + desc.image_sampler_pairs[1].sampler_slot = 0; + desc.image_sampler_pairs[1].glsl_name = "pal_tex_smp"; }, .D3D11 => { - desc.attrs[0].sem_name = "TEXCOORD"; - desc.attrs[0].sem_index = 0; - desc.attrs[1].sem_name = "TEXCOORD"; - desc.attrs[1].sem_index = 1; - desc.vs.source = &offscreen_vs_source_hlsl4; - desc.vs.d3d11_target = "vs_4_0"; - desc.vs.entry = "main"; - desc.vs.uniform_blocks[0].size = 16; - desc.vs.uniform_blocks[0].layout = .STD140; - desc.fs.source = &offscreen_pal_fs_source_hlsl4; - desc.fs.d3d11_target = "ps_4_0"; - desc.fs.entry = "main"; - desc.fs.images[0].used = true; - desc.fs.images[0].multisampled = false; - desc.fs.images[0].image_type = ._2D; - desc.fs.images[0].sample_type = .FLOAT; - desc.fs.images[1].used = true; - desc.fs.images[1].multisampled = false; - desc.fs.images[1].image_type = ._2D; - desc.fs.images[1].sample_type = .FLOAT; - desc.fs.samplers[0].used = true; - desc.fs.samplers[0].sampler_type = .FILTERING; - desc.fs.image_sampler_pairs[0].used = true; - desc.fs.image_sampler_pairs[0].image_slot = 0; - desc.fs.image_sampler_pairs[0].sampler_slot = 0; - desc.fs.image_sampler_pairs[1].used = true; - desc.fs.image_sampler_pairs[1].image_slot = 1; - desc.fs.image_sampler_pairs[1].sampler_slot = 0; + desc.vertex_func.source = &offscreen_vs_source_hlsl4; + desc.vertex_func.d3d11_target = "vs_4_0"; + desc.vertex_func.entry = "main"; + desc.fragment_func.source = &offscreen_pal_fs_source_hlsl4; + desc.fragment_func.d3d11_target = "ps_4_0"; + desc.fragment_func.entry = "main"; + desc.attrs[0].hlsl_sem_name = "TEXCOORD"; + desc.attrs[0].hlsl_sem_index = 0; + desc.attrs[1].hlsl_sem_name = "TEXCOORD"; + desc.attrs[1].hlsl_sem_index = 1; + desc.uniform_blocks[0].stage = .VERTEX; + desc.uniform_blocks[0].layout = .STD140; + desc.uniform_blocks[0].size = 16; + desc.uniform_blocks[0].hlsl_register_b_n = 0; + desc.images[0].stage = .FRAGMENT; + desc.images[0].multisampled = false; + desc.images[0].image_type = ._2D; + desc.images[0].sample_type = .FLOAT; + desc.images[0].hlsl_register_t_n = 0; + desc.images[1].stage = .FRAGMENT; + desc.images[1].multisampled = false; + desc.images[1].image_type = ._2D; + desc.images[1].sample_type = .FLOAT; + desc.images[1].hlsl_register_t_n = 1; + desc.samplers[0].stage = .FRAGMENT; + desc.samplers[0].sampler_type = .FILTERING; + desc.samplers[0].hlsl_register_s_n = 0; + desc.image_sampler_pairs[0].stage = .FRAGMENT; + desc.image_sampler_pairs[0].image_slot = 0; + desc.image_sampler_pairs[0].sampler_slot = 0; + desc.image_sampler_pairs[1].stage = .FRAGMENT; + desc.image_sampler_pairs[1].image_slot = 1; + desc.image_sampler_pairs[1].sampler_slot = 0; }, .METAL_MACOS => { - desc.vs.source = &offscreen_vs_source_metal_macos; - desc.vs.entry = "main0"; - desc.vs.uniform_blocks[0].size = 16; - desc.vs.uniform_blocks[0].layout = .STD140; - desc.fs.source = &offscreen_pal_fs_source_metal_macos; - desc.fs.entry = "main0"; - desc.fs.images[0].used = true; - desc.fs.images[0].multisampled = false; - desc.fs.images[0].image_type = ._2D; - desc.fs.images[0].sample_type = .FLOAT; - desc.fs.images[1].used = true; - desc.fs.images[1].multisampled = false; - desc.fs.images[1].image_type = ._2D; - desc.fs.images[1].sample_type = .FLOAT; - desc.fs.samplers[0].used = true; - desc.fs.samplers[0].sampler_type = .FILTERING; - desc.fs.image_sampler_pairs[0].used = true; - desc.fs.image_sampler_pairs[0].image_slot = 0; - desc.fs.image_sampler_pairs[0].sampler_slot = 0; - desc.fs.image_sampler_pairs[1].used = true; - desc.fs.image_sampler_pairs[1].image_slot = 1; - desc.fs.image_sampler_pairs[1].sampler_slot = 0; + desc.vertex_func.source = &offscreen_vs_source_metal_macos; + desc.vertex_func.entry = "main0"; + desc.fragment_func.source = &offscreen_pal_fs_source_metal_macos; + desc.fragment_func.entry = "main0"; + desc.uniform_blocks[0].stage = .VERTEX; + desc.uniform_blocks[0].layout = .STD140; + desc.uniform_blocks[0].size = 16; + desc.uniform_blocks[0].msl_buffer_n = 0; + desc.images[0].stage = .FRAGMENT; + desc.images[0].multisampled = false; + desc.images[0].image_type = ._2D; + desc.images[0].sample_type = .FLOAT; + desc.images[0].msl_texture_n = 0; + desc.images[1].stage = .FRAGMENT; + desc.images[1].multisampled = false; + desc.images[1].image_type = ._2D; + desc.images[1].sample_type = .FLOAT; + desc.images[1].msl_texture_n = 1; + desc.samplers[0].stage = .FRAGMENT; + desc.samplers[0].sampler_type = .FILTERING; + desc.samplers[0].msl_sampler_n = 0; + desc.image_sampler_pairs[0].stage = .FRAGMENT; + desc.image_sampler_pairs[0].image_slot = 0; + desc.image_sampler_pairs[0].sampler_slot = 0; + desc.image_sampler_pairs[1].stage = .FRAGMENT; + desc.image_sampler_pairs[1].image_slot = 1; + desc.image_sampler_pairs[1].sampler_slot = 0; }, else => {}, }