Skip to content

Commit

Permalink
Save FBOs on decimate when they have a safe size.
Browse files Browse the repository at this point in the history
Fixes #7695.
  • Loading branch information
unknownbrackets committed May 20, 2016
1 parent eee9896 commit f08c873
Show file tree
Hide file tree
Showing 9 changed files with 47 additions and 20 deletions.
15 changes: 12 additions & 3 deletions GPU/Directx9/FramebufferDX9.cpp
Expand Up @@ -1140,7 +1140,7 @@ namespace DX9 {

void FramebufferManagerDX9::EndFrame() {
if (resized_) {
DestroyAllFBOs();
DestroyAllFBOs(false);
// Actually, auto mode should be more granular...
// Round up to a zoom factor for the render size.
int zoom = g_Config.iInternalResolution;
Expand Down Expand Up @@ -1173,7 +1173,7 @@ namespace DX9 {
}

void FramebufferManagerDX9::DeviceLost() {
DestroyAllFBOs();
DestroyAllFBOs(false);
resized_ = false;
}

Expand Down Expand Up @@ -1218,6 +1218,9 @@ namespace DX9 {
if (vfb != displayFramebuf_ && vfb != prevDisplayFramebuf_ && vfb != prevPrevDisplayFramebuf_) {
if (age > FBO_OLD_AGE) {
INFO_LOG(SCEGE, "Decimating FBO for %08x (%i x %i x %i), age %i", vfb->fb_address, vfb->width, vfb->height, vfb->format, age);
if (!g_Config.bDisableSlowFramebufEffects && vfb->safeWidth > 0 && vfb->safeHeight > 0) {
ReadFramebufferToMemory(vfb, true, 0, 0, vfb->safeWidth, vfb->safeHeight);
}
DestroyFramebuf(vfb);
vfbs_.erase(vfbs_.begin() + i--);
}
Expand Down Expand Up @@ -1256,7 +1259,7 @@ namespace DX9 {
}
}

void FramebufferManagerDX9::DestroyAllFBOs() {
void FramebufferManagerDX9::DestroyAllFBOs(bool forceDelete) {
fbo_unbind();
currentRenderVfb_ = 0;
displayFramebuf_ = 0;
Expand All @@ -1266,6 +1269,12 @@ namespace DX9 {
for (size_t i = 0; i < vfbs_.size(); ++i) {
VirtualFramebuffer *vfb = vfbs_[i];
INFO_LOG(SCEGE, "Destroying FBO for %08x : %i x %i x %i", vfb->fb_address, vfb->width, vfb->height, vfb->format);
if (!forceDelete && !g_Config.bDisableSlowFramebufEffects && vfb->safeWidth > 0 && vfb->safeHeight > 0) {
// But also let's check if Memory is shut down already.
if (Memory::IsActive()) {
ReadFramebufferToMemory(vfb, true, 0, 0, vfb->safeWidth, vfb->safeHeight);
}
}
DestroyFramebuf(vfb);
}
vfbs_.clear();
Expand Down
2 changes: 1 addition & 1 deletion GPU/Directx9/FramebufferDX9.h
Expand Up @@ -60,7 +60,7 @@ class FramebufferManagerDX9 : public FramebufferManagerCommon {

void DrawActiveTexture(LPDIRECT3DTEXTURE9 texture, float x, float y, float w, float h, float destW, float destH, float u0, float v0, float u1, float v1, int uvRotation);

void DestroyAllFBOs();
void DestroyAllFBOs(bool forceDelete);

void EndFrame();
void Resized();
Expand Down
4 changes: 2 additions & 2 deletions GPU/Directx9/GPU_DX9.cpp
Expand Up @@ -511,7 +511,7 @@ void GPU_DX9::CheckGPUFeatures() {
}

GPU_DX9::~GPU_DX9() {
framebufferManager_.DestroyAllFBOs();
framebufferManager_.DestroyAllFBOs(true);
shaderManager_->ClearCache(true);
delete shaderManager_;
}
Expand Down Expand Up @@ -2137,7 +2137,7 @@ void GPU_DX9::DoState(PointerWrap &p) {
drawEngine_.ClearTrackedVertexArrays();

gstate_c.textureChanged = TEXCHANGE_UPDATED;
framebufferManager_.DestroyAllFBOs();
framebufferManager_.DestroyAllFBOs(true);
shaderManager_->ClearCache(true);
}
}
Expand Down
15 changes: 12 additions & 3 deletions GPU/GLES/Framebuffer.cpp
Expand Up @@ -1784,7 +1784,7 @@ void FramebufferManager::PackDepthbuffer(VirtualFramebuffer *vfb, int x, int y,
void FramebufferManager::EndFrame() {
if (resized_) {
// TODO: Only do this if the new size actually changed the renderwidth/height.
DestroyAllFBOs();
DestroyAllFBOs(false);

// Probably not necessary
glstate.viewport.set(0, 0, PSP_CoreParameter().pixelWidth, PSP_CoreParameter().pixelHeight);
Expand Down Expand Up @@ -1854,7 +1854,7 @@ void FramebufferManager::EndFrame() {
}

void FramebufferManager::DeviceLost() {
DestroyAllFBOs();
DestroyAllFBOs(false);
DestroyDraw2DProgram();
resized_ = false;
}
Expand Down Expand Up @@ -1897,6 +1897,9 @@ void FramebufferManager::DecimateFBOs() {
if (vfb != displayFramebuf_ && vfb != prevDisplayFramebuf_ && vfb != prevPrevDisplayFramebuf_) {
if (age > FBO_OLD_AGE) {
INFO_LOG(SCEGE, "Decimating FBO for %08x (%i x %i x %i), age %i", vfb->fb_address, vfb->width, vfb->height, vfb->format, age);
if (!g_Config.bDisableSlowFramebufEffects && vfb->safeWidth > 0 && vfb->safeHeight > 0) {
ReadFramebufferToMemory(vfb, true, 0, 0, vfb->safeWidth, vfb->safeHeight);
}
DestroyFramebuf(vfb);
vfbs_.erase(vfbs_.begin() + i--);
}
Expand Down Expand Up @@ -1925,7 +1928,7 @@ void FramebufferManager::DecimateFBOs() {
}
}

void FramebufferManager::DestroyAllFBOs() {
void FramebufferManager::DestroyAllFBOs(bool forceDelete) {
fbo_unbind();
currentRenderVfb_ = 0;
displayFramebuf_ = 0;
Expand All @@ -1935,6 +1938,12 @@ void FramebufferManager::DestroyAllFBOs() {
for (size_t i = 0; i < vfbs_.size(); ++i) {
VirtualFramebuffer *vfb = vfbs_[i];
INFO_LOG(SCEGE, "Destroying FBO for %08x : %i x %i x %i", vfb->fb_address, vfb->width, vfb->height, vfb->format);
if (!forceDelete && !g_Config.bDisableSlowFramebufEffects && vfb->safeWidth > 0 && vfb->safeHeight > 0) {
// But also let's check if Memory is shut down already.
if (Memory::IsActive()) {
ReadFramebufferToMemory(vfb, true, 0, 0, vfb->safeWidth, vfb->safeHeight);
}
}
DestroyFramebuf(vfb);
}
vfbs_.clear();
Expand Down
2 changes: 1 addition & 1 deletion GPU/GLES/Framebuffer.h
Expand Up @@ -82,7 +82,7 @@ class FramebufferManager : public FramebufferManagerCommon {
// x,y,w,h are relative to destW, destH which fill out the target completely.
void DrawActiveTexture(GLuint texture, float x, float y, float w, float h, float destW, float destH, float u0, float v0, float u1, float v1, GLSLProgram *program, int uvRotation);

void DestroyAllFBOs();
void DestroyAllFBOs(bool forceDelete);

virtual void Init() override;
void EndFrame();
Expand Down
6 changes: 3 additions & 3 deletions GPU/GLES/GPU_GLES.cpp
Expand Up @@ -469,7 +469,7 @@ GPU_GLES::GPU_GLES(GraphicsContext *ctx)
}

GPU_GLES::~GPU_GLES() {
framebufferManager_.DestroyAllFBOs();
framebufferManager_.DestroyAllFBOs(true);
shaderManager_->ClearCache(true);
depalShaderCache_.Clear();
fragmentTestCache_.Clear();
Expand Down Expand Up @@ -660,7 +660,7 @@ void GPU_GLES::Reinitialize() {
void GPU_GLES::ReinitializeInternal() {
textureCache_.Clear(true);
depalShaderCache_.Clear();
framebufferManager_.DestroyAllFBOs();
framebufferManager_.DestroyAllFBOs(true);
framebufferManager_.Resized();
}

Expand Down Expand Up @@ -2401,7 +2401,7 @@ void GPU_GLES::DoState(PointerWrap &p) {
drawEngine_.ClearTrackedVertexArrays();

gstate_c.textureChanged = TEXCHANGE_UPDATED;
framebufferManager_.DestroyAllFBOs();
framebufferManager_.DestroyAllFBOs(true);
shaderManager_->ClearCache(true);
}
}
Expand Down
15 changes: 12 additions & 3 deletions GPU/Vulkan/FramebufferVulkan.cpp
Expand Up @@ -1456,7 +1456,7 @@ void FramebufferManagerVulkan::BeginFrameVulkan() {
void FramebufferManagerVulkan::EndFrame() {
if (resized_) {
// TODO: Only do this if the new size actually changed the renderwidth/height.
DestroyAllFBOs();
DestroyAllFBOs(false);

// Check if postprocessing shader is doing upscaling as it requires native resolution
const ShaderInfo *shaderInfo = 0;
Expand Down Expand Up @@ -1512,7 +1512,7 @@ void FramebufferManagerVulkan::EndFrame() {
}

void FramebufferManagerVulkan::DeviceLost() {
DestroyAllFBOs();
DestroyAllFBOs(false);
resized_ = false;
}

Expand Down Expand Up @@ -1553,14 +1553,17 @@ void FramebufferManagerVulkan::DecimateFBOs() {
if (vfb != displayFramebuf_ && vfb != prevDisplayFramebuf_ && vfb != prevPrevDisplayFramebuf_) {
if (age > FBO_OLD_AGE) {
INFO_LOG(SCEGE, "Decimating FBO for %08x (%i x %i x %i), age %i", vfb->fb_address, vfb->width, vfb->height, vfb->format, age);
if (!g_Config.bDisableSlowFramebufEffects && vfb->safeWidth > 0 && vfb->safeHeight > 0) {
ReadFramebufferToMemory(vfb, true, 0, 0, vfb->safeWidth, vfb->safeHeight);
}
DestroyFramebuf(vfb);
vfbs_.erase(vfbs_.begin() + i--);
}
}
}
}

void FramebufferManagerVulkan::DestroyAllFBOs() {
void FramebufferManagerVulkan::DestroyAllFBOs(bool forceDelete) {
currentRenderVfb_ = 0;
displayFramebuf_ = 0;
prevDisplayFramebuf_ = 0;
Expand All @@ -1569,6 +1572,12 @@ void FramebufferManagerVulkan::DestroyAllFBOs() {
for (size_t i = 0; i < vfbs_.size(); ++i) {
VirtualFramebuffer *vfb = vfbs_[i];
INFO_LOG(SCEGE, "Destroying FBO for %08x : %i x %i x %i", vfb->fb_address, vfb->width, vfb->height, vfb->format);
if (!forceDelete && !g_Config.bDisableSlowFramebufEffects && vfb->safeWidth > 0 && vfb->safeHeight > 0) {
// But also let's check if Memory is shut down already.
if (Memory::IsActive()) {
ReadFramebufferToMemory(vfb, true, 0, 0, vfb->safeWidth, vfb->safeHeight);
}
}
DestroyFramebuf(vfb);
}
vfbs_.clear();
Expand Down
2 changes: 1 addition & 1 deletion GPU/Vulkan/FramebufferVulkan.h
Expand Up @@ -95,7 +95,7 @@ class FramebufferManagerVulkan : public FramebufferManagerCommon {
// x,y,w,h are relative to destW, destH which fill out the target completely.
void DrawTexture(VulkanTexture *texture, float x, float y, float w, float h, float destW, float destH, float u0, float v0, float u1, float v1, VkPipeline pipeline, int uvRotation);

void DestroyAllFBOs();
void DestroyAllFBOs(bool forceDelete);

virtual void Init() override;

Expand Down
6 changes: 3 additions & 3 deletions GPU/Vulkan/GPU_Vulkan.cpp
Expand Up @@ -455,7 +455,7 @@ GPU_Vulkan::GPU_Vulkan(GraphicsContext *ctx)
}

GPU_Vulkan::~GPU_Vulkan() {
framebufferManager_->DestroyAllFBOs();
framebufferManager_->DestroyAllFBOs(true);
depalShaderCache_.Clear();
delete framebufferManager_;
delete pipelineManager_;
Expand Down Expand Up @@ -614,7 +614,7 @@ void GPU_Vulkan::Reinitialize() {
void GPU_Vulkan::ReinitializeInternal() {
textureCache_.Clear(true);
depalShaderCache_.Clear();
framebufferManager_->DestroyAllFBOs();
framebufferManager_->DestroyAllFBOs(true);
framebufferManager_->Resized();
}

Expand Down Expand Up @@ -2236,7 +2236,7 @@ void GPU_Vulkan::DoState(PointerWrap &p) {
depalShaderCache_.Clear();

gstate_c.textureChanged = TEXCHANGE_UPDATED;
framebufferManager_->DestroyAllFBOs();
framebufferManager_->DestroyAllFBOs(true);
shaderManager_->ClearShaders();
pipelineManager_->Clear();
}
Expand Down

0 comments on commit f08c873

Please sign in to comment.