specify shader type in layer entry arguments

This commit is contained in:
jacob 2026-03-30 14:43:15 -05:00
parent 78f4677cdb
commit 5ef6a770cb
6 changed files with 110 additions and 92 deletions

View File

@ -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")
);

View File

@ -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)

View File

@ -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",
};

View File

@ -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

View File

@ -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

View File

@ -12,8 +12,8 @@
@EmbedDir UI_Resources ui_res
@VertexShader UI_DRectVS
@PixelShader UI_DRectPS
@Shader UI_DRectVS Vertex
@Shader UI_DRectPS Pixel
//////////////////////////////
//- Api