From d9ee06a60d52bbeec06d7fcc988b7960a0e987d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 7 Nov 2020 00:56:48 +0100 Subject: [PATCH] Reorganize the DeviceLost code a little. FramebufferManagerCommon now sees it. --- Common/GPU/Vulkan/thin3d_vulkan.cpp | 2 ++ GPU/Common/FramebufferManagerCommon.cpp | 11 +++++++++++ GPU/Common/FramebufferManagerCommon.h | 3 +++ GPU/D3D11/FramebufferManagerD3D11.cpp | 4 ---- GPU/D3D11/FramebufferManagerD3D11.h | 1 - GPU/D3D11/GPU_D3D11.cpp | 4 +++- GPU/Directx9/FramebufferManagerDX9.cpp | 4 ---- GPU/Directx9/FramebufferManagerDX9.h | 1 - GPU/Directx9/GPU_DX9.cpp | 4 ++-- GPU/GLES/FramebufferManagerGLES.cpp | 8 +++----- GPU/GLES/FramebufferManagerGLES.h | 7 ++++--- GPU/GLES/GPU_GLES.cpp | 9 +++------ GPU/GPUCommon.cpp | 12 ++++++++++++ GPU/GPUCommon.h | 3 +++ GPU/Vulkan/FramebufferManagerVulkan.cpp | 11 ++++------- GPU/Vulkan/FramebufferManagerVulkan.h | 5 +++-- GPU/Vulkan/GPU_Vulkan.cpp | 7 +++---- 17 files changed, 56 insertions(+), 40 deletions(-) diff --git a/Common/GPU/Vulkan/thin3d_vulkan.cpp b/Common/GPU/Vulkan/thin3d_vulkan.cpp index eabd2b0a72..e59f88d42c 100644 --- a/Common/GPU/Vulkan/thin3d_vulkan.cpp +++ b/Common/GPU/Vulkan/thin3d_vulkan.cpp @@ -465,6 +465,8 @@ public: uint64_t GetNativeObject(NativeObject obj) override { switch (obj) { + case NativeObject::CONTEXT: + return (uint64_t)vulkan_; case NativeObject::FRAMEBUFFER_RENDERPASS: // Return a representative renderpass. return (uint64_t)renderManager_.GetFramebufferRenderPass(); diff --git a/GPU/Common/FramebufferManagerCommon.cpp b/GPU/Common/FramebufferManagerCommon.cpp index 566128150c..9419a0c87a 100644 --- a/GPU/Common/FramebufferManagerCommon.cpp +++ b/GPU/Common/FramebufferManagerCommon.cpp @@ -2102,3 +2102,14 @@ std::vector FramebufferManagerCommon::GetFramebufferList() { return list; } + +void FramebufferManagerCommon::DeviceLost() { + DestroyAllFBOs(); + presentation_->DeviceLost(); + draw_ = nullptr; +} + +void FramebufferManagerCommon::DeviceRestore(Draw::DrawContext *draw) { + draw_ = draw; + presentation_->DeviceRestore(draw); +} diff --git a/GPU/Common/FramebufferManagerCommon.h b/GPU/Common/FramebufferManagerCommon.h index 3f3388bb17..fd5ce18f7b 100644 --- a/GPU/Common/FramebufferManagerCommon.h +++ b/GPU/Common/FramebufferManagerCommon.h @@ -305,6 +305,9 @@ public: virtual void Resized(); virtual void DestroyAllFBOs(); + virtual void DeviceLost(); + virtual void DeviceRestore(Draw::DrawContext *draw); + Draw::Framebuffer *GetTempFBO(TempFBO reason, u16 w, u16 h); // Debug features diff --git a/GPU/D3D11/FramebufferManagerD3D11.cpp b/GPU/D3D11/FramebufferManagerD3D11.cpp index 2a90aaa4e4..85c4896a92 100644 --- a/GPU/D3D11/FramebufferManagerD3D11.cpp +++ b/GPU/D3D11/FramebufferManagerD3D11.cpp @@ -468,7 +468,3 @@ void FramebufferManagerD3D11::PackDepthbuffer(VirtualFramebuffer *vfb, int x, in void FramebufferManagerD3D11::EndFrame() { } - -void FramebufferManagerD3D11::DeviceLost() { - DestroyAllFBOs(); -} diff --git a/GPU/D3D11/FramebufferManagerD3D11.h b/GPU/D3D11/FramebufferManagerD3D11.h index a8a4089198..6f8922fbe8 100644 --- a/GPU/D3D11/FramebufferManagerD3D11.h +++ b/GPU/D3D11/FramebufferManagerD3D11.h @@ -42,7 +42,6 @@ public: 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 EndFrame(); - void DeviceLost(); void ReformatFramebufferFrom(VirtualFramebuffer *vfb, GEBufferFormat old) override; void BindFramebufferAsColorTexture(int stage, VirtualFramebuffer *framebuffer, int flags); diff --git a/GPU/D3D11/GPU_D3D11.cpp b/GPU/D3D11/GPU_D3D11.cpp index 63940fab8d..6207358c73 100644 --- a/GPU/D3D11/GPU_D3D11.cpp +++ b/GPU/D3D11/GPU_D3D11.cpp @@ -198,10 +198,12 @@ void GPU_D3D11::DeviceLost() { shaderManagerD3D11_->ClearShaders(); drawEngine_.ClearInputLayoutMap(); textureCacheD3D11_->Clear(false); - framebufferManagerD3D11_->DeviceLost(); + + GPUCommon::DeviceLost(); } void GPU_D3D11::DeviceRestore() { + GPUCommon::DeviceRestore(); // Nothing needed. } diff --git a/GPU/Directx9/FramebufferManagerDX9.cpp b/GPU/Directx9/FramebufferManagerDX9.cpp index 951406c80d..a820c3ece0 100644 --- a/GPU/Directx9/FramebufferManagerDX9.cpp +++ b/GPU/Directx9/FramebufferManagerDX9.cpp @@ -559,10 +559,6 @@ static const D3DVERTEXELEMENT9 g_FramebufferVertexElements[] = { void FramebufferManagerDX9::EndFrame() { } - void FramebufferManagerDX9::DeviceLost() { - DestroyAllFBOs(); - } - void FramebufferManagerDX9::DecimateFBOs() { FramebufferManagerCommon::DecimateFBOs(); for (auto it = offscreenSurfaces_.begin(); it != offscreenSurfaces_.end(); ) { diff --git a/GPU/Directx9/FramebufferManagerDX9.h b/GPU/Directx9/FramebufferManagerDX9.h index 3a8578599a..24ea2b0e28 100644 --- a/GPU/Directx9/FramebufferManagerDX9.h +++ b/GPU/Directx9/FramebufferManagerDX9.h @@ -47,7 +47,6 @@ public: void DestroyAllFBOs(); void EndFrame(); - void DeviceLost(); void ReformatFramebufferFrom(VirtualFramebuffer *vfb, GEBufferFormat old) override; void BindFramebufferAsColorTexture(int stage, VirtualFramebuffer *framebuffer, int flags); diff --git a/GPU/Directx9/GPU_DX9.cpp b/GPU/Directx9/GPU_DX9.cpp index b2f2b5aa11..ec9cf20385 100644 --- a/GPU/Directx9/GPU_DX9.cpp +++ b/GPU/Directx9/GPU_DX9.cpp @@ -242,13 +242,13 @@ void GPU_DX9::BuildReportingInfo() { void GPU_DX9::DeviceLost() { // Simply drop all caches and textures. - // FBOs appear to survive? Or no? shaderManagerDX9_->ClearCache(false); textureCacheDX9_->Clear(false); - framebufferManagerDX9_->DeviceLost(); + GPUCommon::DeviceLost(); } void GPU_DX9::DeviceRestore() { + GPUCommon::DeviceRestore(); // Nothing needed. } diff --git a/GPU/GLES/FramebufferManagerGLES.cpp b/GPU/GLES/FramebufferManagerGLES.cpp index 6d625b2de5..8e6a8e2233 100644 --- a/GPU/GLES/FramebufferManagerGLES.cpp +++ b/GPU/GLES/FramebufferManagerGLES.cpp @@ -389,16 +389,14 @@ void FramebufferManagerGLES::EndFrame() { } void FramebufferManagerGLES::DeviceLost() { - DestroyAllFBOs(); + FramebufferManagerCommon::DeviceLost(); DestroyDeviceObjects(); - presentation_->DeviceLost(); } void FramebufferManagerGLES::DeviceRestore(Draw::DrawContext *draw) { - draw_ = draw; - presentation_->DeviceRestore(draw); - render_ = (GLRenderManager *)draw_->GetNativeObject(Draw::NativeObject::RENDER_MANAGER); + FramebufferManagerCommon::DeviceRestore(draw); CreateDeviceObjects(); + render_ = (GLRenderManager *)draw_->GetNativeObject(Draw::NativeObject::RENDER_MANAGER); } void FramebufferManagerGLES::Resized() { diff --git a/GPU/GLES/FramebufferManagerGLES.h b/GPU/GLES/FramebufferManagerGLES.h index 51d44af73c..f87c707ab8 100644 --- a/GPU/GLES/FramebufferManagerGLES.h +++ b/GPU/GLES/FramebufferManagerGLES.h @@ -46,7 +46,10 @@ public: virtual void Init() override; void EndFrame(); void Resized() override; - void DeviceLost(); + + void DeviceLost() override; + void DeviceRestore(Draw::DrawContext *draw) override; + void ReformatFramebufferFrom(VirtualFramebuffer *vfb, GEBufferFormat old) override; // For use when texturing from a framebuffer. May create a duplicate if target. @@ -56,8 +59,6 @@ public: bool GetOutputFramebuffer(GPUDebugBuffer &buffer) override; - void DeviceRestore(Draw::DrawContext *draw); - protected: // Used by ReadFramebufferToMemory and later framebuffer block copies void BlitFramebuffer(VirtualFramebuffer *dst, int dstX, int dstY, VirtualFramebuffer *src, int srcX, int srcY, int w, int h, int bpp) override; diff --git a/GPU/GLES/GPU_GLES.cpp b/GPU/GLES/GPU_GLES.cpp index fb18350c1e..ea55a990ed 100644 --- a/GPU/GLES/GPU_GLES.cpp +++ b/GPU/GLES/GPU_GLES.cpp @@ -300,21 +300,18 @@ void GPU_GLES::DeviceLost() { fragmentTestCache_.DeviceLost(); depalShaderCache_.DeviceLost(); drawEngine_.DeviceLost(); - framebufferManagerGL_->DeviceLost(); - // Don't even try to access the lost device. - draw_ = nullptr; + + GPUCommon::DeviceLost(); } void GPU_GLES::DeviceRestore() { - draw_ = (Draw::DrawContext *)PSP_CoreParameter().graphicsContext->GetDrawContext(); - INFO_LOG(G3D, "GPU_GLES: DeviceRestore"); + GPUCommon::DeviceRestore(); UpdateCmdInfo(); UpdateVsyncInterval(true); shaderManagerGL_->DeviceRestore(draw_); textureCacheGL_->DeviceRestore(draw_); - framebufferManagerGL_->DeviceRestore(draw_); drawEngine_.DeviceRestore(draw_); fragmentTestCache_.DeviceRestore(draw_); depalShaderCache_.DeviceRestore(draw_); diff --git a/GPU/GPUCommon.cpp b/GPU/GPUCommon.cpp index a77a8269ad..b32e26f785 100644 --- a/GPU/GPUCommon.cpp +++ b/GPU/GPUCommon.cpp @@ -468,6 +468,18 @@ void GPUCommon::Reinitialize() { framebufferManager_->DestroyAllFBOs(); } +// Call at the END of the GPU implementation's DeviceLost +void GPUCommon::DeviceLost() { + framebufferManager_->DeviceLost(); + draw_ = nullptr; +} + +// Call at the start of the GPU implementation's DeviceRestore +void GPUCommon::DeviceRestore() { + draw_ = (Draw::DrawContext *)PSP_CoreParameter().graphicsContext->GetDrawContext(); + framebufferManager_->DeviceRestore(draw_); +} + void GPUCommon::UpdateVsyncInterval(bool force) { #if !(PPSSPP_PLATFORM(ANDROID) || defined(USING_QT_UI) || PPSSPP_PLATFORM(UWP) || PPSSPP_PLATFORM(IOS)) int desiredVSyncInterval = g_Config.bVSync ? 1 : 0; diff --git a/GPU/GPUCommon.h b/GPU/GPUCommon.h index f5ff5b87c4..14c0cf4eb9 100644 --- a/GPU/GPUCommon.h +++ b/GPU/GPUCommon.h @@ -260,6 +260,9 @@ public: } protected: + void DeviceLost() override; + void DeviceRestore() override; + void SetDrawType(DrawType type, GEPrimitiveType prim) { if (type != lastDraw_) { // We always flush when drawing splines/beziers so no need to do so here diff --git a/GPU/Vulkan/FramebufferManagerVulkan.cpp b/GPU/Vulkan/FramebufferManagerVulkan.cpp index d04021ff58..1b1c5ae65c 100644 --- a/GPU/Vulkan/FramebufferManagerVulkan.cpp +++ b/GPU/Vulkan/FramebufferManagerVulkan.cpp @@ -388,15 +388,12 @@ void FramebufferManagerVulkan::EndFrame() { } void FramebufferManagerVulkan::DeviceLost() { - DestroyAllFBOs(); + FramebufferManagerCommon::DeviceLost(); DestroyDeviceObjects(); - presentation_->DeviceLost(); } -void FramebufferManagerVulkan::DeviceRestore(VulkanContext *vulkan, Draw::DrawContext *draw) { - vulkan_ = vulkan; - draw_ = draw; - presentation_->DeviceRestore(draw); - +void FramebufferManagerVulkan::DeviceRestore(Draw::DrawContext *draw) { + FramebufferManagerCommon::DeviceRestore(draw); + vulkan_ = (VulkanContext *)draw->GetNativeObject(Draw::NativeObject::CONTEXT); InitDeviceObjects(); } diff --git a/GPU/Vulkan/FramebufferManagerVulkan.h b/GPU/Vulkan/FramebufferManagerVulkan.h index a653aeb15d..9ba0f0fb1d 100644 --- a/GPU/Vulkan/FramebufferManagerVulkan.h +++ b/GPU/Vulkan/FramebufferManagerVulkan.h @@ -49,8 +49,9 @@ public: void BeginFrameVulkan(); // there's a BeginFrame in the base class, which this calls void EndFrame(); - void DeviceLost(); - void DeviceRestore(VulkanContext *vulkan, Draw::DrawContext *draw); + void DeviceLost() override; + void DeviceRestore(Draw::DrawContext *draw) override; + int GetLineWidth(); void ReformatFramebufferFrom(VirtualFramebuffer *vfb, GEBufferFormat old) override; diff --git a/GPU/Vulkan/GPU_Vulkan.cpp b/GPU/Vulkan/GPU_Vulkan.cpp index 0f06c1a970..afdebeef05 100644 --- a/GPU/Vulkan/GPU_Vulkan.cpp +++ b/GPU/Vulkan/GPU_Vulkan.cpp @@ -526,26 +526,25 @@ void GPU_Vulkan::DeviceLost() { SaveCache(shaderCachePath_); } DestroyDeviceObjects(); - framebufferManagerVulkan_->DeviceLost(); vulkan2D_.DeviceLost(); drawEngine_.DeviceLost(); pipelineManager_->DeviceLost(); textureCacheVulkan_->DeviceLost(); depalShaderCache_.DeviceLost(); shaderManagerVulkan_->ClearShaders(); - draw_ = nullptr; + + GPUCommon::DeviceLost(); } void GPU_Vulkan::DeviceRestore() { + GPUCommon::DeviceRestore(); vulkan_ = (VulkanContext *)PSP_CoreParameter().graphicsContext->GetAPIContext(); - draw_ = (Draw::DrawContext *)PSP_CoreParameter().graphicsContext->GetDrawContext(); InitDeviceObjects(); CheckGPUFeatures(); BuildReportingInfo(); UpdateCmdInfo(); - framebufferManagerVulkan_->DeviceRestore(vulkan_, draw_); vulkan2D_.DeviceRestore(vulkan_); drawEngine_.DeviceRestore(vulkan_, draw_); pipelineManager_->DeviceRestore(vulkan_);