From c29f70e5e9224629744e4a41f4b057730395b59d Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Mon, 24 Apr 2017 09:30:04 -0700 Subject: [PATCH] GPU: Attempt recreate of FBOs if failed. --- GPU/Common/FramebufferCommon.cpp | 12 ++++++++---- GPU/Common/FramebufferCommon.h | 1 + 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/GPU/Common/FramebufferCommon.cpp b/GPU/Common/FramebufferCommon.cpp index 6f2fc3827a..4295a9458a 100644 --- a/GPU/Common/FramebufferCommon.cpp +++ b/GPU/Common/FramebufferCommon.cpp @@ -579,16 +579,15 @@ void FramebufferManagerCommon::NotifyRenderFramebufferSwitched(VirtualFramebuffe textureCache_->ForgetLastTexture(); if (useBufferedRendering_) { - if (vfb->fbo) { draw_->BindFramebufferAsRenderTarget(vfb->fbo); } else { - // wtf? This should only happen very briefly when toggling bBufferedRendering - draw_->BindBackbufferAsRenderTarget(); + // This should only happen very briefly when toggling useBufferedRendering_. + ResizeFramebufFBO(vfb, vfb->width, vfb->height, true); } } else { if (vfb->fbo) { - // wtf? This should only happen very briefly when toggling bBufferedRendering + // This should only happen very briefly when toggling useBufferedRendering_. textureCache_->NotifyFramebuffer(vfb->fb_address, vfb, NOTIFY_FB_DESTROYED); delete vfb->fbo; vfb->fbo = nullptr; @@ -1147,6 +1146,10 @@ void FramebufferManagerCommon::ResizeFramebufFBO(VirtualFramebuffer *vfb, u16 w, } return; } + if (!old.fbo && vfb->last_frame_failed != 0 && vfb->last_frame_failed - gpuStats.numFlips < 63) { + // Don't constantly retry FBOs which failed to create. + return; + } vfb->fbo = draw_->CreateFramebuffer({ vfb->renderWidth, vfb->renderHeight, 1, 1, true, (Draw::FBColorDepth)vfb->colorDepth }); if (old.fbo) { @@ -1166,6 +1169,7 @@ void FramebufferManagerCommon::ResizeFramebufFBO(VirtualFramebuffer *vfb, u16 w, if (!vfb->fbo) { ERROR_LOG(FRAMEBUF, "Error creating FBO! %i x %i", vfb->renderWidth, vfb->renderHeight); + vfb->last_frame_failed = gpuStats.numFlips; } } diff --git a/GPU/Common/FramebufferCommon.h b/GPU/Common/FramebufferCommon.h index 20ee9f9405..6e6db83be1 100644 --- a/GPU/Common/FramebufferCommon.h +++ b/GPU/Common/FramebufferCommon.h @@ -75,6 +75,7 @@ struct VirtualFramebuffer { int last_frame_render; int last_frame_displayed; int last_frame_clut; + int last_frame_failed; u32 clutUpdatedBytes; bool memoryUpdated; bool depthUpdated;