From 8d6593b92bbe53d9bf3177eb2bdc5d791bb0a5ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 5 Jan 2025 09:11:32 +0100 Subject: [PATCH 1/2] Remove compat flag AllowDelayedReadback --- Core/Compatibility.cpp | 1 - Core/Compatibility.h | 1 - GPU/Common/DepthBufferCommon.cpp | 9 +++------ GPU/Common/FramebufferManagerCommon.cpp | 15 ++++----------- assets/compat.ini | 9 --------- 5 files changed, 7 insertions(+), 28 deletions(-) diff --git a/Core/Compatibility.cpp b/Core/Compatibility.cpp index cd2c50c488..735b1299cc 100644 --- a/Core/Compatibility.cpp +++ b/Core/Compatibility.cpp @@ -142,7 +142,6 @@ void Compatibility::CheckSettings(IniFile &iniFile, const std::string &gameID) { CheckSetting(iniFile, gameID, "Fontltn12Hack", &flags_.Fontltn12Hack); CheckSetting(iniFile, gameID, "LoadCLUTFromCurrentFrameOnly", &flags_.LoadCLUTFromCurrentFrameOnly); CheckSetting(iniFile, gameID, "ForceUMDReadSpeed", &flags_.ForceUMDReadSpeed); - CheckSetting(iniFile, gameID, "AllowDelayedReadbacks", &flags_.AllowDelayedReadbacks); CheckSetting(iniFile, gameID, "KernelGetSystemTimeLowEatMoreCycles", &flags_.KernelGetSystemTimeLowEatMoreCycles); CheckSetting(iniFile, gameID, "TacticsOgreEliminateDebugReadback", &flags_.TacticsOgreEliminateDebugReadback); CheckSetting(iniFile, gameID, "FramebufferAllowLargeVerticalOffset", &flags_.FramebufferAllowLargeVerticalOffset); diff --git a/Core/Compatibility.h b/Core/Compatibility.h index 4688df37c0..b865becff7 100644 --- a/Core/Compatibility.h +++ b/Core/Compatibility.h @@ -105,7 +105,6 @@ struct CompatFlags { bool Fontltn12Hack; bool LoadCLUTFromCurrentFrameOnly; bool ForceUMDReadSpeed; - bool AllowDelayedReadbacks; bool KernelGetSystemTimeLowEatMoreCycles; bool TacticsOgreEliminateDebugReadback; bool FramebufferAllowLargeVerticalOffset; diff --git a/GPU/Common/DepthBufferCommon.cpp b/GPU/Common/DepthBufferCommon.cpp index c6e5f655bd..f49a88d20d 100644 --- a/GPU/Common/DepthBufferCommon.cpp +++ b/GPU/Common/DepthBufferCommon.cpp @@ -215,9 +215,6 @@ bool FramebufferManagerCommon::ReadbackDepthbuffer(Draw::Framebuffer *fbo, int x DepthUB ub{}; - // Setting this to 0.95f eliminates flickering lights with delayed readback in Syphon Filter. - // That's pretty ugly though! But we'll need to do that if we're gonna enable delayed readback in those games. - const float fudgeFactor = 1.0f; DepthScaleFactors depthScale = GetDepthScaleFactors(gstate_c.UseFlags()); ub.u_depthFactor[0] = depthScale.Offset(); ub.u_depthFactor[1] = depthScale.Scale(); @@ -232,9 +229,9 @@ bool FramebufferManagerCommon::ReadbackDepthbuffer(Draw::Framebuffer *fbo, int x // Fullscreen triangle coordinates. static const float positions[6] = { - 0.0, 0.0, - 1.0, 0.0, - 0.0, 1.0, + 0.0f, 0.0f, + 1.0f, 0.0f, + 0.0f, 1.0f, }; draw_->DrawUP(positions, 3); diff --git a/GPU/Common/FramebufferManagerCommon.cpp b/GPU/Common/FramebufferManagerCommon.cpp index 0d2e781664..055a85c06e 100644 --- a/GPU/Common/FramebufferManagerCommon.cpp +++ b/GPU/Common/FramebufferManagerCommon.cpp @@ -1064,7 +1064,7 @@ bool FramebufferManagerCommon::ShouldDownloadFramebufferColor(const VirtualFrame } bool FramebufferManagerCommon::ShouldDownloadFramebufferDepth(const VirtualFramebuffer *vfb) { - // Download depth buffer for Syphon Filter lens flares + // Download depth buffer if compat flag set (previously used for Syphon Filter lens flares, now used for nothing) if (!PSP_CoreParameter().compat.flags().ReadbackDepth || GetSkipGPUReadbackMode() != SkipGPUReadbackMode::NO_SKIP) { return false; } @@ -1074,6 +1074,7 @@ bool FramebufferManagerCommon::ShouldDownloadFramebufferDepth(const VirtualFrame void FramebufferManagerCommon::NotifyRenderFramebufferSwitched(VirtualFramebuffer *prevVfb, VirtualFramebuffer *vfb, bool isClearingDepth) { if (prevVfb) { if (ShouldDownloadFramebufferColor(prevVfb) && !prevVfb->memoryUpdated) { + // NOTE: This path is ONLY for the Dangan Ronpa hack, see ShouldDownloadFramebufferColor ReadFramebufferToMemory(prevVfb, 0, 0, prevVfb->width, prevVfb->height, RASTER_COLOR, Draw::ReadbackMode::OLD_DATA_OK); prevVfb->usageFlags = (prevVfb->usageFlags | FB_USAGE_DOWNLOAD | FB_USAGE_FIRST_FRAME_SAVED) & ~FB_USAGE_DOWNLOAD_CLEAR; } else { @@ -2192,11 +2193,7 @@ bool FramebufferManagerCommon::NotifyFramebufferCopy(u32 src, u32 dst, int size, if (srcH == 0 || srcY + srcH > srcBuffer->bufferHeight) { WARN_LOG_ONCE(btdcpyheight, Log::FrameBuf, "Memcpy fbo download %08x -> %08x skipped, %d+%d is taller than %d", src, dst, srcY, srcH, srcBuffer->bufferHeight); } else if (GetSkipGPUReadbackMode() == SkipGPUReadbackMode::NO_SKIP && (!srcBuffer->memoryUpdated || channel == RASTER_DEPTH)) { - Draw::ReadbackMode readbackMode = Draw::ReadbackMode::BLOCK; - if (PSP_CoreParameter().compat.flags().AllowDelayedReadbacks) { - readbackMode = Draw::ReadbackMode::OLD_DATA_OK; - } - ReadFramebufferToMemory(srcBuffer, 0, srcY, srcBuffer->width, srcH, channel, readbackMode); + ReadFramebufferToMemory(srcBuffer, 0, srcY, srcBuffer->width, srcH, channel, Draw::ReadbackMode::BLOCK); srcBuffer->usageFlags = (srcBuffer->usageFlags | FB_USAGE_DOWNLOAD) & ~FB_USAGE_DOWNLOAD_CLEAR; } return false; @@ -2743,11 +2740,7 @@ bool FramebufferManagerCommon::NotifyBlockTransferBefore(u32 dstBasePtr, int dst if (tooTall) { WARN_LOG_ONCE(btdheight, Log::G3D, "Block transfer download %08x -> %08x dangerous, %d+%d is taller than %d", srcBasePtr, dstBasePtr, srcRect.y, srcRect.h, srcRect.vfb->bufferHeight); } - Draw::ReadbackMode readbackMode = Draw::ReadbackMode::BLOCK; - if (PSP_CoreParameter().compat.flags().AllowDelayedReadbacks) { - readbackMode = Draw::ReadbackMode::OLD_DATA_OK; - } - ReadFramebufferToMemory(srcRect.vfb, static_cast(srcX * srcXFactor), srcY, static_cast(srcRect.w_bytes * srcXFactor), srcRect.h, RASTER_COLOR, readbackMode); + ReadFramebufferToMemory(srcRect.vfb, static_cast(srcX * srcXFactor), srcY, static_cast(srcRect.w_bytes * srcXFactor), srcRect.h, RASTER_COLOR, Draw::ReadbackMode::BLOCK); srcRect.vfb->usageFlags = (srcRect.vfb->usageFlags | FB_USAGE_DOWNLOAD) & ~FB_USAGE_DOWNLOAD_CLEAR; } } diff --git a/assets/compat.ini b/assets/compat.ini index 5142e67d16..1f4fe2db98 100644 --- a/assets/compat.ini +++ b/assets/compat.ini @@ -1681,9 +1681,6 @@ UCAS40289 = true NPUH10025 = true NPEH00047 = true -[ReadbackDepth] -# Obsolete, SoftwareRasterDepth is a far better solution. - [BlockTransferDepth] # Iron Man - see issue #16530 # Note that this option also requires IntraVRAMBlockTransferAllowCreateFB. @@ -1811,12 +1808,6 @@ UCKS45110 = true ULJS19044 = true NPJH50852 = true -[AllowDelayedReadbacks] -# NOTE: This only affects Vulkan currently. -# Added for easy experimentation. Many games using readbacks do not work well delaying them, though. -# For example, Motorstorm lighting adaptation goes into self-oscillation (!) -# UCES01250 = true - [TacticsOgreEliminateDebugReadback] ULUS10565 = true ULES01500 = true From b097a54ee05e8da30ba7b4513717f3efa6ea0800 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 5 Jan 2025 09:28:34 +0100 Subject: [PATCH 2/2] Don't assert when using the old Ge debugger in OpenGL --- GPU/Common/TextureCacheCommon.cpp | 6 ++++-- GPU/Common/TextureCacheCommon.h | 2 +- GPU/GLES/TextureCacheGLES.cpp | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/GPU/Common/TextureCacheCommon.cpp b/GPU/Common/TextureCacheCommon.cpp index 2d28cef187..2af43a2ee3 100644 --- a/GPU/Common/TextureCacheCommon.cpp +++ b/GPU/Common/TextureCacheCommon.cpp @@ -2080,7 +2080,7 @@ CheckAlphaResult TextureCacheCommon::ReadIndexedTex(u8 *out, int outPitch, int l } } -void TextureCacheCommon::ApplyTexture() { +void TextureCacheCommon::ApplyTexture(bool doBind) { TexCacheEntry *entry = nextTexture_; if (!entry) { // Maybe we bound a framebuffer? @@ -2161,7 +2161,9 @@ void TextureCacheCommon::ApplyTexture() { gstate_c.SetTextureIsBGRA(false); } else { entry->lastFrame = gpuStats.numFlips; - BindTexture(entry); + if (doBind) { + BindTexture(entry); + } gstate_c.SetTextureFullAlpha(entry->GetAlphaStatus() == TexCacheEntry::STATUS_ALPHA_FULL); gstate_c.SetTextureIs3D((entry->status & TexCacheEntry::STATUS_3D) != 0); gstate_c.SetTextureIsArray(false); diff --git a/GPU/Common/TextureCacheCommon.h b/GPU/Common/TextureCacheCommon.h index 48fc25dd54..2283b2eef4 100644 --- a/GPU/Common/TextureCacheCommon.h +++ b/GPU/Common/TextureCacheCommon.h @@ -349,7 +349,7 @@ public: shaderManager_ = sm; } - void ApplyTexture(); + void ApplyTexture(bool doBind = true); bool SetOffsetTexture(u32 yOffset); void Invalidate(u32 addr, int size, GPUInvalidationType type); void InvalidateAll(GPUInvalidationType type); diff --git a/GPU/GLES/TextureCacheGLES.cpp b/GPU/GLES/TextureCacheGLES.cpp index 7cb60f8a9e..6e7cdb5270 100644 --- a/GPU/GLES/TextureCacheGLES.cpp +++ b/GPU/GLES/TextureCacheGLES.cpp @@ -386,7 +386,7 @@ bool TextureCacheGLES::GetCurrentTextureDebug(GPUDebugBuffer &buffer, int level, TexCacheEntry *entry = nextTexture_; // We might need a render pass to set the sampling params, unfortunately. Otherwise BuildTexture may crash. framebufferManagerGL_->RebindFramebuffer("RebindFramebuffer - GetCurrentTextureDebug"); - ApplyTexture(); + ApplyTexture(false); GLRenderManager *renderManager = (GLRenderManager *)draw_->GetNativeObject(Draw::NativeObject::RENDER_MANAGER);