From 22e46b51c2037897835b87b3c71a7b4ac9130f70 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Wed, 13 May 2020 00:06:13 -0700 Subject: [PATCH] GPU: Centralize DestroyAllFBOs(). This cleans up the postshader update code. --- GPU/Common/FramebufferCommon.cpp | 33 +++++++++++++++++++++--- GPU/Common/FramebufferCommon.h | 1 + GPU/D3D11/FramebufferManagerD3D11.cpp | 36 --------------------------- GPU/D3D11/FramebufferManagerD3D11.h | 3 --- GPU/D3D11/GPU_D3D11.cpp | 5 ++-- GPU/Directx9/FramebufferDX9.cpp | 27 +------------------- GPU/Directx9/FramebufferDX9.h | 1 - GPU/Directx9/GPU_DX9.cpp | 5 ++-- GPU/GLES/FramebufferManagerGLES.cpp | 31 ----------------------- GPU/GLES/FramebufferManagerGLES.h | 2 -- GPU/GLES/GPU_GLES.cpp | 7 +++--- GPU/GPUCommon.cpp | 5 ++++ GPU/GPUCommon.h | 8 +++--- GPU/Vulkan/FramebufferVulkan.cpp | 36 --------------------------- GPU/Vulkan/FramebufferVulkan.h | 3 --- GPU/Vulkan/GPU_Vulkan.cpp | 6 ++--- 16 files changed, 52 insertions(+), 157 deletions(-) diff --git a/GPU/Common/FramebufferCommon.cpp b/GPU/Common/FramebufferCommon.cpp index a4becc95a..e3d794b3e 100644 --- a/GPU/Common/FramebufferCommon.cpp +++ b/GPU/Common/FramebufferCommon.cpp @@ -839,9 +839,6 @@ void FramebufferManagerCommon::CopyDisplayToOutput(bool reallyDirty) { u32 offsetX = 0; u32 offsetY = 0; - CardboardSettings cardboardSettings; - presentation_->GetCardboardSettings(&cardboardSettings); - // If it's not really dirty, we're probably frameskipping. Use the last working one. u32 fbaddr = reallyDirty ? displayFramebufPtr_ : prevDisplayFramebufPtr_; prevDisplayFramebufPtr_ = fbaddr; @@ -1705,6 +1702,13 @@ void FramebufferManagerCommon::Resized() { gstate_c.skipDrawReason &= ~SKIPDRAW_NON_DISPLAYED_FB; + if (UpdateSize()) { + DestroyAllFBOs(); + } + + // Might have a new post shader - let's compile it. + presentation_->UpdatePostShader(); + #ifdef _WIN32 // Seems related - if you're ok with numbers all the time, show some more :) if (g_Config.iShowFPSCounter != 0) { @@ -1713,6 +1717,29 @@ void FramebufferManagerCommon::Resized() { #endif } +void FramebufferManagerCommon::DestroyAllFBOs() { + currentRenderVfb_ = nullptr; + displayFramebuf_ = nullptr; + prevDisplayFramebuf_ = nullptr; + prevPrevDisplayFramebuf_ = nullptr; + + for (VirtualFramebuffer *vfb : vfbs_) { + INFO_LOG(FRAMEBUF, "Destroying FBO for %08x : %i x %i x %i", vfb->fb_address, vfb->width, vfb->height, vfb->format); + DestroyFramebuf(vfb); + } + vfbs_.clear(); + + for (VirtualFramebuffer *vfb : bvfbs_) { + DestroyFramebuf(vfb); + } + bvfbs_.clear(); + + for (auto &tempFB : tempFBOs_) { + tempFB.second.fbo->Release(); + } + tempFBOs_.clear(); +} + Draw::Framebuffer *FramebufferManagerCommon::GetTempFBO(TempFBO reason, u16 w, u16 h, Draw::FBColorDepth depth) { u64 key = ((u64)reason << 48) | ((u64)depth << 32) | ((u32)w << 16) | h; auto it = tempFBOs_.find(key); diff --git a/GPU/Common/FramebufferCommon.h b/GPU/Common/FramebufferCommon.h index a62068a64..72cd4dd15 100644 --- a/GPU/Common/FramebufferCommon.h +++ b/GPU/Common/FramebufferCommon.h @@ -296,6 +296,7 @@ public: void SetSafeSize(u16 w, u16 h); virtual void Resized(); + virtual void DestroyAllFBOs(); Draw::Framebuffer *GetTempFBO(TempFBO reason, u16 w, u16 h, Draw::FBColorDepth colorDepth = Draw::FBO_8888); diff --git a/GPU/D3D11/FramebufferManagerD3D11.cpp b/GPU/D3D11/FramebufferManagerD3D11.cpp index 055f3d535..6bca9211b 100644 --- a/GPU/D3D11/FramebufferManagerD3D11.cpp +++ b/GPU/D3D11/FramebufferManagerD3D11.cpp @@ -498,39 +498,3 @@ void FramebufferManagerD3D11::EndFrame() { void FramebufferManagerD3D11::DeviceLost() { DestroyAllFBOs(); } - -void FramebufferManagerD3D11::DestroyAllFBOs() { - currentRenderVfb_ = nullptr; - displayFramebuf_ = nullptr; - prevDisplayFramebuf_ = nullptr; - prevPrevDisplayFramebuf_ = nullptr; - - for (size_t i = 0; i < vfbs_.size(); ++i) { - VirtualFramebuffer *vfb = vfbs_[i]; - INFO_LOG(FRAMEBUF, "Destroying FBO for %08x : %i x %i x %i", vfb->fb_address, vfb->width, vfb->height, vfb->format); - DestroyFramebuf(vfb); - } - vfbs_.clear(); - - for (size_t i = 0; i < bvfbs_.size(); ++i) { - VirtualFramebuffer *vfb = bvfbs_[i]; - DestroyFramebuf(vfb); - } - bvfbs_.clear(); - - for (auto &tempFB : tempFBOs_) { - tempFB.second.fbo->Release(); - } - tempFBOs_.clear(); -} - -void FramebufferManagerD3D11::Resized() { - FramebufferManagerCommon::Resized(); - - if (UpdateSize()) { - DestroyAllFBOs(); - } - - // Might have a new post shader - let's compile it. - presentation_->UpdatePostShader(); -} diff --git a/GPU/D3D11/FramebufferManagerD3D11.h b/GPU/D3D11/FramebufferManagerD3D11.h index eaacc6070..aa8641bb1 100644 --- a/GPU/D3D11/FramebufferManagerD3D11.h +++ b/GPU/D3D11/FramebufferManagerD3D11.h @@ -41,10 +41,7 @@ public: void SetDrawEngine(DrawEngineD3D11 *td); void DrawActiveTexture(float x, float y, float w, float h, float destW, float destH, float u0, float v0, float u1, float v1, int uvRotation, int flags) override; - void DestroyAllFBOs(); - void EndFrame(); - void Resized() override; void DeviceLost(); void ReformatFramebufferFrom(VirtualFramebuffer *vfb, GEBufferFormat old) override; diff --git a/GPU/D3D11/GPU_D3D11.cpp b/GPU/D3D11/GPU_D3D11.cpp index 207cc52f5..29faefeef 100644 --- a/GPU/D3D11/GPU_D3D11.cpp +++ b/GPU/D3D11/GPU_D3D11.cpp @@ -359,11 +359,12 @@ void GPU_D3D11::DoState(PointerWrap &p) { // TODO: Some of these things may not be necessary. // None of these are necessary when saving. if (p.mode == p.MODE_READ && !PSP_CoreParameter().frozen) { - textureCacheD3D11_->Clear(true); + textureCache_->Clear(true); + depalShaderCache_->Clear(); drawEngine_.ClearTrackedVertexArrays(); gstate_c.Dirty(DIRTY_TEXTURE_IMAGE); - framebufferManagerD3D11_->DestroyAllFBOs(); + framebufferManager_->DestroyAllFBOs(); } } diff --git a/GPU/Directx9/FramebufferDX9.cpp b/GPU/Directx9/FramebufferDX9.cpp index 46bb1d6a2..877b196e6 100644 --- a/GPU/Directx9/FramebufferDX9.cpp +++ b/GPU/Directx9/FramebufferDX9.cpp @@ -597,23 +597,7 @@ static const D3DVERTEXELEMENT9 g_FramebufferVertexElements[] = { } void FramebufferManagerDX9::DestroyAllFBOs() { - currentRenderVfb_ = 0; - displayFramebuf_ = 0; - prevDisplayFramebuf_ = 0; - prevPrevDisplayFramebuf_ = 0; - - for (size_t i = 0; i < vfbs_.size(); ++i) { - VirtualFramebuffer *vfb = vfbs_[i]; - INFO_LOG(FRAMEBUF, "Destroying FBO for %08x : %i x %i x %i", vfb->fb_address, vfb->width, vfb->height, vfb->format); - DestroyFramebuf(vfb); - } - vfbs_.clear(); - - for (size_t i = 0; i < bvfbs_.size(); ++i) { - VirtualFramebuffer *vfb = bvfbs_[i]; - DestroyFramebuf(vfb); - } - bvfbs_.clear(); + FramebufferManagerCommon::DestroyAllFBOs(); for (auto &it : offscreenSurfaces_) { it.second.surface->Release(); @@ -621,15 +605,6 @@ static const D3DVERTEXELEMENT9 g_FramebufferVertexElements[] = { offscreenSurfaces_.clear(); } - void FramebufferManagerDX9::Resized() { - FramebufferManagerCommon::Resized(); - - if (UpdateSize()) { - DestroyAllFBOs(); - } - presentation_->UpdatePostShader(); - } - bool FramebufferManagerDX9::GetFramebuffer(u32 fb_address, int fb_stride, GEBufferFormat fb_format, GPUDebugBuffer &buffer, int maxRes) { VirtualFramebuffer *vfb = currentRenderVfb_; if (!vfb) { diff --git a/GPU/Directx9/FramebufferDX9.h b/GPU/Directx9/FramebufferDX9.h index 592ed3f11..3de91750c 100644 --- a/GPU/Directx9/FramebufferDX9.h +++ b/GPU/Directx9/FramebufferDX9.h @@ -47,7 +47,6 @@ public: void DestroyAllFBOs(); void EndFrame(); - void Resized() override; void DeviceLost(); void ReformatFramebufferFrom(VirtualFramebuffer *vfb, GEBufferFormat old) override; diff --git a/GPU/Directx9/GPU_DX9.cpp b/GPU/Directx9/GPU_DX9.cpp index 162e7ed71..1b4aaf857 100644 --- a/GPU/Directx9/GPU_DX9.cpp +++ b/GPU/Directx9/GPU_DX9.cpp @@ -396,11 +396,12 @@ void GPU_DX9::DoState(PointerWrap &p) { // TODO: Some of these things may not be necessary. // None of these are necessary when saving. if (p.mode == p.MODE_READ && !PSP_CoreParameter().frozen) { - textureCacheDX9_->Clear(true); + textureCache_->Clear(true); + depalShaderCache_.Clear(); drawEngine_.ClearTrackedVertexArrays(); gstate_c.Dirty(DIRTY_TEXTURE_IMAGE); - framebufferManagerDX9_->DestroyAllFBOs(); + framebufferManager_->DestroyAllFBOs(); } } diff --git a/GPU/GLES/FramebufferManagerGLES.cpp b/GPU/GLES/FramebufferManagerGLES.cpp index efaa14426..0800a8b91 100644 --- a/GPU/GLES/FramebufferManagerGLES.cpp +++ b/GPU/GLES/FramebufferManagerGLES.cpp @@ -449,41 +449,10 @@ void FramebufferManagerGLES::DeviceRestore(Draw::DrawContext *draw) { CreateDeviceObjects(); } -void FramebufferManagerGLES::DestroyAllFBOs() { - currentRenderVfb_ = 0; - displayFramebuf_ = 0; - prevDisplayFramebuf_ = 0; - prevPrevDisplayFramebuf_ = 0; - - for (size_t i = 0; i < vfbs_.size(); ++i) { - VirtualFramebuffer *vfb = vfbs_[i]; - INFO_LOG(FRAMEBUF, "Destroying FBO for %08x : %i x %i x %i", vfb->fb_address, vfb->width, vfb->height, vfb->format); - DestroyFramebuf(vfb); - } - vfbs_.clear(); - - for (size_t i = 0; i < bvfbs_.size(); ++i) { - VirtualFramebuffer *vfb = bvfbs_[i]; - DestroyFramebuf(vfb); - } - bvfbs_.clear(); - - for (auto &tempFB : tempFBOs_) { - tempFB.second.fbo->Release(); - } - tempFBOs_.clear(); -} - void FramebufferManagerGLES::Resized() { FramebufferManagerCommon::Resized(); render_->Resize(PSP_CoreParameter().pixelWidth, PSP_CoreParameter().pixelHeight); - if (UpdateSize()) { - DestroyAllFBOs(); - } - - // Might have a new post shader - let's compile it. - presentation_->UpdatePostShader(); // render_->SetLineWidth(renderWidth_ / 480.0f); } diff --git a/GPU/GLES/FramebufferManagerGLES.h b/GPU/GLES/FramebufferManagerGLES.h index 7068c0179..33d364fe7 100644 --- a/GPU/GLES/FramebufferManagerGLES.h +++ b/GPU/GLES/FramebufferManagerGLES.h @@ -43,8 +43,6 @@ public: // x,y,w,h are relative to destW, destH which fill out the target completely. void DrawActiveTexture(float x, float y, float w, float h, float destW, float destH, float u0, float v0, float u1, float v1, int uvRotation, int flags) override; - void DestroyAllFBOs(); - virtual void Init() override; void EndFrame(); void Resized() override; diff --git a/GPU/GLES/GPU_GLES.cpp b/GPU/GLES/GPU_GLES.cpp index b956fcabb..81a53c3dc 100644 --- a/GPU/GLES/GPU_GLES.cpp +++ b/GPU/GLES/GPU_GLES.cpp @@ -342,9 +342,7 @@ void GPU_GLES::DeviceRestore() { void GPU_GLES::Reinitialize() { GPUCommon::Reinitialize(); - textureCacheGL_->Clear(true); depalShaderCache_.Clear(); - framebufferManagerGL_->DestroyAllFBOs(); } void GPU_GLES::InitClear() { @@ -510,11 +508,12 @@ void GPU_GLES::DoState(PointerWrap &p) { // None of these are necessary when saving. // In Freeze-Frame mode, we don't want to do any of this. if (p.mode == p.MODE_READ && !PSP_CoreParameter().frozen) { - textureCacheGL_->Clear(true); + textureCache_->Clear(true); + depalShaderCache_.Clear(); drawEngine_.ClearTrackedVertexArrays(); gstate_c.Dirty(DIRTY_TEXTURE_IMAGE); - framebufferManagerGL_->DestroyAllFBOs(); + framebufferManager_->DestroyAllFBOs(); } } diff --git a/GPU/GPUCommon.cpp b/GPU/GPUCommon.cpp index 094112a09..a7c25ad4a 100644 --- a/GPU/GPUCommon.cpp +++ b/GPU/GPUCommon.cpp @@ -459,6 +459,11 @@ void GPUCommon::Reinitialize() { busyTicks = 0; timeSpentStepping_ = 0.0; interruptsEnabled_ = true; + + if (textureCache_) + textureCache_->Clear(true); + if (framebufferManager_) + framebufferManager_->DestroyAllFBOs(); } void GPUCommon::UpdateVsyncInterval(bool force) { diff --git a/GPU/GPUCommon.h b/GPU/GPUCommon.h index 39fa5e28a..7dff718c3 100644 --- a/GPU/GPUCommon.h +++ b/GPU/GPUCommon.h @@ -303,10 +303,10 @@ protected: } } - FramebufferManagerCommon *framebufferManager_; - TextureCacheCommon *textureCache_; - DrawEngineCommon *drawEngineCommon_; - ShaderManagerCommon *shaderManager_; + FramebufferManagerCommon *framebufferManager_ = nullptr; + TextureCacheCommon *textureCache_ = nullptr; + DrawEngineCommon *drawEngineCommon_ = nullptr; + ShaderManagerCommon *shaderManager_ = nullptr; GraphicsContext *gfxCtx_; Draw::DrawContext *draw_; diff --git a/GPU/Vulkan/FramebufferVulkan.cpp b/GPU/Vulkan/FramebufferVulkan.cpp index f8f6e1cf7..5bb733ddb 100644 --- a/GPU/Vulkan/FramebufferVulkan.cpp +++ b/GPU/Vulkan/FramebufferVulkan.cpp @@ -448,39 +448,3 @@ void FramebufferManagerVulkan::DeviceRestore(VulkanContext *vulkan, Draw::DrawCo InitDeviceObjects(); } - -void FramebufferManagerVulkan::DestroyAllFBOs() { - currentRenderVfb_ = 0; - displayFramebuf_ = 0; - prevDisplayFramebuf_ = 0; - prevPrevDisplayFramebuf_ = 0; - - for (size_t i = 0; i < vfbs_.size(); ++i) { - VirtualFramebuffer *vfb = vfbs_[i]; - INFO_LOG(FRAMEBUF, "Destroying FBO for %08x : %i x %i x %i", vfb->fb_address, vfb->width, vfb->height, vfb->format); - DestroyFramebuf(vfb); - } - vfbs_.clear(); - - for (size_t i = 0; i < bvfbs_.size(); ++i) { - VirtualFramebuffer *vfb = bvfbs_[i]; - DestroyFramebuf(vfb); - } - bvfbs_.clear(); - - for (auto &tempFB : tempFBOs_) { - tempFB.second.fbo->Release(); - } - tempFBOs_.clear(); -} - -void FramebufferManagerVulkan::Resized() { - FramebufferManagerCommon::Resized(); - - if (UpdateSize()) { - DestroyAllFBOs(); - } - - // Might have a new post shader - let's compile it. - presentation_->UpdatePostShader(); -} diff --git a/GPU/Vulkan/FramebufferVulkan.h b/GPU/Vulkan/FramebufferVulkan.h index 0a357d970..d17d83621 100644 --- a/GPU/Vulkan/FramebufferVulkan.h +++ b/GPU/Vulkan/FramebufferVulkan.h @@ -46,14 +46,11 @@ public: // x,y,w,h are relative to destW, destH which fill out the target completely. void DrawActiveTexture(float x, float y, float w, float h, float destW, float destH, float u0, float v0, float u1, float v1, int uvRotation, int flags) override; - void DestroyAllFBOs(); - virtual void Init() override; void BeginFrameVulkan(); // there's a BeginFrame in the base class, which this calls void EndFrame(); - void Resized() override; void DeviceLost(); void DeviceRestore(VulkanContext *vulkan, Draw::DrawContext *draw); int GetLineWidth(); diff --git a/GPU/Vulkan/GPU_Vulkan.cpp b/GPU/Vulkan/GPU_Vulkan.cpp index a1ba5e45c..6cd2493f5 100644 --- a/GPU/Vulkan/GPU_Vulkan.cpp +++ b/GPU/Vulkan/GPU_Vulkan.cpp @@ -413,9 +413,7 @@ void GPU_Vulkan::BuildReportingInfo() { void GPU_Vulkan::Reinitialize() { GPUCommon::Reinitialize(); - textureCacheVulkan_->Clear(true); depalShaderCache_.Clear(); - framebufferManagerVulkan_->DestroyAllFBOs(); } void GPU_Vulkan::InitClear() { @@ -613,11 +611,11 @@ void GPU_Vulkan::DoState(PointerWrap &p) { // None of these are necessary when saving. // In Freeze-Frame mode, we don't want to do any of this. if (p.mode == p.MODE_READ && !PSP_CoreParameter().frozen) { - textureCacheVulkan_->Clear(true); + textureCache_->Clear(true); depalShaderCache_.Clear(); gstate_c.Dirty(DIRTY_TEXTURE_IMAGE); - framebufferManagerVulkan_->DestroyAllFBOs(); + framebufferManager_->DestroyAllFBOs(); } }