diff --git a/GPU/GLES/GLES_GPU.cpp b/GPU/GLES/GLES_GPU.cpp index a49a49aa68..a53099e5a0 100644 --- a/GPU/GLES/GLES_GPU.cpp +++ b/GPU/GLES/GLES_GPU.cpp @@ -48,6 +48,8 @@ enum { FLAG_EXECUTE = 4, // needs to actually be executed. unused for now. FLAG_EXECUTEONCHANGE = 8, // unused for now. not sure if checking for this will be more expensive than doing it. FLAG_ANY_EXECUTE = 4 | 8, + FLAG_READS_PC = 16, + FLAG_WRITES_PC = 32, }; struct CommandTableEntry { @@ -57,9 +59,9 @@ struct CommandTableEntry { static const CommandTableEntry commandTable[] = { // Changes that dirty the framebuffer - {GE_CMD_FRAMEBUFPTR, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTE}, - {GE_CMD_FRAMEBUFWIDTH, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTE}, - {GE_CMD_FRAMEBUFPIXFORMAT, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTE}, + {GE_CMD_FRAMEBUFPTR, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE}, + {GE_CMD_FRAMEBUFWIDTH, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE}, + {GE_CMD_FRAMEBUFPIXFORMAT, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE}, {GE_CMD_ZBUFPTR, FLAG_FLUSHBEFOREONCHANGE}, {GE_CMD_ZBUFWIDTH, FLAG_FLUSHBEFOREONCHANGE}, @@ -81,7 +83,7 @@ static const CommandTableEntry commandTable[] = { // Changes that dirty the current texture. Really should be possible to avoid executing these if we compile // by adding some more flags. - {GE_CMD_TEXSIZE0, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE}, + {GE_CMD_TEXSIZE0, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTE}, // NOTE: only one that uses diff? {GE_CMD_TEXSIZE1, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE}, {GE_CMD_TEXSIZE2, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE}, {GE_CMD_TEXSIZE3, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE}, @@ -106,9 +108,10 @@ static const CommandTableEntry commandTable[] = { {GE_CMD_TEXBUFWIDTH5, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE}, {GE_CMD_TEXBUFWIDTH6, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE}, {GE_CMD_TEXBUFWIDTH7, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE}, - {GE_CMD_CLUTADDR, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTE}, - {GE_CMD_CLUTADDRUPPER, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTE}, - {GE_CMD_CLUTFORMAT, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTE}, + // These must flush on change, so that LoadClut doesn't have to always flush. + {GE_CMD_CLUTADDR, FLAG_FLUSHBEFOREONCHANGE}, + {GE_CMD_CLUTADDRUPPER, FLAG_FLUSHBEFOREONCHANGE}, + {GE_CMD_CLUTFORMAT, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE}, // These affect the fragment shader so need flushing. {GE_CMD_CLEARMODE, FLAG_FLUSHBEFOREONCHANGE}, @@ -300,16 +303,16 @@ static const CommandTableEntry commandTable[] = { // From Common. No flushing but definitely need execute. {GE_CMD_OFFSETADDR, FLAG_EXECUTE}, - {GE_CMD_ORIGIN, FLAG_EXECUTE}, // Really? + {GE_CMD_ORIGIN, FLAG_EXECUTE | FLAG_READS_PC}, // Really? {GE_CMD_PRIM, FLAG_EXECUTE}, - {GE_CMD_JUMP, FLAG_EXECUTE}, - {GE_CMD_CALL, FLAG_EXECUTE}, - {GE_CMD_RET, FLAG_EXECUTE}, - {GE_CMD_END, FLAG_EXECUTE}, // Flush? + {GE_CMD_JUMP, FLAG_EXECUTE | FLAG_READS_PC | FLAG_WRITES_PC}, + {GE_CMD_CALL, FLAG_EXECUTE | FLAG_READS_PC | FLAG_WRITES_PC}, + {GE_CMD_RET, FLAG_EXECUTE | FLAG_READS_PC | FLAG_WRITES_PC}, + {GE_CMD_END, FLAG_FLUSHBEFORE | FLAG_EXECUTE | FLAG_READS_PC | FLAG_WRITES_PC}, // Flush? {GE_CMD_VADDR, FLAG_EXECUTE}, {GE_CMD_IADDR, FLAG_EXECUTE}, - {GE_CMD_BJUMP, FLAG_EXECUTE}, // EXECUTE - {GE_CMD_BOUNDINGBOX, FLAG_EXECUTE}, // + FLUSHBEFORE when we implement + {GE_CMD_BJUMP, FLAG_EXECUTE | FLAG_READS_PC | FLAG_WRITES_PC}, // EXECUTE + {GE_CMD_BOUNDINGBOX, FLAG_EXECUTE}, // + FLUSHBEFORE when we implement... or not, do we need to? // Changing the vertex type requires us to flush. {GE_CMD_VERTEXTYPE, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE}, @@ -323,7 +326,7 @@ static const CommandTableEntry commandTable[] = { // Changes that trigger data copies. Only flushing on change for LOADCLUT must be a bit of a hack... {GE_CMD_LOADCLUT, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTE}, - {GE_CMD_TRANSFERSTART, FLAG_FLUSHBEFORE | FLAG_EXECUTE}, + {GE_CMD_TRANSFERSTART, FLAG_FLUSHBEFORE | FLAG_EXECUTE | FLAG_READS_PC}, // We don't use the dither table. {GE_CMD_DITH0}, @@ -332,15 +335,15 @@ static const CommandTableEntry commandTable[] = { {GE_CMD_DITH3}, // These handle their own flushing. - {GE_CMD_WORLDMATRIXNUMBER, FLAG_EXECUTE}, + {GE_CMD_WORLDMATRIXNUMBER, FLAG_EXECUTE | FLAG_READS_PC | FLAG_WRITES_PC}, {GE_CMD_WORLDMATRIXDATA, FLAG_EXECUTE}, - {GE_CMD_VIEWMATRIXNUMBER, FLAG_EXECUTE}, + {GE_CMD_VIEWMATRIXNUMBER, FLAG_EXECUTE | FLAG_READS_PC | FLAG_WRITES_PC}, {GE_CMD_VIEWMATRIXDATA, FLAG_EXECUTE}, - {GE_CMD_PROJMATRIXNUMBER, FLAG_EXECUTE}, + {GE_CMD_PROJMATRIXNUMBER, FLAG_EXECUTE | FLAG_READS_PC | FLAG_WRITES_PC}, {GE_CMD_PROJMATRIXDATA, FLAG_EXECUTE}, - {GE_CMD_TGENMATRIXNUMBER, FLAG_EXECUTE}, + {GE_CMD_TGENMATRIXNUMBER, FLAG_EXECUTE | FLAG_READS_PC | FLAG_WRITES_PC}, {GE_CMD_TGENMATRIXDATA, FLAG_EXECUTE}, - {GE_CMD_BONEMATRIXNUMBER, FLAG_EXECUTE}, + {GE_CMD_BONEMATRIXNUMBER, FLAG_EXECUTE | FLAG_READS_PC | FLAG_WRITES_PC}, {GE_CMD_BONEMATRIXDATA, FLAG_EXECUTE}, // "Missing" commands (gaps in the sequence) @@ -1202,7 +1205,7 @@ void GLES_GPU::ExecuteOpInternal(u32 op, u32 diff) { case GE_CMD_LAC0:case GE_CMD_LAC1:case GE_CMD_LAC2:case GE_CMD_LAC3: case GE_CMD_LDC0:case GE_CMD_LDC1:case GE_CMD_LDC2:case GE_CMD_LDC3: case GE_CMD_LSC0:case GE_CMD_LSC1:case GE_CMD_LSC2:case GE_CMD_LSC3: - if (diff) { + if (diff) { float r = (float)(data & 0xff) * (1.0f / 255.0f); float g = (float)((data >> 8) & 0xff) * (1.0f / 255.0f); float b = (float)(data >> 16) * (1.0f / 255.0f); diff --git a/GPU/GLES/VertexDecoder.cpp b/GPU/GLES/VertexDecoder.cpp index 7a70f63bdd..818af79aff 100644 --- a/GPU/GLES/VertexDecoder.cpp +++ b/GPU/GLES/VertexDecoder.cpp @@ -22,6 +22,8 @@ #include "Core/Config.h" #include "Core/MemMap.h" #include "Core/HDRemaster.h" +#include "Core/Reporting.h" +#include "GPU/GPUState.h" #include "GPU/ge_constants.h" #include "GPU/Math3D.h" diff --git a/GPU/GLES/VertexDecoder.h b/GPU/GLES/VertexDecoder.h index dad0e142c3..f7d6ef88e1 100644 --- a/GPU/GLES/VertexDecoder.h +++ b/GPU/GLES/VertexDecoder.h @@ -26,8 +26,6 @@ #endif #include "Globals.h" -#include "Core/Reporting.h" -#include "GPU/GPUState.h" #include "GPU/Common/VertexDecoderCommon.h" class VertexDecoder; diff --git a/GPU/GLES/VertexDecoderArm.cpp b/GPU/GLES/VertexDecoderArm.cpp index 8edf33e83c..28a45e7279 100644 --- a/GPU/GLES/VertexDecoderArm.cpp +++ b/GPU/GLES/VertexDecoderArm.cpp @@ -18,6 +18,8 @@ #include "base/logging.h" #include "Common/CPUDetect.h" #include "Core/Config.h" +#include "Core/Reporting.h" +#include "GPU/GPUState.h" #include "GPU/GLES/VertexDecoder.h" extern void DisassembleArm(const u8 *data, int size); diff --git a/GPU/GLES/VertexDecoderX86.cpp b/GPU/GLES/VertexDecoderX86.cpp index 85d8f7edd4..6f71fc68b6 100644 --- a/GPU/GLES/VertexDecoderX86.cpp +++ b/GPU/GLES/VertexDecoderX86.cpp @@ -19,6 +19,8 @@ #include "Common/CPUDetect.h" #include "Core/Config.h" +#include "Core/Reporting.h" +#include "GPU/GPUState.h" #include "GPU/GLES/VertexDecoder.h" // We start out by converting the active matrices into 4x4 which are easier to multiply with