diff --git a/GPU/GLES/DisplayListInterpreter.cpp b/GPU/GLES/DisplayListInterpreter.cpp index b0926dc1f2..50818d5f34 100644 --- a/GPU/GLES/DisplayListInterpreter.cpp +++ b/GPU/GLES/DisplayListInterpreter.cpp @@ -497,6 +497,8 @@ void GLES_GPU::ExecuteOp(u32 op, u32 diff) { case GE_CMD_FRAMEBUFPTR: case GE_CMD_FRAMEBUFWIDTH: case GE_CMD_FRAMEBUFPIXFORMAT: + if (diff) + gstate_c.framebufChanged = true; break; case GE_CMD_TEXADDR0: @@ -693,6 +695,10 @@ void GLES_GPU::ExecuteOp(u32 op, u32 diff) { case GE_CMD_VIEWPORTX1: case GE_CMD_VIEWPORTY1: + if (diff) + gstate_c.framebufChanged = true; + break; + case GE_CMD_VIEWPORTX2: case GE_CMD_VIEWPORTY2: case GE_CMD_VIEWPORTZ1: diff --git a/GPU/GLES/Framebuffer.cpp b/GPU/GLES/Framebuffer.cpp index 929c001cf5..ecc178170f 100644 --- a/GPU/GLES/Framebuffer.cpp +++ b/GPU/GLES/Framebuffer.cpp @@ -290,6 +290,12 @@ void GuessDrawingSize(int &drawing_width, int &drawing_height) { } void FramebufferManager::SetRenderFrameBuffer() { + if (!gstate_c.framebufChanged && currentRenderVfb_) { + currentRenderVfb_->last_frame_used = gpuStats.numFrames; + return; + } + gstate_c.framebufChanged = false; + // Get parameters u32 fb_address = (gstate.fbptr & 0xFFE000) | ((gstate.fbwidth & 0xFF0000) << 8); int fb_stride = gstate.fbwidth & 0x3C0; diff --git a/GPU/GPUState.h b/GPU/GPUState.h index 224343f16a..97b051568e 100644 --- a/GPU/GPUState.h +++ b/GPU/GPUState.h @@ -252,6 +252,7 @@ struct GPUStateCache u32 offsetAddr; bool textureChanged; + bool framebufChanged; int skipDrawReason;