From 5ef6a770cbc8c037b9c29720a7992f133469205b Mon Sep 17 00:00:00 2001 From: jacob Date: Mon, 30 Mar 2026 14:43:15 -0500 Subject: [PATCH] specify shader type in layer entry arguments --- src/meta/meta.c | 143 ++++++++++++++++++++++----------------- src/meta/meta.h | 7 +- src/meta/meta_lay.h | 8 +-- src/pp/pp_vis/pp_vis.lay | 34 +++++----- src/proto/proto.lay | 6 +- src/ui/ui.lay | 4 +- 6 files changed, 110 insertions(+), 92 deletions(-) diff --git a/src/meta/meta.c b/src/meta/meta.c index 6356315d..bd7bd2a2 100644 --- a/src/meta/meta.c +++ b/src/meta/meta.c @@ -713,62 +713,105 @@ void M_BuildEntryPoint(WaveLaneCtx *lane) M_PushError(perm, &M.c_parse.errors, entry_tok, Lit("Expected resource store & directory name")); } } break; - case M_EntryKind_VertexShader: - case M_EntryKind_PixelShader: - case M_EntryKind_ComputeShader: + case M_EntryKind_Shader: { + String vs_pattern = Lit("Vertex"); + String ps_pattern = Lit("Pixel"); + b32 ok = 1; + M_Token *arg_err_tok = entry_tok; if (arg0_tok->valid) { + arg_err_tok = arg0_tok; String shader_name = arg0_tok->s; - Vec3U32 group_dims = Zi; - i32 group_dims_count = 1; + M_ShaderEntryKind shader_kind = M_ShaderEntryKind_Unknown; + i32 cs_rank = 0; + Vec3I32 cs_group_dims = Zi; + if (arg1_tok->valid) { - StringList thread_count_args = Zi; - for (i32 arg_idx = 1; arg_idx < countof(entry->arg_tokens); ++arg_idx) + arg_err_tok = arg1_tok; + String args_str = Zi; { - M_Token *arg_tok = entry->arg_tokens[arg_idx]; - if (arg_tok->valid) + StringList args_strlist = Zi; + for (i32 arg_idx = 1; arg_idx < countof(entry->arg_tokens); ++arg_idx) { - PushStringToList(perm, &thread_count_args, arg_tok->s); - } - else - { - break; + M_Token *arg_tok = entry->arg_tokens[arg_idx]; + if (arg_tok->valid) + { + PushStringToList(perm, &args_strlist, arg_tok->s); + } + else + { + break; + } } + args_str = StringFromList(perm, args_strlist, Lit(" ")); + cs_group_dims = Vec3I32FromVec(CR_Vec3FromString(args_str)); } - String group_dims_str = StringFromList(perm, thread_count_args, Lit(" ")); - Vec3 tmp = CR_Vec3FromString(group_dims_str); - group_dims.x = MaxI32(tmp.x, 1); - group_dims.y = MaxI32(tmp.y, 1); - group_dims.z = MaxI32(tmp.z, 1); - // Determine compute shader dimensions type by counting comma-separated values in group size string - for (u64 char_idx = 0; char_idx < group_dims_str.len; ++char_idx) + if (MatchString(args_str, vs_pattern)) { - u8 c = group_dims_str.text[char_idx]; - if (c == ',') - { - group_dims_count += 1; - } + shader_kind = M_ShaderEntryKind_Vs; + } + else if (MatchString(args_str, ps_pattern)) + { + shader_kind = M_ShaderEntryKind_Ps; + } + else + { + cs_rank += cs_group_dims.x > 0; + cs_rank += cs_group_dims.y > 0; + cs_rank += cs_group_dims.z > 0; + if (cs_rank > 0) + { + shader_kind = M_ShaderEntryKind_Cs; + } + cs_group_dims.x = MaxI32(cs_group_dims.x, 1); + cs_group_dims.y = MaxI32(cs_group_dims.y, 1); + cs_group_dims.z = MaxI32(cs_group_dims.z, 1); } - group_dims_count = ClampI32(group_dims_count, 1, 3); } + + if (shader_kind == M_ShaderEntryKind_Unknown) + { + ok = 0; + M_PushError( + perm, + &M.c_parse.errors, + arg_err_tok, + StringF( + perm, + "Expected shader description ('%F', '%F', or thread group dimensions)", + FmtString(vs_pattern), + FmtString(ps_pattern) + ) + ); + } + + if (ok) + { + M_ShaderEntry *e = PushStruct(perm, M_ShaderEntry); + e->kind = shader_kind; + e->name = shader_name; + SllQueuePush(M.gpu_parse.first_shader_entry, M.gpu_parse.last_shader_entry, e); + ++M.gpu_parse.shader_entries_count; + } + String decl_type = ( - kind == M_EntryKind_VertexShader ? Lit("DeclVertexShader") : - kind == M_EntryKind_PixelShader ? Lit("DeclPixelShader") : - kind == M_EntryKind_ComputeShader ? Lit("DeclComputeShader") : + shader_kind == M_ShaderEntryKind_Vs ? Lit("DeclVertexShader") : + shader_kind == M_ShaderEntryKind_Ps ? Lit("DeclPixelShader") : + shader_kind == M_ShaderEntryKind_Cs ? Lit("DeclComputeShader") : Lit("") ); u64 shader_resource_hash = HashStringEx(shader_store_hash, StringF(perm, "%F.dxil", FmtString(shader_name))); // Dims type line - if (kind == M_EntryKind_ComputeShader) + if (shader_kind == M_ShaderEntryKind_Cs) { String line = StringF( perm, "#define %F__ThreadDimsType %F", FmtString(shader_name), FmtString( - group_dims_count == 1 ? Lit("u32") : - group_dims_count == 2 ? Lit("Vec2U32") : + cs_rank == 1 ? Lit("u32") : + cs_rank == 2 ? Lit("Vec2U32") : Lit("Vec3U32") ) ); @@ -777,7 +820,7 @@ void M_BuildEntryPoint(WaveLaneCtx *lane) // Shader line { String line = Zi; - if (kind == M_EntryKind_ComputeShader) + if (shader_kind == M_ShaderEntryKind_Cs) { line = StringF( perm, @@ -785,9 +828,9 @@ void M_BuildEntryPoint(WaveLaneCtx *lane) FmtString(decl_type), FmtString(shader_name), FmtHex(shader_resource_hash), - FmtUint(group_dims.x), - FmtUint(group_dims.y), - FmtUint(group_dims.z) + FmtUint(cs_group_dims.x), + FmtUint(cs_group_dims.y), + FmtUint(cs_group_dims.z) ); } else @@ -982,28 +1025,6 @@ void M_BuildEntryPoint(WaveLaneCtx *lane) M_PushError(perm, &M.gpu_parse.errors, entry_tok, Lit("Expected file name")); } } break; - case M_EntryKind_VertexShader: - case M_EntryKind_PixelShader: - case M_EntryKind_ComputeShader: - { - if (arg0_tok->valid) - { - M_ShaderEntryKind shader_kind = kind == M_EntryKind_VertexShader ? ShaderEntryKind_VS - : kind == M_EntryKind_PixelShader ? ShaderEntryKind_PS - : kind == M_EntryKind_ComputeShader ? ShaderEntryKind_CS - : ShaderEntryKind_VS; - String shader_name = arg0_tok->s; - M_ShaderEntry *e = PushStruct(perm, M_ShaderEntry); - e->kind = shader_kind; - e->name = shader_name; - SllQueuePush(M.gpu_parse.first_shader_entry, M.gpu_parse.last_shader_entry, e); - ++M.gpu_parse.shader_entries_count; - } - else - { - M_PushError(perm, &M.gpu_parse.errors, entry_tok, Lit("Expected shader name")); - } - } break; } } } @@ -1190,8 +1211,8 @@ void M_BuildEntryPoint(WaveLaneCtx *lane) M_GpuObj *gpu_obj = &M.gpu_objs.array[gpu_obj_idx]; String out_file = StringF(perm, "%F/%F.dxil", FmtString(shader_store_name), FmtString(e->name)); String target = ( - e->kind == ShaderEntryKind_VS ? Lit("vs_6_6") : - e->kind == ShaderEntryKind_PS ? Lit("ps_6_6") : + e->kind == M_ShaderEntryKind_Vs ? Lit("vs_6_6") : + e->kind == M_ShaderEntryKind_Ps ? Lit("ps_6_6") : Lit("cs_6_6") ); diff --git a/src/meta/meta.h b/src/meta/meta.h index d9e36d24..5001c1bc 100644 --- a/src/meta/meta.h +++ b/src/meta/meta.h @@ -88,9 +88,10 @@ Struct(M_CompilerParams) Enum(M_ShaderEntryKind) { - ShaderEntryKind_VS, - ShaderEntryKind_PS, - ShaderEntryKind_CS, + M_ShaderEntryKind_Unknown, + M_ShaderEntryKind_Vs, + M_ShaderEntryKind_Ps, + M_ShaderEntryKind_Cs, }; Struct(M_ShaderEntry) diff --git a/src/meta/meta_lay.h b/src/meta/meta_lay.h index d66ee4af..56956d9e 100644 --- a/src/meta/meta_lay.h +++ b/src/meta/meta_lay.h @@ -78,9 +78,7 @@ Enum(M_EntryKind) M_EntryKind_IncludeG, M_EntryKind_DefaultDownstream, M_EntryKind_Bootstrap, - M_EntryKind_VertexShader, - M_EntryKind_PixelShader, - M_EntryKind_ComputeShader, + M_EntryKind_Shader, M_EntryKind_EmbedDir, }; @@ -91,9 +89,7 @@ Global Readonly char *M_entry_kind_rules[] = { [M_EntryKind_IncludeG] = "@IncludeG", [M_EntryKind_DefaultDownstream] = "@DefaultDownstream", [M_EntryKind_Bootstrap] = "@Bootstrap", - [M_EntryKind_VertexShader] = "@VertexShader", - [M_EntryKind_PixelShader] = "@PixelShader", - [M_EntryKind_ComputeShader] = "@ComputeShader", + [M_EntryKind_Shader] = "@Shader", [M_EntryKind_EmbedDir] = "@EmbedDir", }; diff --git a/src/pp/pp_vis/pp_vis.lay b/src/pp/pp_vis/pp_vis.lay index 7a3ae641..551d99cf 100644 --- a/src/pp/pp_vis/pp_vis.lay +++ b/src/pp/pp_vis/pp_vis.lay @@ -15,23 +15,23 @@ ////////////////////////////// //- Resources -@ComputeShader V_ProfilerGraphCS (128, 1) // Vertical group dims so that sample access is uniform -@ComputeShader V_PrepareShadeCS (16, 16) -@ComputeShader V_PrepareCellsCS (16, 16) -@ComputeShader V_BackdropDownCS (16, 16) -@ComputeShader V_BackdropUpCS (16, 16) -@ComputeShader V_ClearParticlesCS (256) -@VertexShader V_QuadVS -@PixelShader V_QuadPS -@ComputeShader V_EmitParticlesCS (256) -@ComputeShader V_SimParticlesCS (256) -@ComputeShader V_ShadeCS (16, 16) -@ComputeShader V_CompositeCS (16, 16) -@ComputeShader V_BloomDownCS (16, 16) -@ComputeShader V_BloomUpCS (16, 16) -@ComputeShader V_FinalizeCS (16, 16) -@VertexShader V_DVertVS -@PixelShader V_DVertPS +@Shader V_BuildProfilerGraphCS (1, 128) // Vertical group shape so that profiler-sample access is uniform +@Shader V_PrepareShadeCS (16, 16) +@Shader V_PrepareCellsCS (16, 16) +@Shader V_BackdropDownCS (16, 16) +@Shader V_BackdropUpCS (16, 16) +@Shader V_ClearParticlesCS (256) +@Shader V_QuadVS Vertex +@Shader V_QuadPS Pixel +@Shader V_EmitParticlesCS (256) +@Shader V_SimParticlesCS (256) +@Shader V_ShadeCS (16, 16) +@Shader V_CompositeCS (16, 16) +@Shader V_BloomDownCS (16, 16) +@Shader V_BloomUpCS (16, 16) +@Shader V_FinalizeCS (16, 16) +@Shader V_DVertVS Vertex +@Shader V_DVertPS Pixel ////////////////////////////// //- Api diff --git a/src/proto/proto.lay b/src/proto/proto.lay index 4a8f34a8..1840b550 100644 --- a/src/proto/proto.lay +++ b/src/proto/proto.lay @@ -9,9 +9,9 @@ ////////////////////////////// //- Resources -@ComputeShader PT_TestCS (8, 8) -@VertexShader PT_BlitVS -@PixelShader PT_BlitPS +@Shader PT_TestCS (8, 8) +@Shader PT_BlitVS Vertex +@Shader PT_BlitPS Pixel ////////////////////////////// //- Api diff --git a/src/ui/ui.lay b/src/ui/ui.lay index 8350a11c..74e07084 100644 --- a/src/ui/ui.lay +++ b/src/ui/ui.lay @@ -12,8 +12,8 @@ @EmbedDir UI_Resources ui_res -@VertexShader UI_DRectVS -@PixelShader UI_DRectPS +@Shader UI_DRectVS Vertex +@Shader UI_DRectPS Pixel ////////////////////////////// //- Api