summaryrefslogtreecommitdiff
path: root/Source/Core/VideoCommon/PixelShaderManager.cpp
diff options
context:
space:
mode:
authorScott Mansell <phiren@gmail.com>2015-01-16 05:29:39 +1300
committerScott Mansell <phiren@gmail.com>2015-01-23 03:32:31 +1300
commite88c02dece0e5e8d3b019fd0137eab790d6d2036 (patch)
tree47339f400d7f26ddf65d31906278aa24dfa36538 /Source/Core/VideoCommon/PixelShaderManager.cpp
parent128d3036564e99fd3c8d7e6ae45eb17e43d0c95f (diff)
Ensure that ZSlopes save/restore state correctly.
Had to re-do *ShaderManager so they saved their constant arrays instead of completly rebuilding them on restore state.
Diffstat (limited to 'Source/Core/VideoCommon/PixelShaderManager.cpp')
-rw-r--r--Source/Core/VideoCommon/PixelShaderManager.cpp70
1 files changed, 25 insertions, 45 deletions
diff --git a/Source/Core/VideoCommon/PixelShaderManager.cpp b/Source/Core/VideoCommon/PixelShaderManager.cpp
index f80fc114ce..b1a68248ee 100644
--- a/Source/Core/VideoCommon/PixelShaderManager.cpp
+++ b/Source/Core/VideoCommon/PixelShaderManager.cpp
@@ -14,10 +14,6 @@
bool PixelShaderManager::s_bFogRangeAdjustChanged;
bool PixelShaderManager::s_bViewPortChanged;
-bool PixelShaderManager::s_bEFBScaleChanged;
-
-std::array<int4,4> PixelShaderManager::s_tev_color;
-std::array<int4,4> PixelShaderManager::s_tev_konst_color;
PixelShaderConstants PixelShaderManager::constants;
bool PixelShaderManager::dirty;
@@ -25,34 +21,12 @@ bool PixelShaderManager::dirty;
void PixelShaderManager::Init()
{
memset(&constants, 0, sizeof(constants));
- memset(s_tev_color.data(), 0, sizeof(s_tev_color));
- memset(s_tev_konst_color.data(), 0, sizeof(s_tev_konst_color));
-
- Dirty();
-}
-void PixelShaderManager::Dirty()
-{
+ // Init any intial constants which aren't zero when bpmem is zero.
s_bFogRangeAdjustChanged = true;
- s_bViewPortChanged = true;
+ s_bViewPortChanged = false;
- for (unsigned index = 0; index < s_tev_color.size(); ++index)
- {
- for (int comp = 0; comp < 4; ++comp)
- {
- SetTevColor(index, comp, s_tev_color[index][comp]);
- SetTevKonstColor(index, comp, s_tev_konst_color[index][comp]);
- }
- }
-
- SetAlpha();
- SetDestAlpha();
- SetZTextureBias();
- SetViewportChanged();
SetEfbScaleChanged();
- SetZSlope(0, 0, (float)0xFFFFFF);
- SetIndTexScaleChanged(false);
- SetIndTexScaleChanged(true);
SetIndMatrixChanged(0);
SetIndMatrixChanged(1);
SetIndMatrixChanged(2);
@@ -65,8 +39,20 @@ void PixelShaderManager::Dirty()
SetTexCoordChanged(5);
SetTexCoordChanged(6);
SetTexCoordChanged(7);
- SetFogColorChanged();
+
+ dirty = true;
+}
+
+void PixelShaderManager::Dirty()
+{
+ // This function is called after a savestate is loaded.
+ // Any constants that can changed based on settings should be re-calculated
+ s_bFogRangeAdjustChanged = true;
+
+ SetEfbScaleChanged();
SetFogParamChanged();
+
+ dirty = true;
}
void PixelShaderManager::Shutdown()
@@ -115,20 +101,12 @@ void PixelShaderManager::SetConstants()
dirty = true;
s_bViewPortChanged = false;
}
-
- if (s_bEFBScaleChanged)
- {
- constants.efbscale[0] = 1.0f / float(Renderer::EFBToScaledXf(1));
- constants.efbscale[1] = 1.0f / float(Renderer::EFBToScaledYf(1));
- dirty = true;
- s_bEFBScaleChanged = false;
- }
}
void PixelShaderManager::SetTevColor(int index, int component, s32 value)
{
auto& c = constants.colors[index];
- c[component] = s_tev_color[index][component] = value;
+ c[component] = value;
dirty = true;
PRIM_LOG("tev color%d: %d %d %d %d\n", index, c[0], c[1], c[2], c[3]);
@@ -137,7 +115,7 @@ void PixelShaderManager::SetTevColor(int index, int component, s32 value)
void PixelShaderManager::SetTevKonstColor(int index, int component, s32 value)
{
auto& c = constants.kcolors[index];
- c[component] = s_tev_konst_color[index][component] = value;
+ c[component] = value;
dirty = true;
PRIM_LOG("tev konst color%d: %d %d %d %d\n", index, c[0], c[1], c[2], c[3]);
@@ -181,8 +159,9 @@ void PixelShaderManager::SetViewportChanged()
void PixelShaderManager::SetEfbScaleChanged()
{
- s_bEFBScaleChanged = true;
- s_bViewPortChanged = true;
+ constants.efbscale[0] = 1.0f / float(Renderer::EFBToScaledXf(1));
+ constants.efbscale[1] = 1.0f / float(Renderer::EFBToScaledYf(1));
+ dirty = true;
}
void PixelShaderManager::SetZSlope(float dfdx, float dfdy, float f0)
@@ -190,7 +169,6 @@ void PixelShaderManager::SetZSlope(float dfdx, float dfdy, float f0)
constants.zslope[0] = dfdx;
constants.zslope[1] = dfdy;
constants.zslope[2] = f0;
- constants.zslope[3] = 0;
dirty = true;
}
@@ -304,12 +282,14 @@ void PixelShaderManager::SetFogRangeAdjustChanged()
void PixelShaderManager::DoState(PointerWrap &p)
{
- p.DoArray(s_tev_color);
- p.DoArray(s_tev_konst_color);
+ p.Do(s_bFogRangeAdjustChanged);
+ p.Do(s_bViewPortChanged);
+
+ p.Do(constants);
if (p.GetMode() == PointerWrap::MODE_READ)
{
- // Reload current state from global GPU state
+ // Fixup the current state from global GPU state
// NOTE: This requires that all GPU memory has been loaded already.
Dirty();
}