From 710abcc2889efefc718f68f8e7a04083e9e7352d Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Tue, 9 Aug 2022 18:45:27 -0700 Subject: [PATCH] GPU: Write stencil fail to alpha is RGB masked. See #15813 (Hunter x Hunter) which does this for shadows. --- GPU/Common/GPUStateUtils.cpp | 8 ++++++++ GPU/GPUCommon.cpp | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/GPU/Common/GPUStateUtils.cpp b/GPU/Common/GPUStateUtils.cpp index 03b957f8037e..300b1dd16119 100644 --- a/GPU/Common/GPUStateUtils.cpp +++ b/GPU/Common/GPUStateUtils.cpp @@ -1511,6 +1511,14 @@ void ConvertStencilFuncState(GenericStencilFuncState &state) { state.testRef = gstate.getStencilTestRef(); state.testMask = gstate.getStencilTestMask(); + if ((state.sFail == state.zFail || !gstate.isDepthTestEnabled()) && state.sFail == state.zPass) { + // Common case: we're writing only to stencil (usually REPLACE/REPLACE/REPLACE.) + // We want to write stencil to alpha in this case, so switch to ALWAYS if already masked. + if ((gstate.getColorMask() & 0x00FFFFFF) == 0x00FFFFFF) { + state.testFunc = GE_COMP_ALWAYS; + } + } + switch (gstate_c.framebufFormat) { case GE_FORMAT_565: state.writeMask = 0; diff --git a/GPU/GPUCommon.cpp b/GPU/GPUCommon.cpp index b04fb0108a30..2996348b54a7 100644 --- a/GPU/GPUCommon.cpp +++ b/GPU/GPUCommon.cpp @@ -135,7 +135,7 @@ const CommonCommandTableEntry commonCommandTable[] = { { GE_CMD_BLENDMODE, FLAG_FLUSHBEFOREONCHANGE, DIRTY_BLEND_STATE | DIRTY_FRAGMENTSHADER_STATE }, { GE_CMD_BLENDFIXEDA, FLAG_FLUSHBEFOREONCHANGE, DIRTY_BLEND_STATE | DIRTY_FRAGMENTSHADER_STATE }, { GE_CMD_BLENDFIXEDB, FLAG_FLUSHBEFOREONCHANGE, DIRTY_BLEND_STATE | DIRTY_FRAGMENTSHADER_STATE }, - { GE_CMD_MASKRGB, FLAG_FLUSHBEFOREONCHANGE, DIRTY_BLEND_STATE | DIRTY_FRAGMENTSHADER_STATE | DIRTY_COLORWRITEMASK }, + { GE_CMD_MASKRGB, FLAG_FLUSHBEFOREONCHANGE, DIRTY_BLEND_STATE | DIRTY_FRAGMENTSHADER_STATE | DIRTY_DEPTHSTENCIL_STATE | DIRTY_COLORWRITEMASK }, { GE_CMD_MASKALPHA, FLAG_FLUSHBEFOREONCHANGE, DIRTY_BLEND_STATE | DIRTY_FRAGMENTSHADER_STATE | DIRTY_DEPTHSTENCIL_STATE | DIRTY_COLORWRITEMASK }, { GE_CMD_ZTEST, FLAG_FLUSHBEFOREONCHANGE, DIRTY_DEPTHSTENCIL_STATE }, { GE_CMD_ZTESTENABLE, FLAG_FLUSHBEFOREONCHANGE, DIRTY_DEPTHSTENCIL_STATE | DIRTY_FRAGMENTSHADER_STATE },