From c0bafdb37f1a50876db4904f0c069e821ab41d82 Mon Sep 17 00:00:00 2001 From: Skyth <19259897+blueskythlikesclouds@users.noreply.github.com> Date: Wed, 16 Oct 2024 17:36:35 +0300 Subject: [PATCH] Implement svPos register. --- ShaderRecomp/shader.h | 2 +- ShaderRecomp/shader_recompiler.cpp | 12 +++++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/ShaderRecomp/shader.h b/ShaderRecomp/shader.h index b2d7873..67968f6 100644 --- a/ShaderRecomp/shader.h +++ b/ShaderRecomp/shader.h @@ -31,7 +31,7 @@ struct Shader be physicalOffset; be size; be field8; - be fieldC; + be fieldC; // svPos register: (fieldC >> 8) & 0xFF be field10; be interpolatorInfo; // interpolator count: (interpolatorInfo >> 5) & 0x1F }; diff --git a/ShaderRecomp/shader_recompiler.cpp b/ShaderRecomp/shader_recompiler.cpp index a460fc5..b176723 100644 --- a/ShaderRecomp/shader_recompiler.cpp +++ b/ShaderRecomp/shader_recompiler.cpp @@ -1099,7 +1099,17 @@ void ShaderRecompiler::recompile(const uint8_t* shaderData) for (size_t i = 0; i < 32; i++) { if (!printedRegisters[i]) - println("\tfloat4 r{} = 0.0;", i); + { + print("\tfloat4 r{} = ", i); + if (isPixelShader && i == ((shader->fieldC >> 8) & 0xFF)) + { + out += "float4((iPos.xy - 0.5) * float2(iFace ? 1.0 : -1.0, 1.0), 0.0, 0.0);\n"; + } + else + { + out += "0.0;\n"; + } + } } out += "\tint a0 = 0;\n";