diff options
Diffstat (limited to 'src/shader_recompiler/ir_opt/collect_shader_info_pass.cpp')
| -rw-r--r-- | src/shader_recompiler/ir_opt/collect_shader_info_pass.cpp | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/src/shader_recompiler/ir_opt/collect_shader_info_pass.cpp b/src/shader_recompiler/ir_opt/collect_shader_info_pass.cpp index 9010c2bf68..c212a25d37 100644 --- a/src/shader_recompiler/ir_opt/collect_shader_info_pass.cpp +++ b/src/shader_recompiler/ir_opt/collect_shader_info_pass.cpp @@ -963,10 +963,12 @@ void CollectShaderInfoPass(Environment& env, IR::Program& program) { switch (program.stage) { case Stage::VertexA: case Stage::VertexB: + case Stage::Task: // bound in the vertex slot return 0x110u; case Stage::TessellationControl: return 0x210u; case Stage::TessellationEval: + case Stage::Mesh: // bound in the tessellation slot return 0x310u; case Stage::Geometry: return 0x410u; @@ -978,6 +980,11 @@ void CollectShaderInfoPass(Environment& env, IR::Program& program) { throw InvalidArgument("Invalid stage {}", program.stage); }()}; info.nvn_buffer_base = base; + if (program.stage == Stage::Task || program.stage == Stage::Mesh) { + // The stage buffer reads the workgroup index; the epilogue splits work by invocation. + info.uses_workgroup_id = true; + info.uses_local_invocation_id = true; + } for (IR::Block* const block : program.post_order_blocks) { for (IR::Inst& inst : block->Instructions()) { |
