summaryrefslogtreecommitdiff
path: root/Source/Core/VideoCommon
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Core/VideoCommon')
-rw-r--r--Source/Core/VideoCommon/Src/BPStructs.cpp9
-rw-r--r--Source/Core/VideoCommon/Src/PixelShaderManager.cpp21
-rw-r--r--Source/Core/VideoCommon/Src/PixelShaderManager.h2
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);