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 6820d4d985..e0e8942e48 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 @@ -425,6 +425,14 @@ void EmitIsHelperInvocation(EmitContext& ctx, IR::Inst& inst) { ctx.Add("MOV.S {}.x,fragment.helperthread.x;", inst); } +void EmitSR_WScaleFactorXY(EmitContext& ctx, IR::Inst& inst) { + LOG_WARNING(Shader, "(STUBBED) called"); +} + +void EmitSR_WScaleFactorZ(EmitContext& ctx, IR::Inst& inst) { + LOG_WARNING(Shader, "(STUBBED) called"); +} + void EmitYDirection(EmitContext& ctx, IR::Inst& inst) { ctx.uses_y_direction = true; ctx.Add("MOV.F {}.x,y_direction[0].w;", inst); diff --git a/src/shader_recompiler/backend/glasm/emit_glasm_instructions.h b/src/shader_recompiler/backend/glasm/emit_glasm_instructions.h index 1a1ea61d5e..c5d4835fa9 100644 --- a/src/shader_recompiler/backend/glasm/emit_glasm_instructions.h +++ b/src/shader_recompiler/backend/glasm/emit_glasm_instructions.h @@ -72,6 +72,8 @@ void EmitInvocationId(EmitContext& ctx, IR::Inst& inst); void EmitInvocationInfo(EmitContext& ctx, IR::Inst& inst); void EmitSampleId(EmitContext& ctx, IR::Inst& inst); void EmitIsHelperInvocation(EmitContext& ctx, IR::Inst& inst); +void EmitSR_WScaleFactorXY(EmitContext& ctx, IR::Inst& inst); +void EmitSR_WScaleFactorZ(EmitContext& ctx, IR::Inst& inst); void EmitYDirection(EmitContext& ctx, IR::Inst& inst); void EmitResolutionDownFactor(EmitContext& ctx, IR::Inst& inst); void EmitRenderArea(EmitContext& ctx, IR::Inst& inst); 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 f964c25507..ffe5cd116c 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 @@ -444,6 +444,14 @@ void EmitIsHelperInvocation(EmitContext& ctx, IR::Inst& inst) { ctx.AddU1("{}=gl_HelperInvocation;", inst); } +void EmitSR_WScaleFactorXY(EmitContext& ctx, IR::Inst& inst) { + LOG_WARNING(Shader, "(STUBBED) called"); +} + +void EmitSR_WScaleFactorZ(EmitContext& ctx, IR::Inst& inst) { + LOG_WARNING(Shader, "(STUBBED) called"); +} + void EmitYDirection(EmitContext& ctx, IR::Inst& inst) { ctx.uses_y_direction = true; ctx.AddF32("{}=gl_FrontMaterial.ambient.a;", inst); diff --git a/src/shader_recompiler/backend/glsl/emit_glsl_instructions.h b/src/shader_recompiler/backend/glsl/emit_glsl_instructions.h index acebaa7851..9e405b37fb 100644 --- a/src/shader_recompiler/backend/glsl/emit_glsl_instructions.h +++ b/src/shader_recompiler/backend/glsl/emit_glsl_instructions.h @@ -86,6 +86,8 @@ void EmitInvocationId(EmitContext& ctx, IR::Inst& inst); void EmitInvocationInfo(EmitContext& ctx, IR::Inst& inst); void EmitSampleId(EmitContext& ctx, IR::Inst& inst); void EmitIsHelperInvocation(EmitContext& ctx, IR::Inst& inst); +void EmitSR_WScaleFactorXY(EmitContext& ctx, IR::Inst& inst); +void EmitSR_WScaleFactorZ(EmitContext& ctx, IR::Inst& inst); void EmitYDirection(EmitContext& ctx, IR::Inst& inst); void EmitResolutionDownFactor(EmitContext& ctx, IR::Inst& inst); void EmitRenderArea(EmitContext& ctx, IR::Inst& inst); 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 2e7643fe9a..7a7eed4424 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 @@ -565,6 +565,16 @@ Id EmitIsHelperInvocation(EmitContext& ctx) { return ctx.OpLoad(ctx.U1, ctx.is_helper_invocation); } +Id EmitSR_WScaleFactorXY(EmitContext& ctx) { + LOG_WARNING(Shader, "(STUBBED) called"); + return ctx.Const(0x00ff0000u); +} + +Id EmitSR_WScaleFactorZ(EmitContext& ctx) { + LOG_WARNING(Shader, "(STUBBED) called"); + return ctx.Const(0x00ff0000u); +} + Id EmitYDirection(EmitContext& ctx) { return ctx.Const(ctx.runtime_info.y_negate ? -1.0f : 1.0f); } diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_instructions.h b/src/shader_recompiler/backend/spirv/emit_spirv_instructions.h index 5c01b10127..b8e98e6c58 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv_instructions.h +++ b/src/shader_recompiler/backend/spirv/emit_spirv_instructions.h @@ -75,6 +75,8 @@ Id EmitInvocationId(EmitContext& ctx); Id EmitInvocationInfo(EmitContext& ctx); Id EmitSampleId(EmitContext& ctx); Id EmitIsHelperInvocation(EmitContext& ctx); +Id EmitSR_WScaleFactorXY(EmitContext& ctx); +Id EmitSR_WScaleFactorZ(EmitContext& ctx); Id EmitYDirection(EmitContext& ctx); Id EmitResolutionDownFactor(EmitContext& ctx); Id EmitRenderArea(EmitContext& ctx); diff --git a/src/shader_recompiler/frontend/ir/ir_emitter.cpp b/src/shader_recompiler/frontend/ir/ir_emitter.cpp index 49171c470c..e1e46cb81c 100644 --- a/src/shader_recompiler/frontend/ir/ir_emitter.cpp +++ b/src/shader_recompiler/frontend/ir/ir_emitter.cpp @@ -382,6 +382,14 @@ U1 IREmitter::IsHelperInvocation() { return Inst(Opcode::IsHelperInvocation); } +U32 IREmitter::SR_WScaleFactorXY() { + return Inst(Opcode::SR_WScaleFactorXY); +} + +U32 IREmitter::SR_WScaleFactorZ() { + return Inst(Opcode::SR_WScaleFactorZ); +} + F32 IREmitter::YDirection() { return Inst(Opcode::YDirection); } diff --git a/src/shader_recompiler/frontend/ir/ir_emitter.h b/src/shader_recompiler/frontend/ir/ir_emitter.h index 6c30897f4e..073091ea58 100644 --- a/src/shader_recompiler/frontend/ir/ir_emitter.h +++ b/src/shader_recompiler/frontend/ir/ir_emitter.h @@ -102,6 +102,8 @@ public: [[nodiscard]] U32 InvocationInfo(); [[nodiscard]] U32 SampleId(); [[nodiscard]] U1 IsHelperInvocation(); + [[nodiscard]] U32 SR_WScaleFactorXY(); + [[nodiscard]] U32 SR_WScaleFactorZ(); [[nodiscard]] F32 YDirection(); [[nodiscard]] F32 ResolutionDownFactor(); diff --git a/src/shader_recompiler/frontend/ir/opcodes.inc b/src/shader_recompiler/frontend/ir/opcodes.inc index 4447d67b04..2f880a8596 100644 --- a/src/shader_recompiler/frontend/ir/opcodes.inc +++ b/src/shader_recompiler/frontend/ir/opcodes.inc @@ -62,6 +62,8 @@ OPCODE(InvocationId, U32, OPCODE(InvocationInfo, U32, ) OPCODE(SampleId, U32, ) OPCODE(IsHelperInvocation, U1, ) +OPCODE(SR_WScaleFactorXY, U32, ) +OPCODE(SR_WScaleFactorZ, U32, ) OPCODE(YDirection, F32, ) OPCODE(ResolutionDownFactor, F32, ) OPCODE(RenderArea, F32x4, ) diff --git a/src/shader_recompiler/frontend/maxwell/translate/impl/move_special_register.cpp b/src/shader_recompiler/frontend/maxwell/translate/impl/move_special_register.cpp index e593132e61..b9b8671b07 100644 --- a/src/shader_recompiler/frontend/maxwell/translate/impl/move_special_register.cpp +++ b/src/shader_recompiler/frontend/maxwell/translate/impl/move_special_register.cpp @@ -139,10 +139,10 @@ enum class SpecialRegister : u64 { return ir.WorkgroupIdZ(); case SpecialRegister::SR_WSCALEFACTOR_XY: LOG_WARNING(Shader, "(STUBBED) SR_WSCALEFACTOR_XY"); - return ir.Imm32(Common::BitCast(1.0f)); + return ir.SR_WScaleFactorXY(); case SpecialRegister::SR_WSCALEFACTOR_Z: LOG_WARNING(Shader, "(STUBBED) SR_WSCALEFACTOR_Z"); - return ir.Imm32(Common::BitCast(1.0f)); + return ir.SR_WScaleFactorZ(); case SpecialRegister::SR_LANEID: return ir.LaneId(); case SpecialRegister::SR_EQMASK: