From 98ba7afa83644d335e2de4c09b08209d7300aa1b Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Thu, 13 Apr 2017 23:35:07 -0700 Subject: [PATCH] Destroy FBOs only on actual resize. As a side effect, this means going to settings won't reset all FBOs anymore. The behavior can still be obtained by changing render resolution or rendering mode. This makes resizing the window faster on Windows, and resumes quicker from pause. --- GPU/Common/FramebufferCommon.cpp | 13 ++++++++++--- GPU/Common/FramebufferCommon.h | 4 +++- GPU/D3D11/FramebufferManagerD3D11.cpp | 7 ++++--- GPU/Directx9/FramebufferDX9.cpp | 5 +++-- GPU/GLES/FramebufferManagerGLES.cpp | 10 ++++------ GPU/Vulkan/FramebufferVulkan.cpp | 8 +++----- 6 files changed, 27 insertions(+), 20 deletions(-) diff --git a/GPU/Common/FramebufferCommon.cpp b/GPU/Common/FramebufferCommon.cpp index 4b902a26da..484c9d0de4 100644 --- a/GPU/Common/FramebufferCommon.cpp +++ b/GPU/Common/FramebufferCommon.cpp @@ -140,11 +140,18 @@ void FramebufferManagerCommon::Init() { BeginFrame(); } -void FramebufferManagerCommon::UpdateSize() { +bool FramebufferManagerCommon::UpdateSize() { + const bool newRender = renderWidth_ != (float)PSP_CoreParameter().renderWidth || renderHeight_ != (float)PSP_CoreParameter().renderHeight; + const bool newSettings = bloomHack_ != g_Config.iBloomHack || trueColor_ != g_Config.bTrueColor; + renderWidth_ = (float)PSP_CoreParameter().renderWidth; renderHeight_ = (float)PSP_CoreParameter().renderHeight; pixelWidth_ = PSP_CoreParameter().pixelWidth; pixelHeight_ = PSP_CoreParameter().pixelHeight; + bloomHack_ = g_Config.iBloomHack; + trueColor_ = g_Config.bTrueColor; + + return newRender || newSettings; } void FramebufferManagerCommon::BeginFrame() { @@ -1105,7 +1112,7 @@ void FramebufferManagerCommon::ResizeFramebufFBO(VirtualFramebuffer *vfb, u16 w, SetRenderSize(vfb); - bool trueColor = g_Config.bTrueColor; + bool trueColor = trueColor_; if (PSP_CoreParameter().compat.flags().Force04154000Download && vfb->fb_address == 0x00154000) { trueColor = true; } @@ -1660,7 +1667,7 @@ void FramebufferManagerCommon::SetRenderSize(VirtualFramebuffer *vfb) { float renderWidthFactor = renderWidth_ / 480.0f; float renderHeightFactor = renderHeight_ / 272.0f; bool force1x = false; - switch (g_Config.iBloomHack) { + switch (bloomHack_) { case 1: force1x = vfb->bufferWidth <= 128 || vfb->bufferHeight <= 64; break; diff --git a/GPU/Common/FramebufferCommon.h b/GPU/Common/FramebufferCommon.h index 9336cdd2d1..20ee9f9405 100644 --- a/GPU/Common/FramebufferCommon.h +++ b/GPU/Common/FramebufferCommon.h @@ -285,7 +285,7 @@ protected: // Cardboard Settings Calculator void GetCardboardSettings(CardboardSettings *cardboardSettings); - void UpdateSize(); + bool UpdateSize(); void SetNumExtraFBOs(int num); virtual void DisableState() = 0; @@ -368,6 +368,8 @@ protected: float renderHeight_; int pixelWidth_; int pixelHeight_; + int bloomHack_ = 0; + bool trueColor_ = false; // Used by post-processing shaders std::vector extraFBOs_; diff --git a/GPU/D3D11/FramebufferManagerD3D11.cpp b/GPU/D3D11/FramebufferManagerD3D11.cpp index b8b317bfbe..ce0cf12796 100644 --- a/GPU/D3D11/FramebufferManagerD3D11.cpp +++ b/GPU/D3D11/FramebufferManagerD3D11.cpp @@ -859,8 +859,6 @@ void FramebufferManagerD3D11::PackDepthbuffer(VirtualFramebuffer *vfb, int x, in void FramebufferManagerD3D11::EndFrame() { if (resized_) { - DestroyAllFBOs(); - // Check if postprocessing shader is doing upscaling as it requires native resolution const ShaderInfo *shaderInfo = 0; if (g_Config.sPostShaderName != "Off") { @@ -891,7 +889,10 @@ void FramebufferManagerD3D11::EndFrame() { PSP_CoreParameter().renderHeight = 272 * zoom; } - UpdateSize(); + if (UpdateSize() || g_Config.iRenderingMode == FB_NON_BUFFERED_MODE) { + DestroyAllFBOs(); + } + // Seems related - if you're ok with numbers all the time, show some more :) if (g_Config.iShowFPSCounter != 0) { ShowScreenResolution(); diff --git a/GPU/Directx9/FramebufferDX9.cpp b/GPU/Directx9/FramebufferDX9.cpp index e841242155..46c719555b 100644 --- a/GPU/Directx9/FramebufferDX9.cpp +++ b/GPU/Directx9/FramebufferDX9.cpp @@ -752,7 +752,6 @@ static const D3DVERTEXELEMENT9 g_FramebufferVertexElements[] = { void FramebufferManagerDX9::EndFrame() { if (resized_) { - DestroyAllFBOs(); // Actually, auto mode should be more granular... // Round up to a zoom factor for the render size. int zoom = g_Config.iInternalResolution; @@ -775,7 +774,9 @@ static const D3DVERTEXELEMENT9 g_FramebufferVertexElements[] = { PSP_CoreParameter().renderHeight = 272 * zoom; } - UpdateSize(); + if (UpdateSize() || g_Config.iRenderingMode == FB_NON_BUFFERED_MODE) { + DestroyAllFBOs(); + } // Seems related - if you're ok with numbers all the time, show some more :) if (g_Config.iShowFPSCounter != 0) { ShowScreenResolution(); diff --git a/GPU/GLES/FramebufferManagerGLES.cpp b/GPU/GLES/FramebufferManagerGLES.cpp index d7db65d4da..faff214096 100644 --- a/GPU/GLES/FramebufferManagerGLES.cpp +++ b/GPU/GLES/FramebufferManagerGLES.cpp @@ -1150,11 +1150,8 @@ void FramebufferManagerGLES::PackDepthbuffer(VirtualFramebuffer *vfb, int x, int void FramebufferManagerGLES::EndFrame() { CHECK_GL_ERROR_IF_DEBUG(); if (resized_) { - // TODO: Only do this if the new size actually changed the renderwidth/height. - DestroyAllFBOs(); - // Check if postprocessing shader is doing upscaling as it requires native resolution - const ShaderInfo *shaderInfo = 0; + const ShaderInfo *shaderInfo = nullptr; if (g_Config.sPostShaderName != "Off") { shaderInfo = GetPostShaderInfo(g_Config.sPostShaderName); } @@ -1183,7 +1180,9 @@ void FramebufferManagerGLES::EndFrame() { PSP_CoreParameter().renderHeight = 272 * zoom; } - UpdateSize(); + if (UpdateSize() || g_Config.iRenderingMode == FB_NON_BUFFERED_MODE) { + DestroyAllFBOs(); + } resized_ = false; #ifdef _WIN32 @@ -1192,7 +1191,6 @@ void FramebufferManagerGLES::EndFrame() { ShowScreenResolution(); } #endif - ClearBuffer(); DestroyDraw2DProgram(); SetLineWidth(); } diff --git a/GPU/Vulkan/FramebufferVulkan.cpp b/GPU/Vulkan/FramebufferVulkan.cpp index e3be6cec11..d7be33ab65 100644 --- a/GPU/Vulkan/FramebufferVulkan.cpp +++ b/GPU/Vulkan/FramebufferVulkan.cpp @@ -1039,9 +1039,6 @@ void FramebufferManagerVulkan::BeginFrameVulkan() { void FramebufferManagerVulkan::EndFrame() { if (resized_) { - // TODO: Only do this if the new size actually changed the renderwidth/height. - DestroyAllFBOs(); - // Check if postprocessing shader is doing upscaling as it requires native resolution const ShaderInfo *shaderInfo = 0; if (g_Config.sPostShaderName != "Off") { @@ -1073,7 +1070,9 @@ void FramebufferManagerVulkan::EndFrame() { PSP_CoreParameter().renderHeight = 272 * zoom; } - UpdateSize(); + if (UpdateSize() || g_Config.iRenderingMode == FB_NON_BUFFERED_MODE) { + DestroyAllFBOs(); + } resized_ = false; #ifdef _WIN32 @@ -1082,7 +1081,6 @@ void FramebufferManagerVulkan::EndFrame() { ShowScreenResolution(); } #endif - ClearBuffer(); } // We flush to memory last requested framebuffer, if any.