specify shader type in layer entry arguments
This commit is contained in:
parent
78f4677cdb
commit
5ef6a770cb
143
src/meta/meta.c
143
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")
|
||||
);
|
||||
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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",
|
||||
};
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -12,8 +12,8 @@
|
||||
|
||||
@EmbedDir UI_Resources ui_res
|
||||
|
||||
@VertexShader UI_DRectVS
|
||||
@PixelShader UI_DRectPS
|
||||
@Shader UI_DRectVS Vertex
|
||||
@Shader UI_DRectPS Pixel
|
||||
|
||||
//////////////////////////////
|
||||
//- Api
|
||||
|
||||
Loading…
Reference in New Issue
Block a user