diff options
| author | Zephyron <zephyron@citron-emu.org> | 2025-01-20 17:02:01 +1000 | 
|---|---|---|
| committer | Zephyron <zephyron@citron-emu.org> | 2025-01-20 17:02:01 +1000 | 
| commit | 04f9d8b61a8cdc3192c1f4713580caa996f20b04 (patch) | |
| tree | 3a104a083e76346f402f42cfb74bb4a226098d9f | |
| parent | b574aba98b6714b9229a3b0fadf5aaf92851dd51 (diff) | |
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
3 files changed, 23 insertions, 4 deletions
diff --git a/src/shader_recompiler/backend/glasm/emit_glasm_context_get_set.cpp b/src/shader_recompiler/backend/glasm/emit_glasm_context_get_set.cpp index c7d7d5fef..8d2b9d569 100644 --- a/src/shader_recompiler/backend/glasm/emit_glasm_context_get_set.cpp +++ b/src/shader_recompiler/backend/glasm/emit_glasm_context_get_set.cpp @@ -406,9 +406,15 @@ void EmitInvocationInfo(EmitContext& ctx, IR::Inst& inst) {      case Stage::TessellationEval:          ctx.Add("SHL.U {}.x,primitive.vertexcount,16;", inst);          break; +    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;      }  } diff --git a/src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp b/src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp index 2e369ed72..fea325df9 100644 --- a/src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp +++ b/src/shader_recompiler/backend/glsl/emit_glsl_context_get_set.cpp @@ -426,9 +426,15 @@ void EmitInvocationInfo(EmitContext& ctx, IR::Inst& inst) {      case Stage::TessellationEval:          ctx.AddU32("{}=uint(gl_PatchVerticesIn)<<16;", inst);          break; +    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;      }  } diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp index feca5105f..64f828107 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp +++ b/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp @@ -549,8 +549,15 @@ Id EmitInvocationInfo(EmitContext& ctx) {      case Stage::TessellationEval:          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);      }  }  | 
