diff --git a/Core/Config.cpp b/Core/Config.cpp index ad76481c46..6542a552d6 100644 --- a/Core/Config.cpp +++ b/Core/Config.cpp @@ -1460,9 +1460,6 @@ void Config::PostLoadCleanup(bool gameSpecific) { if (g_Config.sCustomDriver == "Default") { g_Config.sCustomDriver = ""; } - - // Convert old volume settings. - } void Config::PreSaveCleanup(bool gameSpecific) { diff --git a/Core/HLE/sceDisplay.cpp b/Core/HLE/sceDisplay.cpp index aa2258f35d..fe6436498c 100644 --- a/Core/HLE/sceDisplay.cpp +++ b/Core/HLE/sceDisplay.cpp @@ -425,7 +425,7 @@ static void DoFrameTiming(bool throttle, bool *skipFrame, float scaledTimestep, // Auto-frameskip automatically if speed limit is set differently than the default. int frameSkipNum = DisplayCalculateFrameSkip(); - if (g_Config.bAutoFrameSkip) { + if (g_Config.bAutoFrameSkip && !g_Config.bSkipBufferEffects) { // autoframeskip // Argh, we are falling behind! Let's skip a frame and see if we catch up. if (curFrameTime > nextFrameTime && doFrameSkip) { @@ -694,6 +694,14 @@ void __DisplayFlip(int cyclesLate) { } else { gstate_c.skipDrawReason &= ~SKIPDRAW_SKIPFRAME; numSkippedFrames = 0; + + // NOTE!! It can happen that if we just toggled frameskip (especially auto), we are still in a state + // where we don't have a framebuffer bound, from the last frame. But framebuffermanager still might think + // that we're in non-buffered mode. + if (gpu->GetFramebufferManagerCommon() && !gpu->GetFramebufferManagerCommon()->UseBufferedRendering() && !g_Config.bSkipBufferEffects) { + gpu->GetFramebufferManagerCommon()->ForceUseBufferedRendering(!g_Config.bSkipBufferEffects); + gstate_c.skipDrawReason &= ~SKIPDRAW_NON_DISPLAYED_FB; + } } // Returning here with coreState == CORE_NEXTFRAME causes a buffer flip to happen (next frame). diff --git a/GPU/Common/FramebufferManagerCommon.cpp b/GPU/Common/FramebufferManagerCommon.cpp index 171e5e72cb..02c671621e 100644 --- a/GPU/Common/FramebufferManagerCommon.cpp +++ b/GPU/Common/FramebufferManagerCommon.cpp @@ -1707,6 +1707,8 @@ void FramebufferManagerCommon::CopyDisplayToOutput(bool reallyDirty) { } else if (useBufferedRendering_) { WARN_LOG(Log::FrameBuf, "Using buffered rendering, and current VFB lacks an FBO: %08x", vfb->fb_address); } else { + // This is OK because here we're in "skip buffered" mode, so even if we haven't presented + // we will have a render target. presentation_->NotifyPresent(); } diff --git a/GPU/Common/FramebufferManagerCommon.h b/GPU/Common/FramebufferManagerCommon.h index 63a3bf011f..1424191292 100644 --- a/GPU/Common/FramebufferManagerCommon.h +++ b/GPU/Common/FramebufferManagerCommon.h @@ -385,6 +385,10 @@ public: return useBufferedRendering_; } + void ForceUseBufferedRendering(bool buf) { + useBufferedRendering_ = true; + } + // TODO: Maybe just include the last depth buffer address in this, too. bool MayIntersectFramebufferColor(u32 start) const { // Clear the cache/kernel bits.