From 6060706fc8cafa24ef81db97e38a9ede97e2410c Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 14 Aug 2022 22:13:39 -0700 Subject: [PATCH] GPU: Avoid using depth buffers for blending. For now, until it's implemented. --- GPU/Common/FramebufferManagerCommon.cpp | 5 ++++- GPU/Common/FramebufferManagerCommon.h | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/GPU/Common/FramebufferManagerCommon.cpp b/GPU/Common/FramebufferManagerCommon.cpp index 68920e2a12..bfa097d936 100644 --- a/GPU/Common/FramebufferManagerCommon.cpp +++ b/GPU/Common/FramebufferManagerCommon.cpp @@ -238,6 +238,9 @@ void GetFramebufferHeuristicInputs(FramebufferHeuristicParams *params, const GPU } params->isDrawing = !gstate.isModeClear() || !gstate.isClearModeColorMask() || !gstate.isClearModeAlphaMask(); params->isModeThrough = gstate.isModeThrough(); + const bool alphaBlending = gstate.isAlphaBlendEnabled(); + const bool logicOpBlending = gstate.isLogicOpEnabled() && gstate.getLogicOp() != GE_LOGIC_CLEAR && gstate.getLogicOp() != GE_LOGIC_COPY; + params->isBlending = alphaBlending || logicOpBlending; // Viewport-X1 and Y1 are not the upper left corner, but half the width/height. A bit confusing. float vpx = gstate.getViewportXScale(); @@ -321,7 +324,7 @@ VirtualFramebuffer *FramebufferManagerCommon::DoSetRenderFrameBuffer(const Frame vfb->height = drawing_height; } break; - } else if (params.fb_address == v->z_address && params.fmt != GE_FORMAT_8888 && params.fb_stride == v->z_stride) { + } else if (params.fb_address == v->z_address && params.fmt != GE_FORMAT_8888 && params.fb_stride == v->z_stride && !params.isBlending) { // Looks like the game might be intending to use color to write directly to a Z buffer. // This is seen in Kuroyou 2. diff --git a/GPU/Common/FramebufferManagerCommon.h b/GPU/Common/FramebufferManagerCommon.h index 5277d6a03e..ca995fda06 100644 --- a/GPU/Common/FramebufferManagerCommon.h +++ b/GPU/Common/FramebufferManagerCommon.h @@ -139,6 +139,7 @@ struct FramebufferHeuristicParams { bool isWritingDepth; bool isDrawing; bool isModeThrough; + bool isBlending; int viewportWidth; int viewportHeight; int regionWidth;