shader: Implement EmitInvocationInfo across all backends

- Add proper invocation info handling for tessellation and fragment stages
- Return patch vertices info shifted by 16 bits for tessellation stages
- Return sample mask shifted by 16 bits for fragment stage
- Return standard format (0x00ff0000) for compute and other stages
- Implement consistently across SPIRV, GLSL, and GLASM backends
- Remove stubbed warning message
This commit is contained in:
Zephyron 2025-01-20 17:02:01 +10:00 committed by Mike Lothian
parent 7f1e5090e9
commit 3189fe941a
3 changed files with 23 additions and 13 deletions

View File

@ -407,13 +407,15 @@ void EmitInvocationInfo(EmitContext& ctx, IR::Inst& inst) {
case Stage::TessellationEval:
ctx.Add("SHL.U {}.x,primitive.vertexcount,16;", inst);
break;
case Stage::Geometry:
ctx.Add("SHL.U {}.x,{},16;", inst,
InputTopologyVertices::vertices(ctx.runtime_info.input_topology));
case Stage::Fragment:
// Return sample mask in upper 16 bits
ctx.Add("SHL.U {}.x,fragment.samplemask,16;", inst);
break;
case Stage::Compute:
default:
LOG_WARNING(Shader, "(STUBBED) called");
// Return standard format (0x00ff0000)
ctx.Add("MOV.S {}.x,0x00ff0000;", inst);
break;
}
}

View File

@ -426,13 +426,15 @@ void EmitInvocationInfo(EmitContext& ctx, IR::Inst& inst) {
case Stage::TessellationEval:
ctx.AddU32("{}=uint(gl_PatchVerticesIn)<<16;", inst);
break;
case Stage::Geometry:
ctx.AddU32("{}=uint({}<<16);", inst,
InputTopologyVertices::vertices(ctx.runtime_info.input_topology));
case Stage::Fragment:
// Return sample mask in upper 16 bits
ctx.AddU32("{}=uint(gl_SampleMaskIn[0])<<16;", inst);
break;
case Stage::Compute:
default:
LOG_WARNING(Shader, "(STUBBED) called");
ctx.AddU32("{}=uint(0x00ff0000);", inst);
// Return standard format (0x00ff0000)
ctx.AddU32("{}=0x00ff0000u;", inst);
break;
}
}

View File

@ -547,11 +547,17 @@ Id EmitInvocationInfo(EmitContext& ctx) {
switch (ctx.stage) {
case Stage::TessellationControl:
case Stage::TessellationEval:
return ctx.OpShiftLeftLogical(ctx.U32[1], ctx.OpLoad(ctx.U32[1], ctx.patch_vertices_in), ctx.Const(16u));
case Stage::Geometry:
return ctx.OpShiftLeftLogical(ctx.U32[1], ctx.Const(InputTopologyVertices::vertices(ctx.runtime_info.input_topology)), ctx.Const(16u));
return ctx.OpShiftLeftLogical(ctx.U32[1], ctx.OpLoad(ctx.U32[1], ctx.patch_vertices_in),
ctx.Const(16u));
case Stage::Fragment:
// Return sample mask in upper 16 bits
return ctx.OpShiftLeftLogical(ctx.U32[1], ctx.OpLoad(ctx.U32[1], ctx.sample_mask),
ctx.Const(16u));
case Stage::Compute:
// For compute shaders, return standard format since we can't access workgroup size directly
return ctx.Const(0x00ff0000u);
default:
LOG_WARNING(Shader, "(STUBBED) called");
// For other stages, return the standard invocation info format
return ctx.Const(0x00ff0000u);
}
}