From 1f2adf056300e12bcb8608b8a5dbfcbe4b53b3fd Mon Sep 17 00:00:00 2001 From: pierre Date: Mon, 4 Jul 2011 13:49:40 +0000 Subject: [PATCH] VideoCommon: Always update pixel shader constants when tevregs change This time, it doesn't break the games i tested, and still fixes Metroid Prime 3 texts/colors. git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@7668 8ced0084-cf51-0410-be5f-012b33b47a6e --- Source/Core/VideoCommon/Src/BPStructs.cpp | 9 ++++++-- .../VideoCommon/Src/PixelShaderManager.cpp | 21 +++++++++++-------- .../Core/VideoCommon/Src/PixelShaderManager.h | 2 +- 3 files changed, 20 insertions(+), 12 deletions(-) diff --git a/Source/Core/VideoCommon/Src/BPStructs.cpp b/Source/Core/VideoCommon/Src/BPStructs.cpp index bd9e9ac5f7..42b5b2212a 100644 --- a/Source/Core/VideoCommon/Src/BPStructs.cpp +++ b/Source/Core/VideoCommon/Src/BPStructs.cpp @@ -553,11 +553,16 @@ void BPWritten(const BPCmd& bp) case BPMEM_TEV_REGISTER_H+4: case BPMEM_TEV_REGISTER_L+6: // Reg 4 case BPMEM_TEV_REGISTER_H+6: - if (bp.address & 1) // only run this code for the _H! is this right? what if L is set independently? + // some games only send the _L part, so always update + // there actually are 2 register behind each of these + // addresses, selected by the type bit. { // don't compare with changes! int num = (bp.address >> 1) & 0x3; - PixelShaderManager::SetColorChanged(bpmem.tevregs[num].high.type, num); + if ((bp.address & 1) == 0) + PixelShaderManager::SetColorChanged(bpmem.tevregs[num].low.type, num, false); + else + PixelShaderManager::SetColorChanged(bpmem.tevregs[num].high.type, num, true); } break; diff --git a/Source/Core/VideoCommon/Src/PixelShaderManager.cpp b/Source/Core/VideoCommon/Src/PixelShaderManager.cpp index c8b8be412e..2521f80500 100644 --- a/Source/Core/VideoCommon/Src/PixelShaderManager.cpp +++ b/Source/Core/VideoCommon/Src/PixelShaderManager.cpp @@ -340,17 +340,20 @@ void PixelShaderManager::SetPSTextureDims(int texid) // This one is high in profiles (0.5%). TODO: Move conversion out, only store the raw color value // and update it when the shader constant is set, only. -void PixelShaderManager::SetColorChanged(int type, int num) +void PixelShaderManager::SetColorChanged(int type, int num, bool high) { - int r = bpmem.tevregs[num].low.a; - int a = bpmem.tevregs[num].low.b; - int b = bpmem.tevregs[num].high.a; - int g = bpmem.tevregs[num].high.b; float *pf = &lastRGBAfull[type][num][0]; - pf[0] = (float)r * (1.0f / 255.0f); - pf[1] = (float)g * (1.0f / 255.0f); - pf[2] = (float)b * (1.0f / 255.0f); - pf[3] = (float)a * (1.0f / 255.0f); + if (!high) { + int r = bpmem.tevregs[num].low.a; + int a = bpmem.tevregs[num].low.b; + pf[0] = (float)r * (1.0f / 255.0f); + pf[3] = (float)a * (1.0f / 255.0f); + } else { + int b = bpmem.tevregs[num].high.a; + int g = bpmem.tevregs[num].high.b; + pf[1] = (float)g * (1.0f / 255.0f); + pf[2] = (float)b * (1.0f / 255.0f); + } s_nColorsChanged[type] |= 1 << num; PRIM_LOG("pixel %scolor%d: %f %f %f %f\n", type?"k":"", num, pf[0], pf[1], pf[2], pf[3]); } diff --git a/Source/Core/VideoCommon/Src/PixelShaderManager.h b/Source/Core/VideoCommon/Src/PixelShaderManager.h index adbc8bf037..2d1c01cad6 100644 --- a/Source/Core/VideoCommon/Src/PixelShaderManager.h +++ b/Source/Core/VideoCommon/Src/PixelShaderManager.h @@ -34,7 +34,7 @@ public: static void SetConstants(); // sets pixel shader constants // constant management, should be called after memory is committed - static void SetColorChanged(int type, int index); + static void SetColorChanged(int type, int index, bool high); static void SetAlpha(const AlphaFunc& alpha); static void SetDestAlpha(const ConstantAlpha& alpha); static void SetTexDims(int texmapid, u32 width, u32 height, u32 wraps, u32 wrapt);