GPU: Write stencil fail to alpha is RGB masked.

See #15813 (Hunter x Hunter) which does this for shadows.
This commit is contained in:
Unknown W. Brackets 2022-08-09 18:45:27 -07:00
parent 929266cc9e
commit 710abcc288
2 changed files with 9 additions and 1 deletions

View file

@ -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;

View file

@ -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 },