From 97620d4cca424e738d8be445c6d81bb2c766c3ce Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Mon, 24 Apr 2017 01:05:58 -0700 Subject: [PATCH 1/7] GPU: Rebuild FBOs when they now have storage. --- GPU/Common/FramebufferCommon.cpp | 4 ++-- GPU/D3D11/FramebufferManagerD3D11.cpp | 2 +- GPU/Directx9/FramebufferDX9.cpp | 2 +- GPU/GLES/FramebufferManagerGLES.cpp | 2 +- GPU/Vulkan/FramebufferVulkan.cpp | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/GPU/Common/FramebufferCommon.cpp b/GPU/Common/FramebufferCommon.cpp index 484c9d0de4..6f2fc3827a 100644 --- a/GPU/Common/FramebufferCommon.cpp +++ b/GPU/Common/FramebufferCommon.cpp @@ -142,7 +142,7 @@ void FramebufferManagerCommon::Init() { 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; + const bool newSettings = bloomHack_ != g_Config.iBloomHack || trueColor_ != g_Config.bTrueColor || useBufferedRendering_ != (g_Config.iRenderingMode != FB_NON_BUFFERED_MODE); renderWidth_ = (float)PSP_CoreParameter().renderWidth; renderHeight_ = (float)PSP_CoreParameter().renderHeight; @@ -150,6 +150,7 @@ bool FramebufferManagerCommon::UpdateSize() { pixelHeight_ = PSP_CoreParameter().pixelHeight; bloomHack_ = g_Config.iBloomHack; trueColor_ = g_Config.bTrueColor; + useBufferedRendering_ = g_Config.iRenderingMode != FB_NON_BUFFERED_MODE; return newRender || newSettings; } @@ -157,7 +158,6 @@ bool FramebufferManagerCommon::UpdateSize() { void FramebufferManagerCommon::BeginFrame() { DecimateFBOs(); currentRenderVfb_ = 0; - useBufferedRendering_ = g_Config.iRenderingMode != FB_NON_BUFFERED_MODE; updateVRAM_ = !(g_Config.iRenderingMode == FB_NON_BUFFERED_MODE || g_Config.iRenderingMode == FB_BUFFERED_MODE); } diff --git a/GPU/D3D11/FramebufferManagerD3D11.cpp b/GPU/D3D11/FramebufferManagerD3D11.cpp index ce0cf12796..64964e5396 100644 --- a/GPU/D3D11/FramebufferManagerD3D11.cpp +++ b/GPU/D3D11/FramebufferManagerD3D11.cpp @@ -889,7 +889,7 @@ void FramebufferManagerD3D11::EndFrame() { PSP_CoreParameter().renderHeight = 272 * zoom; } - if (UpdateSize() || g_Config.iRenderingMode == FB_NON_BUFFERED_MODE) { + if (UpdateSize()) { DestroyAllFBOs(); } diff --git a/GPU/Directx9/FramebufferDX9.cpp b/GPU/Directx9/FramebufferDX9.cpp index 3471108f30..a8fe27e834 100644 --- a/GPU/Directx9/FramebufferDX9.cpp +++ b/GPU/Directx9/FramebufferDX9.cpp @@ -776,7 +776,7 @@ static const D3DVERTEXELEMENT9 g_FramebufferVertexElements[] = { PSP_CoreParameter().renderHeight = 272 * zoom; } - if (UpdateSize() || g_Config.iRenderingMode == FB_NON_BUFFERED_MODE) { + if (UpdateSize()) { DestroyAllFBOs(); } // Seems related - if you're ok with numbers all the time, show some more :) diff --git a/GPU/GLES/FramebufferManagerGLES.cpp b/GPU/GLES/FramebufferManagerGLES.cpp index faff214096..0365c692db 100644 --- a/GPU/GLES/FramebufferManagerGLES.cpp +++ b/GPU/GLES/FramebufferManagerGLES.cpp @@ -1180,7 +1180,7 @@ void FramebufferManagerGLES::EndFrame() { PSP_CoreParameter().renderHeight = 272 * zoom; } - if (UpdateSize() || g_Config.iRenderingMode == FB_NON_BUFFERED_MODE) { + if (UpdateSize()) { DestroyAllFBOs(); } diff --git a/GPU/Vulkan/FramebufferVulkan.cpp b/GPU/Vulkan/FramebufferVulkan.cpp index d7be33ab65..822e6f0d23 100644 --- a/GPU/Vulkan/FramebufferVulkan.cpp +++ b/GPU/Vulkan/FramebufferVulkan.cpp @@ -1070,7 +1070,7 @@ void FramebufferManagerVulkan::EndFrame() { PSP_CoreParameter().renderHeight = 272 * zoom; } - if (UpdateSize() || g_Config.iRenderingMode == FB_NON_BUFFERED_MODE) { + if (UpdateSize()) { DestroyAllFBOs(); } From 53a8e4213d185dfead536b00c17383826ec4f426 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Mon, 24 Apr 2017 01:07:00 -0700 Subject: [PATCH 2/7] Core: Fix PPGe text drawing with missing icon. --- Core/Dialog/PSPSaveDialog.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Core/Dialog/PSPSaveDialog.cpp b/Core/Dialog/PSPSaveDialog.cpp index 5d998bbc57..0236519962 100755 --- a/Core/Dialog/PSPSaveDialog.cpp +++ b/Core/Dialog/PSPSaveDialog.cpp @@ -383,8 +383,7 @@ void PSPSaveDialog::DisplaySaveIcon() PPGeDisableTexture(); } PPGeDrawImage(x, y, w, h, 0, 0, 1, 1, tw, th, textureColor); - if (curSave.texture != NULL) - PPGeSetDefaultTexture(); + PPGeSetDefaultTexture(); } void PSPSaveDialog::DisplaySaveDataInfo1() From c29f70e5e9224629744e4a41f4b057730395b59d Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Mon, 24 Apr 2017 09:30:04 -0700 Subject: [PATCH 3/7] GPU: Attempt recreate of FBOs if failed. --- GPU/Common/FramebufferCommon.cpp | 12 ++++++++---- GPU/Common/FramebufferCommon.h | 1 + 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/GPU/Common/FramebufferCommon.cpp b/GPU/Common/FramebufferCommon.cpp index 6f2fc3827a..4295a9458a 100644 --- a/GPU/Common/FramebufferCommon.cpp +++ b/GPU/Common/FramebufferCommon.cpp @@ -579,16 +579,15 @@ void FramebufferManagerCommon::NotifyRenderFramebufferSwitched(VirtualFramebuffe textureCache_->ForgetLastTexture(); if (useBufferedRendering_) { - if (vfb->fbo) { draw_->BindFramebufferAsRenderTarget(vfb->fbo); } else { - // wtf? This should only happen very briefly when toggling bBufferedRendering - draw_->BindBackbufferAsRenderTarget(); + // This should only happen very briefly when toggling useBufferedRendering_. + ResizeFramebufFBO(vfb, vfb->width, vfb->height, true); } } else { if (vfb->fbo) { - // wtf? This should only happen very briefly when toggling bBufferedRendering + // This should only happen very briefly when toggling useBufferedRendering_. textureCache_->NotifyFramebuffer(vfb->fb_address, vfb, NOTIFY_FB_DESTROYED); delete vfb->fbo; vfb->fbo = nullptr; @@ -1147,6 +1146,10 @@ void FramebufferManagerCommon::ResizeFramebufFBO(VirtualFramebuffer *vfb, u16 w, } return; } + if (!old.fbo && vfb->last_frame_failed != 0 && vfb->last_frame_failed - gpuStats.numFlips < 63) { + // Don't constantly retry FBOs which failed to create. + return; + } vfb->fbo = draw_->CreateFramebuffer({ vfb->renderWidth, vfb->renderHeight, 1, 1, true, (Draw::FBColorDepth)vfb->colorDepth }); if (old.fbo) { @@ -1166,6 +1169,7 @@ void FramebufferManagerCommon::ResizeFramebufFBO(VirtualFramebuffer *vfb, u16 w, if (!vfb->fbo) { ERROR_LOG(FRAMEBUF, "Error creating FBO! %i x %i", vfb->renderWidth, vfb->renderHeight); + vfb->last_frame_failed = gpuStats.numFlips; } } diff --git a/GPU/Common/FramebufferCommon.h b/GPU/Common/FramebufferCommon.h index 20ee9f9405..6e6db83be1 100644 --- a/GPU/Common/FramebufferCommon.h +++ b/GPU/Common/FramebufferCommon.h @@ -75,6 +75,7 @@ struct VirtualFramebuffer { int last_frame_render; int last_frame_displayed; int last_frame_clut; + int last_frame_failed; u32 clutUpdatedBytes; bool memoryUpdated; bool depthUpdated; From eb5c55e869c36dea7b3e455a0d609ff0d25dda52 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Mon, 24 Apr 2017 10:16:26 -0700 Subject: [PATCH 4/7] Core: Fix log spam in debug mode. No need to log every single call. --- Core/HLE/HLE.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/HLE/HLE.cpp b/Core/HLE/HLE.cpp index 32aefdd462..5c6610a780 100644 --- a/Core/HLE/HLE.cpp +++ b/Core/HLE/HLE.cpp @@ -489,7 +489,6 @@ const HLEFunction *GetSyscallFuncPointer(MIPSOpcode op) ERROR_LOG(HLE, "Syscall had bad function number %d in module %d - probably executing garbage", funcnum, modulenum); return NULL; } - DEBUG_LOG(HLE, "Compiling syscall to %s", moduleDB[modulenum].funcTable[funcnum].name); return &moduleDB[modulenum].funcTable[funcnum]; } @@ -500,6 +499,7 @@ void *GetQuickSyscallFunc(MIPSOpcode op) { const HLEFunction *info = GetSyscallFuncPointer(op); if (!info || !info->func) return nullptr; + DEBUG_LOG(HLE, "Compiling syscall to %s", info->name); // TODO: Do this with a flag? if (op == idleOp) From 6c2f87b1df999acd7628aa2a5f8089cf970689b5 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Mon, 24 Apr 2017 11:57:16 -0700 Subject: [PATCH 5/7] GPU: Consistently use useBufferedRendering_. --- GPU/Common/FramebufferCommon.cpp | 6 +++--- Windows/MainWindow.cpp | 3 +-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/GPU/Common/FramebufferCommon.cpp b/GPU/Common/FramebufferCommon.cpp index 4295a9458a..a7b696782f 100644 --- a/GPU/Common/FramebufferCommon.cpp +++ b/GPU/Common/FramebufferCommon.cpp @@ -769,7 +769,7 @@ void FramebufferManagerCommon::DrawFramebufferToOutput(const u8 *srcPixels, GEBu // Should try to unify this path with the regular path somehow, but this simple solution works for most of the post shaders // (it always runs at output resolution so FXAA may look odd). float x, y, w, h; - int uvRotation = (g_Config.iRenderingMode != FB_NON_BUFFERED_MODE) ? g_Config.iInternalScreenRotation : ROTATION_LOCKED_HORIZONTAL; + int uvRotation = useBufferedRendering_ ? g_Config.iInternalScreenRotation : ROTATION_LOCKED_HORIZONTAL; CenterDisplayOutputRect(&x, &y, &w, &h, 480.0f, 272.0f, (float)pixelWidth_, (float)pixelHeight_, uvRotation); if (applyPostShader && useBufferedRendering_) { // Might've changed if the shader was just changed to Off. @@ -930,7 +930,7 @@ void FramebufferManagerCommon::CopyDisplayToOutput() { draw_->BindFramebufferAsTexture(vfb->fbo, 0, Draw::FB_COLOR_BIT, 0); - int uvRotation = (g_Config.iRenderingMode != FB_NON_BUFFERED_MODE) ? g_Config.iInternalScreenRotation : ROTATION_LOCKED_HORIZONTAL; + int uvRotation = useBufferedRendering_ ? g_Config.iInternalScreenRotation : ROTATION_LOCKED_HORIZONTAL; // Output coordinates float x, y, w, h; @@ -1044,7 +1044,7 @@ void FramebufferManagerCommon::CopyDisplayToOutput() { } void FramebufferManagerCommon::DecimateFBOs() { - if (g_Config.iRenderingMode != FB_NON_BUFFERED_MODE) { + if (useBufferedRendering_) { draw_->BindBackbufferAsRenderTarget(); } currentRenderVfb_ = 0; diff --git a/Windows/MainWindow.cpp b/Windows/MainWindow.cpp index 7a11b27015..30a30fe97b 100644 --- a/Windows/MainWindow.cpp +++ b/Windows/MainWindow.cpp @@ -224,8 +224,7 @@ namespace MainWindow if (g_Config.iTexScalingLevel == TEXSCALING_AUTO) setTexScalingMultiplier(0); - if (gpu) - gpu->Resized(); + NativeMessageReceived("gpu resized", ""); } void CorrectCursor() { From fd4399e108905b4eb57c7c97f6a7af3f84b2d0e2 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Mon, 24 Apr 2017 11:58:16 -0700 Subject: [PATCH 6/7] GPU: Centralize fb resize, move to begin of frame. It makes more sense here, because otherwise when you change it from the UI settings, it takes a frame to "kick in". --- GPU/Common/FramebufferCommon.cpp | 40 ++++++++++++++++ GPU/Common/FramebufferCommon.h | 2 +- GPU/D3D11/FramebufferManagerD3D11.cpp | 54 ++++------------------ GPU/D3D11/FramebufferManagerD3D11.h | 2 - GPU/D3D11/GPU_D3D11.cpp | 1 + GPU/Directx9/FramebufferDX9.cpp | 39 ++-------------- GPU/Directx9/FramebufferDX9.h | 2 - GPU/Directx9/GPU_DX9.cpp | 1 + GPU/GLES/FramebufferManagerGLES.cpp | 66 ++++++--------------------- GPU/GLES/FramebufferManagerGLES.h | 2 - GPU/GLES/GPU_GLES.cpp | 2 +- GPU/GPUCommon.cpp | 1 - GPU/Vulkan/FramebufferVulkan.cpp | 55 +++------------------- GPU/Vulkan/FramebufferVulkan.h | 2 - GPU/Vulkan/GPU_Vulkan.cpp | 2 +- 15 files changed, 77 insertions(+), 194 deletions(-) diff --git a/GPU/Common/FramebufferCommon.cpp b/GPU/Common/FramebufferCommon.cpp index a7b696782f..383eeee21f 100644 --- a/GPU/Common/FramebufferCommon.cpp +++ b/GPU/Common/FramebufferCommon.cpp @@ -33,6 +33,7 @@ #include "Core/System.h" #include "Core/HLE/sceDisplay.h" #include "GPU/Common/FramebufferCommon.h" +#include "GPU/Common/PostShader.h" #include "GPU/Common/TextureCacheCommon.h" #include "GPU/GPUInterface.h" #include "GPU/GPUState.h" @@ -1704,6 +1705,45 @@ void FramebufferManagerCommon::SetSafeSize(u16 w, u16 h) { } } +void FramebufferManagerCommon::Resized() { + // Check if postprocessing shader is doing upscaling as it requires native resolution + const ShaderInfo *shaderInfo = nullptr; + if (g_Config.sPostShaderName != "Off") { + shaderInfo = GetPostShaderInfo(g_Config.sPostShaderName); + } + + postShaderIsUpscalingFilter_ = shaderInfo ? shaderInfo->isUpscalingFilter : false; + + // Actually, auto mode should be more granular... + // Round up to a zoom factor for the render size. + int zoom = g_Config.iInternalResolution; + if (zoom == 0) { + // auto mode, use the longest dimension + if (!g_Config.IsPortrait()) { + zoom = (PSP_CoreParameter().pixelWidth + 479) / 480; + } else { + zoom = (PSP_CoreParameter().pixelHeight + 479) / 480; + } + } + if (zoom <= 1 || postShaderIsUpscalingFilter_) + zoom = 1; + + if (g_Config.IsPortrait()) { + PSP_CoreParameter().renderWidth = 272 * zoom; + PSP_CoreParameter().renderHeight = 480 * zoom; + } else { + PSP_CoreParameter().renderWidth = 480 * zoom; + PSP_CoreParameter().renderHeight = 272 * zoom; + } + +#ifdef _WIN32 + // Seems related - if you're ok with numbers all the time, show some more :) + if (g_Config.iShowFPSCounter != 0) { + ShowScreenResolution(); + } +#endif +} + void FramebufferManagerCommon::CalculatePostShaderUniforms(int bufferWidth, int bufferHeight, int renderWidth, int renderHeight, PostShaderUniforms *uniforms) { float u_delta = 1.0f / renderWidth; float v_delta = 1.0f / renderHeight; diff --git a/GPU/Common/FramebufferCommon.h b/GPU/Common/FramebufferCommon.h index 6e6db83be1..835e7b66cb 100644 --- a/GPU/Common/FramebufferCommon.h +++ b/GPU/Common/FramebufferCommon.h @@ -265,7 +265,7 @@ public: void SetRenderSize(VirtualFramebuffer *vfb); void SetSafeSize(u16 w, u16 h); - virtual void Resized() = 0; + virtual void Resized(); Draw::Framebuffer *GetTempFBO(u16 w, u16 h, Draw::FBColorDepth depth = Draw::FBO_8888); diff --git a/GPU/D3D11/FramebufferManagerD3D11.cpp b/GPU/D3D11/FramebufferManagerD3D11.cpp index 64964e5396..5a19704a05 100644 --- a/GPU/D3D11/FramebufferManagerD3D11.cpp +++ b/GPU/D3D11/FramebufferManagerD3D11.cpp @@ -858,55 +858,10 @@ void FramebufferManagerD3D11::PackDepthbuffer(VirtualFramebuffer *vfb, int x, in } void FramebufferManagerD3D11::EndFrame() { - if (resized_) { - // Check if postprocessing shader is doing upscaling as it requires native resolution - const ShaderInfo *shaderInfo = 0; - if (g_Config.sPostShaderName != "Off") { - shaderInfo = GetPostShaderInfo(g_Config.sPostShaderName); - } - - postShaderIsUpscalingFilter_ = shaderInfo ? shaderInfo->isUpscalingFilter : false; - - // Actually, auto mode should be more granular... - // Round up to a zoom factor for the render size. - int zoom = g_Config.iInternalResolution; - if (zoom == 0) { - // auto mode, use the longest dimension - if (!g_Config.IsPortrait()) { - zoom = (PSP_CoreParameter().pixelWidth + 479) / 480; - } else { - zoom = (PSP_CoreParameter().pixelHeight + 479) / 480; - } - } - if (zoom <= 1 || postShaderIsUpscalingFilter_) - zoom = 1; - - if (g_Config.IsPortrait()) { - PSP_CoreParameter().renderWidth = 272 * zoom; - PSP_CoreParameter().renderHeight = 480 * zoom; - } else { - PSP_CoreParameter().renderWidth = 480 * zoom; - PSP_CoreParameter().renderHeight = 272 * zoom; - } - - if (UpdateSize()) { - DestroyAllFBOs(); - } - - // Seems related - if you're ok with numbers all the time, show some more :) - if (g_Config.iShowFPSCounter != 0) { - ShowScreenResolution(); - } - resized_ = false; - - // Might have a new post shader - let's compile it. - CompilePostShader(); - } } void FramebufferManagerD3D11::DeviceLost() { DestroyAllFBOs(); - resized_ = false; } std::vector FramebufferManagerD3D11::GetFramebufferList() { @@ -968,7 +923,14 @@ void FramebufferManagerD3D11::FlushBeforeCopy() { } void FramebufferManagerD3D11::Resized() { - resized_ = true; + FramebufferManagerCommon::Resized(); + + if (UpdateSize()) { + DestroyAllFBOs(); + } + + // Might have a new post shader - let's compile it. + CompilePostShader(); } // Lots of this code could be shared (like the downsampling). diff --git a/GPU/D3D11/FramebufferManagerD3D11.h b/GPU/D3D11/FramebufferManagerD3D11.h index f6070d76ff..7e4c9a93ab 100644 --- a/GPU/D3D11/FramebufferManagerD3D11.h +++ b/GPU/D3D11/FramebufferManagerD3D11.h @@ -153,8 +153,6 @@ private: // Used by post-processing shader std::vector extraFBOs_; - bool resized_; - #if 0 AsyncPBO *pixelBufObj_; //this isn't that large u8 currentPBO_; diff --git a/GPU/D3D11/GPU_D3D11.cpp b/GPU/D3D11/GPU_D3D11.cpp index 93c3dcc126..d8724867d0 100644 --- a/GPU/D3D11/GPU_D3D11.cpp +++ b/GPU/D3D11/GPU_D3D11.cpp @@ -301,6 +301,7 @@ void GPU_D3D11::BeginHostFrame() { GPUCommon::BeginHostFrame(); UpdateCmdInfo(); if (resized_) { + framebufferManager_->Resized(); drawEngine_.Resized(); textureCacheD3D11_->NotifyConfigChanged(); shaderManagerD3D11_->DirtyLastShader(); diff --git a/GPU/Directx9/FramebufferDX9.cpp b/GPU/Directx9/FramebufferDX9.cpp index a8fe27e834..6a9a03cb75 100644 --- a/GPU/Directx9/FramebufferDX9.cpp +++ b/GPU/Directx9/FramebufferDX9.cpp @@ -753,43 +753,10 @@ static const D3DVERTEXELEMENT9 g_FramebufferVertexElements[] = { } void FramebufferManagerDX9::EndFrame() { - if (resized_) { - // Actually, auto mode should be more granular... - // Round up to a zoom factor for the render size. - int zoom = g_Config.iInternalResolution; - if (zoom == 0) { // auto mode - // Use the longest dimension - if (!g_Config.IsPortrait()) { - zoom = (PSP_CoreParameter().pixelWidth + 479) / 480; - } else { - zoom = (PSP_CoreParameter().pixelHeight + 479) / 480; - } - } - if (zoom <= 1) - zoom = 1; - - if (g_Config.IsPortrait()) { - PSP_CoreParameter().renderWidth = 272 * zoom; - PSP_CoreParameter().renderHeight = 480 * zoom; - } else { - PSP_CoreParameter().renderWidth = 480 * zoom; - PSP_CoreParameter().renderHeight = 272 * zoom; - } - - if (UpdateSize()) { - DestroyAllFBOs(); - } - // Seems related - if you're ok with numbers all the time, show some more :) - if (g_Config.iShowFPSCounter != 0) { - ShowScreenResolution(); - } - resized_ = false; - } } void FramebufferManagerDX9::DeviceLost() { DestroyAllFBOs(); - resized_ = false; } std::vector FramebufferManagerDX9::GetFramebufferList() { @@ -868,7 +835,11 @@ static const D3DVERTEXELEMENT9 g_FramebufferVertexElements[] = { } void FramebufferManagerDX9::Resized() { - resized_ = true; + FramebufferManagerCommon::Resized(); + + if (UpdateSize()) { + DestroyAllFBOs(); + } } bool FramebufferManagerDX9::GetFramebuffer(u32 fb_address, int fb_stride, GEBufferFormat fb_format, GPUDebugBuffer &buffer, int maxRes) { diff --git a/GPU/Directx9/FramebufferDX9.h b/GPU/Directx9/FramebufferDX9.h index 559f9ca595..056573b7c3 100644 --- a/GPU/Directx9/FramebufferDX9.h +++ b/GPU/Directx9/FramebufferDX9.h @@ -128,8 +128,6 @@ private: // Used by post-processing shader std::vector extraFBOs_; - bool resized_; - struct TempFBO { Draw::Framebuffer *fbo; int last_frame_used; diff --git a/GPU/Directx9/GPU_DX9.cpp b/GPU/Directx9/GPU_DX9.cpp index dc1f079812..a6453d4c4d 100644 --- a/GPU/Directx9/GPU_DX9.cpp +++ b/GPU/Directx9/GPU_DX9.cpp @@ -268,6 +268,7 @@ void GPU_DX9::BeginHostFrame() { GPUCommon::BeginHostFrame(); UpdateCmdInfo(); if (resized_) { + framebufferManager_->Resized(); drawEngine_.Resized(); shaderManagerDX9_->DirtyShader(); textureCacheDX9_->NotifyConfigChanged(); diff --git a/GPU/GLES/FramebufferManagerGLES.cpp b/GPU/GLES/FramebufferManagerGLES.cpp index 0365c692db..26ce3f48d2 100644 --- a/GPU/GLES/FramebufferManagerGLES.cpp +++ b/GPU/GLES/FramebufferManagerGLES.cpp @@ -230,7 +230,6 @@ FramebufferManagerGLES::FramebufferManagerGLES(Draw::DrawContext *draw) : deltaLoc_(-1), textureCacheGL_(nullptr), shaderManagerGL_(nullptr), - resized_(false), pixelBufObj_(nullptr), currentPBO_(0) { @@ -240,7 +239,7 @@ FramebufferManagerGLES::FramebufferManagerGLES(Draw::DrawContext *draw) : void FramebufferManagerGLES::Init() { FramebufferManagerCommon::Init(); // Workaround for upscaling shaders where we force x1 resolution without saving it - resized_ = true; + Resized(); CompileDraw2DProgram(); SetLineWidth(); } @@ -1149,55 +1148,6 @@ void FramebufferManagerGLES::PackDepthbuffer(VirtualFramebuffer *vfb, int x, int void FramebufferManagerGLES::EndFrame() { CHECK_GL_ERROR_IF_DEBUG(); - if (resized_) { - // Check if postprocessing shader is doing upscaling as it requires native resolution - const ShaderInfo *shaderInfo = nullptr; - if (g_Config.sPostShaderName != "Off") { - shaderInfo = GetPostShaderInfo(g_Config.sPostShaderName); - } - - postShaderIsUpscalingFilter_ = shaderInfo ? shaderInfo->isUpscalingFilter : false; - - // Actually, auto mode should be more granular... - // Round up to a zoom factor for the render size. - int zoom = g_Config.iInternalResolution; - if (zoom == 0) { // auto mode - // Use the longest dimension - if (!g_Config.IsPortrait()) { - zoom = (PSP_CoreParameter().pixelWidth + 479) / 480; - } else { - zoom = (PSP_CoreParameter().pixelHeight + 479) / 480; - } - } - if (zoom <= 1 || postShaderIsUpscalingFilter_) - zoom = 1; - - if (g_Config.IsPortrait()) { - PSP_CoreParameter().renderWidth = 272 * zoom; - PSP_CoreParameter().renderHeight = 480 * zoom; - } else { - PSP_CoreParameter().renderWidth = 480 * zoom; - PSP_CoreParameter().renderHeight = 272 * zoom; - } - - if (UpdateSize()) { - DestroyAllFBOs(); - } - - resized_ = false; -#ifdef _WIN32 - // Seems related - if you're ok with numbers all the time, show some more :) - if (g_Config.iShowFPSCounter != 0) { - ShowScreenResolution(); - } -#endif - DestroyDraw2DProgram(); - SetLineWidth(); - } - - if (!draw2dprogram_) { - CompileDraw2DProgram(); - } // We flush to memory last requested framebuffer, if any. // Only do this in the read-framebuffer modes. @@ -1223,7 +1173,6 @@ void FramebufferManagerGLES::EndFrame() { void FramebufferManagerGLES::DeviceLost() { DestroyAllFBOs(); DestroyDraw2DProgram(); - resized_ = false; } std::vector FramebufferManagerGLES::GetFramebufferList() { @@ -1289,7 +1238,18 @@ void FramebufferManagerGLES::FlushBeforeCopy() { } void FramebufferManagerGLES::Resized() { - resized_ = true; + FramebufferManagerCommon::Resized(); + + if (UpdateSize()) { + DestroyAllFBOs(); + } + + DestroyDraw2DProgram(); + SetLineWidth(); + + if (!draw2dprogram_) { + CompileDraw2DProgram(); + } } bool FramebufferManagerGLES::GetFramebuffer(u32 fb_address, int fb_stride, GEBufferFormat format, GPUDebugBuffer &buffer, int maxRes) { diff --git a/GPU/GLES/FramebufferManagerGLES.h b/GPU/GLES/FramebufferManagerGLES.h index 649b4741a2..8574b8071e 100644 --- a/GPU/GLES/FramebufferManagerGLES.h +++ b/GPU/GLES/FramebufferManagerGLES.h @@ -138,8 +138,6 @@ private: ShaderManagerGLES *shaderManagerGL_; DrawEngineGLES *drawEngine_; - bool resized_; - // Not used under ES currently. AsyncPBO *pixelBufObj_; //this isn't that large u8 currentPBO_; diff --git a/GPU/GLES/GPU_GLES.cpp b/GPU/GLES/GPU_GLES.cpp index 3fb1bae743..301ae7ff7c 100644 --- a/GPU/GLES/GPU_GLES.cpp +++ b/GPU/GLES/GPU_GLES.cpp @@ -406,7 +406,6 @@ void GPU_GLES::ReinitializeInternal() { textureCacheGL_->Clear(true); depalShaderCache_.Clear(); framebufferManagerGL_->DestroyAllFBOs(); - framebufferManagerGL_->Resized(); } void GPU_GLES::InitClearInternal() { @@ -429,6 +428,7 @@ void GPU_GLES::BeginHostFrame() { UpdateCmdInfo(); if (resized_) { CheckGPUFeatures(); + framebufferManager_->Resized(); drawEngine_.Resized(); shaderManagerGL_->DirtyShader(); textureCacheGL_->NotifyConfigChanged(); diff --git a/GPU/GPUCommon.cpp b/GPU/GPUCommon.cpp index 021a5ee016..c73404c800 100644 --- a/GPU/GPUCommon.cpp +++ b/GPU/GPUCommon.cpp @@ -459,7 +459,6 @@ bool GPUCommon::BusyDrawing() { void GPUCommon::Resized() { resized_ = true; - framebufferManager_->Resized(); } u32 GPUCommon::DrawSync(int mode) { diff --git a/GPU/Vulkan/FramebufferVulkan.cpp b/GPU/Vulkan/FramebufferVulkan.cpp index 822e6f0d23..b8899551a0 100644 --- a/GPU/Vulkan/FramebufferVulkan.cpp +++ b/GPU/Vulkan/FramebufferVulkan.cpp @@ -89,7 +89,6 @@ FramebufferManagerVulkan::FramebufferManagerVulkan(Draw::DrawContext *draw, Vulk convBufSize_(0), textureCacheVulkan_(nullptr), shaderManagerVulkan_(nullptr), - resized_(false), pixelBufObj_(nullptr), currentPBO_(0), curFrame_(0), @@ -332,7 +331,7 @@ void FramebufferManagerVulkan::UpdatePostShaderUniforms(int bufferWidth, int buf void FramebufferManagerVulkan::Init() { FramebufferManagerCommon::Init(); // Workaround for upscaling shaders where we force x1 resolution without saving it - resized_ = true; + Resized(); } void FramebufferManagerVulkan::MakePixelTexture(const u8 *srcPixels, GEBufferFormat srcPixelFormat, int srcStride, int width, int height, float &u1, float &v1) { @@ -1038,51 +1037,6 @@ void FramebufferManagerVulkan::BeginFrameVulkan() { } void FramebufferManagerVulkan::EndFrame() { - if (resized_) { - // Check if postprocessing shader is doing upscaling as it requires native resolution - const ShaderInfo *shaderInfo = 0; - if (g_Config.sPostShaderName != "Off") { - ReloadAllPostShaderInfo(); - shaderInfo = GetPostShaderInfo(g_Config.sPostShaderName); - } - - postShaderIsUpscalingFilter_ = shaderInfo ? shaderInfo->isUpscalingFilter : false; - - // Actually, auto mode should be more granular... - // Round up to a zoom factor for the render size. - int zoom = g_Config.iInternalResolution; - if (zoom == 0) { // auto mode - // Use the longest dimension - if (!g_Config.IsPortrait()) { - zoom = (PSP_CoreParameter().pixelWidth + 479) / 480; - } else { - zoom = (PSP_CoreParameter().pixelHeight + 479) / 480; - } - } - if (zoom <= 1 || postShaderIsUpscalingFilter_) - zoom = 1; - - if (g_Config.IsPortrait()) { - PSP_CoreParameter().renderWidth = 272 * zoom; - PSP_CoreParameter().renderHeight = 480 * zoom; - } else { - PSP_CoreParameter().renderWidth = 480 * zoom; - PSP_CoreParameter().renderHeight = 272 * zoom; - } - - if (UpdateSize()) { - DestroyAllFBOs(); - } - - resized_ = false; -#ifdef _WIN32 - // Seems related - if you're ok with numbers all the time, show some more :) - if (g_Config.iShowFPSCounter != 0) { - ShowScreenResolution(); - } -#endif - } - // We flush to memory last requested framebuffer, if any. // Only do this in the read-framebuffer modes. if (updateVRAM_) @@ -1101,7 +1055,6 @@ void FramebufferManagerVulkan::DeviceLost() { DestroyAllFBOs(); DestroyDeviceObjects(); - resized_ = false; } void FramebufferManagerVulkan::DeviceRestore(VulkanContext *vulkan) { @@ -1162,7 +1115,11 @@ void FramebufferManagerVulkan::FlushBeforeCopy() { } void FramebufferManagerVulkan::Resized() { - resized_ = true; + FramebufferManagerCommon::Resized(); + + if (UpdateSize()) { + DestroyAllFBOs(); + } } bool FramebufferManagerVulkan::GetFramebuffer(u32 fb_address, int fb_stride, GEBufferFormat format, GPUDebugBuffer &buffer, int maxStride) { diff --git a/GPU/Vulkan/FramebufferVulkan.h b/GPU/Vulkan/FramebufferVulkan.h index a32a4f1e2f..95fc9cd0aa 100644 --- a/GPU/Vulkan/FramebufferVulkan.h +++ b/GPU/Vulkan/FramebufferVulkan.h @@ -166,8 +166,6 @@ private: ShaderManagerVulkan *shaderManagerVulkan_; DrawEngineVulkan *drawEngine_; - bool resized_; - AsyncPBOVulkan *pixelBufObj_; int currentPBO_; diff --git a/GPU/Vulkan/GPU_Vulkan.cpp b/GPU/Vulkan/GPU_Vulkan.cpp index f8cf380add..2eb32460ad 100644 --- a/GPU/Vulkan/GPU_Vulkan.cpp +++ b/GPU/Vulkan/GPU_Vulkan.cpp @@ -206,6 +206,7 @@ void GPU_Vulkan::BeginHostFrame() { // In case the GPU changed. BuildReportingInfo(); UpdateCmdInfo(); + framebufferManager_->Resized(); drawEngine_.Resized(); textureCacheVulkan_->NotifyConfigChanged(); } @@ -316,7 +317,6 @@ void GPU_Vulkan::ReinitializeInternal() { textureCacheVulkan_->Clear(true); depalShaderCache_.Clear(); framebufferManagerVulkan_->DestroyAllFBOs(); - framebufferManagerVulkan_->Resized(); } void GPU_Vulkan::InitClearInternal() { From d7ca05b6b558f515cc2964547d77f0108ca1cd5d Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Mon, 24 Apr 2017 11:59:12 -0700 Subject: [PATCH 7/7] GPU: Fix black screen on buffered render enable. We were never clearing the skip flag. Has been a bug since before v1.0. --- GPU/Common/FramebufferCommon.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/GPU/Common/FramebufferCommon.cpp b/GPU/Common/FramebufferCommon.cpp index 383eeee21f..66d677bd33 100644 --- a/GPU/Common/FramebufferCommon.cpp +++ b/GPU/Common/FramebufferCommon.cpp @@ -1736,6 +1736,8 @@ void FramebufferManagerCommon::Resized() { PSP_CoreParameter().renderHeight = 272 * zoom; } + gstate_c.skipDrawReason &= ~SKIPDRAW_NON_DISPLAYED_FB; + #ifdef _WIN32 // Seems related - if you're ok with numbers all the time, show some more :) if (g_Config.iShowFPSCounter != 0) {