From d125180847ca92c9ed4dcd18f5d880b94fa7fe10 Mon Sep 17 00:00:00 2001 From: wheremyfoodat <44909372+wheremyfoodat@users.noreply.github.com> Date: Sun, 28 Jul 2024 17:48:16 +0300 Subject: [PATCH] Shader decompiler: Add FLR/SLT/SLTI/SGE/SGEI --- include/PICA/pica_vert_config.hpp | 3 ++- src/core/PICA/shader_decompiler.cpp | 7 +++++++ src/core/renderer_gl/renderer_gl.cpp | 2 -- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/include/PICA/pica_vert_config.hpp b/include/PICA/pica_vert_config.hpp index 606a28e6..ba66426d 100644 --- a/include/PICA/pica_vert_config.hpp +++ b/include/PICA/pica_vert_config.hpp @@ -36,7 +36,8 @@ namespace PICA { outputCount = regs[PICA::InternalRegs::ShaderOutputCount] & 7; outputMask = regs[PICA::InternalRegs::VertexShaderOutputMask]; for (int i = 0; i < outputCount; i++) { - outmaps[i] = regs[PICA::InternalRegs::ShaderOutmap0 + i]; + // Mask out unused bits + outmaps[i] = regs[PICA::InternalRegs::ShaderOutmap0 + i] & 0x1F1F1F1F; } } }; diff --git a/src/core/PICA/shader_decompiler.cpp b/src/core/PICA/shader_decompiler.cpp index 899aff29..e028d6d8 100644 --- a/src/core/PICA/shader_decompiler.cpp +++ b/src/core/PICA/shader_decompiler.cpp @@ -408,9 +408,16 @@ void ShaderDecompiler::compileInstruction(u32& pc, bool& finished) { case ShaderOpcodes::DP3: setDest(operandDescriptor, dest, fmt::format("vec4(dot({}.xyz, {}.xyz))", src1, src2)); break; case ShaderOpcodes::DP4: setDest(operandDescriptor, dest, fmt::format("vec4(dot({}, {}))", src1, src2)); break; + case ShaderOpcodes::FLR: setDest(operandDescriptor, dest, fmt::format("floor({})", src1)); break; case ShaderOpcodes::RSQ: setDest(operandDescriptor, dest, fmt::format("vec4(inversesqrt({}.x))", src1)); break; case ShaderOpcodes::RCP: setDest(operandDescriptor, dest, fmt::format("vec4(1.0 / {}.x)", src1)); break; + case ShaderOpcodes::SLT: + case ShaderOpcodes::SLTI: setDest(operandDescriptor, dest, fmt::format("vec4(lessThan({}, {}))", src1, src2)); break; + + case ShaderOpcodes::SGE: + case ShaderOpcodes::SGEI: setDest(operandDescriptor, dest, fmt::format("vec4(greaterThanEqual({}, {}))", src1, src2)); break; + case ShaderOpcodes::CMP1: case ShaderOpcodes::CMP2: { static constexpr std::array operators = { diff --git a/src/core/renderer_gl/renderer_gl.cpp b/src/core/renderer_gl/renderer_gl.cpp index 6fd266ba..78dfb98f 100644 --- a/src/core/renderer_gl/renderer_gl.cpp +++ b/src/core/renderer_gl/renderer_gl.cpp @@ -961,8 +961,6 @@ bool RendererGL::prepareForDraw(ShaderUnit& shaderUnit, bool isImmediateMode) { usingAcceleratedShader = emulatorConfig->accelerateShaders && !isImmediateMode && !usingUbershader; if (usingAcceleratedShader) { - auto shaderCodeHash = shaderUnit.vs.getCodeHash(); - auto opdescHash = shaderUnit.vs.getOpdescHash(); PICA::VertConfig vertexConfig(shaderUnit.vs, regs, usingUbershader); std::optional& shader = shaderCache.vertexShaderCache[vertexConfig];