summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authordegasus <wickmarkus@web.de>2012-12-21 21:04:53 +0100
committerdegasus <wickmarkus@web.de>2012-12-21 21:04:53 +0100
commit2df0c31d13372bc29d488cf7e80d4adb9cf28b46 (patch)
treee622f370d2a546749000dc3a75e297c6b37c921b /Source/Core
parent2db4549174620aa130ef012af26c2e1760c4928c (diff)
add invalid flag for BPStructs (fix issue 5790)
this flag will be set on loading a state and checked before every rendering.
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/VideoCommon/Src/BPStructs.cpp75
-rw-r--r--Source/Core/VideoCommon/Src/BPStructs.h1
-rw-r--r--Source/Core/VideoCommon/Src/MainBase.cpp2
-rw-r--r--Source/Core/VideoCommon/Src/VertexManagerBase.cpp4
4 files changed, 51 insertions, 31 deletions
diff --git a/Source/Core/VideoCommon/Src/BPStructs.cpp b/Source/Core/VideoCommon/Src/BPStructs.cpp
index 179196e412..1e13a36f96 100644
--- a/Source/Core/VideoCommon/Src/BPStructs.cpp
+++ b/Source/Core/VideoCommon/Src/BPStructs.cpp
@@ -34,9 +34,10 @@
using namespace BPFunctions;
-u32 mapTexAddress;
-bool mapTexFound;
-int numWrites;
+static u32 mapTexAddress;
+static bool mapTexFound;
+static int numWrites;
+static bool s_invalid;
extern volatile bool g_bSkipCurrentFrame;
@@ -56,6 +57,7 @@ void BPInit()
mapTexAddress = 0;
numWrites = 0;
mapTexFound = false;
+ s_invalid = false;
}
void RenderToXFB(const BPCmd &bp, const EFBRectangle &rc, float yScale, float xfbLines, u32 xfbAddr, const u32 dstWidth, const u32 dstHeight, float gamma)
@@ -81,6 +83,9 @@ void BPWritten(const BPCmd& bp)
just stuff geometry in them and don't put state changes there
----------------------------------------------------------------------------------------------------------------
*/
+
+ // check for invalid state, else unneeded configuration are built
+ BPReload();
// Debugging only, this lets you skip a bp update
//static int times = 0;
@@ -680,32 +685,42 @@ void BPWritten(const BPCmd& bp)
// Called when loading a saved state.
void BPReload()
{
- // restore anything that goes straight to the renderer.
- // let's not risk actually replaying any writes.
- // note that PixelShaderManager is already covered since it has its own DoState.
- SetGenerationMode();
- SetScissor();
- SetLineWidth();
- SetDepthMode();
- SetLogicOpMode();
- SetDitherMode();
- SetBlendMode();
- SetColorMask();
- OnPixelFormatChange();
- {
- BPCmd bp = {BPMEM_TX_SETMODE0, 0xFFFFFF, static_cast<int>(((u32*)&bpmem)[BPMEM_TX_SETMODE0])};
- SetTextureMode(bp);
- }
- {
- BPCmd bp = {BPMEM_TX_SETMODE0_4, 0xFFFFFF, static_cast<int>(((u32*)&bpmem)[BPMEM_TX_SETMODE0_4])};
- SetTextureMode(bp);
- }
- {
- BPCmd bp = {BPMEM_FIELDMASK, 0xFFFFFF, static_cast<int>(((u32*)&bpmem)[BPMEM_FIELDMASK])};
- SetInterlacingMode(bp);
- }
- {
- BPCmd bp = {BPMEM_FIELDMODE, 0xFFFFFF, static_cast<int>(((u32*)&bpmem)[BPMEM_FIELDMODE])};
- SetInterlacingMode(bp);
+ if(s_invalid) {
+ s_invalid = false;
+
+ // restore anything that goes straight to the renderer.
+ // let's not risk actually replaying any writes.
+ // note that PixelShaderManager is already covered since it has its own DoState.
+ SetGenerationMode();
+ SetScissor();
+ SetLineWidth();
+ SetDepthMode();
+ SetLogicOpMode();
+ SetDitherMode();
+ SetBlendMode();
+ SetColorMask();
+ OnPixelFormatChange();
+ {
+ BPCmd bp = {BPMEM_TX_SETMODE0, 0xFFFFFF, static_cast<int>(((u32*)&bpmem)[BPMEM_TX_SETMODE0])};
+ SetTextureMode(bp);
+ }
+ {
+ BPCmd bp = {BPMEM_TX_SETMODE0_4, 0xFFFFFF, static_cast<int>(((u32*)&bpmem)[BPMEM_TX_SETMODE0_4])};
+ SetTextureMode(bp);
+ }
+ {
+ BPCmd bp = {BPMEM_FIELDMASK, 0xFFFFFF, static_cast<int>(((u32*)&bpmem)[BPMEM_FIELDMASK])};
+ SetInterlacingMode(bp);
+ }
+ {
+ BPCmd bp = {BPMEM_FIELDMODE, 0xFFFFFF, static_cast<int>(((u32*)&bpmem)[BPMEM_FIELDMODE])};
+ SetInterlacingMode(bp);
+ }
}
}
+
+void BPInvalidate()
+{
+ s_invalid = true;
+}
+
diff --git a/Source/Core/VideoCommon/Src/BPStructs.h b/Source/Core/VideoCommon/Src/BPStructs.h
index 38b3d3a3d4..1c1bc23e06 100644
--- a/Source/Core/VideoCommon/Src/BPStructs.h
+++ b/Source/Core/VideoCommon/Src/BPStructs.h
@@ -23,5 +23,6 @@
void BPInit();
void LoadBPReg(u32 value0);
void BPReload();
+void BPInvalidate();
#endif // _BPSTRUCTS_H_
diff --git a/Source/Core/VideoCommon/Src/MainBase.cpp b/Source/Core/VideoCommon/Src/MainBase.cpp
index cb6dc7ae5b..b5e72b1d8d 100644
--- a/Source/Core/VideoCommon/Src/MainBase.cpp
+++ b/Source/Core/VideoCommon/Src/MainBase.cpp
@@ -198,7 +198,7 @@ void VideoBackendHardware::DoState(PointerWrap& p)
// Refresh state.
if (p.GetMode() == PointerWrap::MODE_READ)
{
- BPReload();
+ BPInvalidate();
RecomputeCachedArraybases();
// Clear all caches that touch RAM
diff --git a/Source/Core/VideoCommon/Src/VertexManagerBase.cpp b/Source/Core/VideoCommon/Src/VertexManagerBase.cpp
index 4118e3dcbd..23f355fe3b 100644
--- a/Source/Core/VideoCommon/Src/VertexManagerBase.cpp
+++ b/Source/Core/VideoCommon/Src/VertexManagerBase.cpp
@@ -9,6 +9,7 @@
#include "NativeVertexFormat.h"
#include "TextureCacheBase.h"
#include "RenderBase.h"
+#include "BPStructs.h"
#include "VertexManagerBase.h"
#include "VideoConfig.h"
@@ -159,6 +160,9 @@ void VertexManager::AddVertices(int primitive, int numVertices)
void VertexManager::Flush()
{
+ // loading a state will invalidate BP, so check for it
+ BPReload();
+
g_vertex_manager->vFlush();
}