diff options
| author | Scott Mansell <phiren@gmail.com> | 2015-01-16 05:29:39 +1300 |
|---|---|---|
| committer | Scott Mansell <phiren@gmail.com> | 2015-01-23 03:32:31 +1300 |
| commit | e88c02dece0e5e8d3b019fd0137eab790d6d2036 (patch) | |
| tree | 47339f400d7f26ddf65d31906278aa24dfa36538 /Source/Core/VideoCommon/PixelShaderManager.cpp | |
| parent | 128d3036564e99fd3c8d7e6ae45eb17e43d0c95f (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.cpp | 70 |
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(); } |
