From 03cab6edf76a0f8555423c57722d2f567c2fecf5 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 23 Jun 2013 08:16:22 -0700 Subject: [PATCH] Centralize destruction of FBOs, use std::vector. --- GPU/GLES/Framebuffer.cpp | 64 +++++++++++++--------------------------- GPU/GLES/Framebuffer.h | 4 +-- 2 files changed, 22 insertions(+), 46 deletions(-) diff --git a/GPU/GLES/Framebuffer.cpp b/GPU/GLES/Framebuffer.cpp index 1082b0517d..9a8eb1e8a5 100644 --- a/GPU/GLES/Framebuffer.cpp +++ b/GPU/GLES/Framebuffer.cpp @@ -324,7 +324,13 @@ void GuessDrawingSize(int &drawing_width, int &drawing_height) { drawing_height = std::min(drawing_height, 512); } -void FramebufferManager::NotifyDestroyed(VirtualFramebuffer *v) { +void FramebufferManager::DestroyFramebuf(VirtualFramebuffer *v) { + textureCache_->NotifyFramebufferDestroyed(v->fb_address, v); + if (v->fbo) { + fbo_destroy(v->fbo); + v->fbo = 0; + } + // Wipe some pointers if (currentRenderVfb_ == v) currentRenderVfb_ = 0; @@ -334,6 +340,8 @@ void FramebufferManager::NotifyDestroyed(VirtualFramebuffer *v) { prevDisplayFramebuf_ = 0; if (prevPrevDisplayFramebuf_ == v) prevPrevDisplayFramebuf_ = 0; + + delete v; } void FramebufferManager::SetRenderFrameBuffer() { @@ -388,15 +396,8 @@ void FramebufferManager::SetRenderFrameBuffer() { buffer_width = std::max((int)v->width, drawing_width); buffer_height = std::max((int)v->height, drawing_height); - textureCache_->NotifyFramebufferDestroyed(v->fb_address, v); - if (v->fbo) { - fbo_destroy(v->fbo); - v->fbo = 0; - } - NotifyDestroyed(v); - - delete v; - vfbs_.erase(iter++); + DestroyFramebuf(v); + vfbs_.erase(iter--); break; } } @@ -673,28 +674,17 @@ std::vector FramebufferManager::GetFramebufferList() { void FramebufferManager::DecimateFBOs() { fbo_unbind(); currentRenderVfb_ = 0; - retry: - for (auto iter = vfbs_.begin(); iter != vfbs_.end();) { + for (auto iter = vfbs_.begin(); iter != vfbs_.end(); ++iter) { VirtualFramebuffer *vfb = *iter; if (vfb == displayFramebuf_ || vfb == prevDisplayFramebuf_ || vfb == prevPrevDisplayFramebuf_) { - ++iter; continue; } - int age = frameLastFramebufUsed - (*iter)->last_frame_used; + int age = frameLastFramebufUsed - (*iter)->last_frame_used; if (age > FBO_OLD_AGE) { - textureCache_->NotifyFramebufferDestroyed(vfb->fb_address, vfb); 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) { - fbo_destroy(vfb->fbo); - vfb->fbo = 0; - } - NotifyDestroyed(vfb); - delete vfb; - vfbs_.erase(iter); - goto retry; + DestroyFramebuf(vfb); + vfbs_.erase(iter--); } - else - ++iter; } } @@ -707,14 +697,8 @@ void FramebufferManager::DestroyAllFBOs() { for (auto iter = vfbs_.begin(); iter != vfbs_.end(); ++iter) { VirtualFramebuffer *vfb = *iter; - textureCache_->NotifyFramebufferDestroyed(vfb->fb_address, vfb); - if (vfb->fbo) { - INFO_LOG(HLE, "Destroying FBO for %08x : %i x %i x %i", vfb->fb_address, vfb->width, vfb->height, vfb->format); - fbo_destroy(vfb->fbo); - vfb->fbo = 0; - } - NotifyDestroyed(vfb); - delete vfb; + INFO_LOG(HLE, "Destroying FBO for %08x : %i x %i x %i", vfb->fb_address, vfb->width, vfb->height, vfb->format); + DestroyFramebuf(vfb); } vfbs_.clear(); } @@ -733,7 +717,7 @@ void FramebufferManager::UpdateFromMemory(u32 addr, int size) { currentRenderVfb_ = 0; bool needUnbind = false; - for (auto iter = vfbs_.begin(); iter != vfbs_.end(); ) { + for (auto iter = vfbs_.begin(); iter != vfbs_.end(); ++iter) { VirtualFramebuffer *vfb = *iter; if (MaskedEqual(vfb->fb_address, addr)) { // TODO: This without the fbo_unbind() above would be better than destroying the FBO. @@ -742,20 +726,12 @@ void FramebufferManager::UpdateFromMemory(u32 addr, int size) { fbo_bind_as_render_target(vfb->fbo); needUnbind = true; DrawPixels(Memory::GetPointer(addr), vfb->format, vfb->fb_stride); - ++iter; } else { - textureCache_->NotifyFramebufferDestroyed(vfb->fb_address, vfb); INFO_LOG(HLE, "Invalidating FBO for %08x (%i x %i x %i)", vfb->fb_address, vfb->width, vfb->height, vfb->format) - if (vfb->fbo) { - fbo_destroy(vfb->fbo); - vfb->fbo = 0; - } - delete vfb; - vfbs_.erase(iter++); + DestroyFramebuf(vfb); + vfbs_.erase(iter--); } } - else - ++iter; } if (needUnbind) diff --git a/GPU/GLES/Framebuffer.h b/GPU/GLES/Framebuffer.h index 6a7b21b3ec..8142e1949d 100644 --- a/GPU/GLES/Framebuffer.h +++ b/GPU/GLES/Framebuffer.h @@ -124,7 +124,7 @@ public: return displayFramebuf_ ? (0x04000000 | displayFramebuf_->fb_address) : 0; } - void NotifyDestroyed(VirtualFramebuffer *vfb); + void DestroyFramebuf(VirtualFramebuffer *vfb); private: u32 ramDisplayFramebufPtr_; // workaround for MotoGP insanity @@ -137,7 +137,7 @@ private: VirtualFramebuffer *prevPrevDisplayFramebuf_; int frameLastFramebufUsed; - std::list vfbs_; + std::vector vfbs_; VirtualFramebuffer *currentRenderVfb_;