From 79e3c66514f2df67c8c8114d67d041e7e9ce1e9e Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 7 Apr 2013 22:30:06 -0700 Subject: [PATCH 1/2] Adjust FBO decimation to optimize for creation. But, keep aggressively decimating for a few frames. --- GPU/GLES/Framebuffer.cpp | 19 ++++++++++++++++--- GPU/GLES/Framebuffer.h | 2 +- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/GPU/GLES/Framebuffer.cpp b/GPU/GLES/Framebuffer.cpp index 87faa73376..bdb596bc5b 100644 --- a/GPU/GLES/Framebuffer.cpp +++ b/GPU/GLES/Framebuffer.cpp @@ -58,7 +58,9 @@ static const char basic_vs[] = // Aggressively delete unused FBO:s to save gpu memory. enum { - FBO_OLD_AGE = 5 + FBO_OLD_AGE = 10, + FBO_OLD_FORCE_AGE = 3, + FBO_OLD_FORCE_RETAIN_FRAMES = 6, }; static bool MaskedEqual(u32 addr1, u32 addr2) { @@ -388,6 +390,7 @@ void FramebufferManager::SetRenderFrameBuffer() { currentRenderVfb_ = vfb; INFO_LOG(HLE, "Creating FBO for %08x : %i x %i x %i", vfb->fb_address, vfb->width, vfb->height, vfb->format); + DecimateFBOs(true); // We already have it! } else if (vfb != currentRenderVfb_) { @@ -552,7 +555,17 @@ std::vector FramebufferManager::GetFramebufferList() { return list; } -void FramebufferManager::DecimateFBOs() { +void FramebufferManager::DecimateFBOs(bool force) { + static int retainForce = 0; + if (force) + retainForce = FBO_OLD_FORCE_RETAIN_FRAMES; + + int oldAge = FBO_OLD_AGE; + if (retainForce) { + --retainForce; + oldAge = FBO_OLD_FORCE_AGE; + } + fbo_unbind(); for (auto iter = vfbs_.begin(); iter != vfbs_.end();) { VirtualFramebuffer *vfb = *iter; @@ -561,7 +574,7 @@ void FramebufferManager::DecimateFBOs() { continue; } int age = gpuStats.numFrames - (*iter)->last_frame_used; - if (age > FBO_OLD_AGE) { + if (age > oldAge) { INFO_LOG(HLE, "Decimating FBO for %08x (%i x %i x %i), age %i", vfb->fb_address, vfb->width, vfb->height, vfb->format, age) if (vfb->fbo) { textureCache_->NotifyFramebufferDestroyed(vfb->fb_address, vfb); diff --git a/GPU/GLES/Framebuffer.h b/GPU/GLES/Framebuffer.h index 5f9785b0f2..220e447ffe 100644 --- a/GPU/GLES/Framebuffer.h +++ b/GPU/GLES/Framebuffer.h @@ -89,7 +89,7 @@ public: void DrawActiveTexture(float x, float y, float w, float h, bool flip = false); void DestroyAllFBOs(); - void DecimateFBOs(); + void DecimateFBOs(bool force = false); void BeginFrame(); void EndFrame(); From 23c0e7f31979d2a48600bb29c0567e4d6fd33fb0 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Mon, 8 Apr 2013 00:45:21 -0700 Subject: [PATCH 2/2] Change FBO age back to 5, gets in a create loop... --- GPU/GLES/Framebuffer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GPU/GLES/Framebuffer.cpp b/GPU/GLES/Framebuffer.cpp index bdb596bc5b..097c20c21f 100644 --- a/GPU/GLES/Framebuffer.cpp +++ b/GPU/GLES/Framebuffer.cpp @@ -59,7 +59,7 @@ static const char basic_vs[] = // Aggressively delete unused FBO:s to save gpu memory. enum { FBO_OLD_AGE = 10, - FBO_OLD_FORCE_AGE = 3, + FBO_OLD_FORCE_AGE = 5, FBO_OLD_FORCE_RETAIN_FRAMES = 6, };