From d9fbaf767c37099c0b6f974780da6e7f9e1771f7 Mon Sep 17 00:00:00 2001 From: Nesyth <18372752+Nesyth@users.noreply.github.com> Date: Mon, 12 Oct 2026 00:44:54 +0200 Subject: [PATCH] fix(agc): accept a CB metadata pass beside depth state without depth or stencil planes --- .../prx/libSceAgcDriver/Graphics/src/State.cpp | 2 +- .../libs/prx/libSceAgcDriver/tests/Graphics.cpp | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/core/libs/prx/libSceAgcDriver/Graphics/src/State.cpp b/core/libs/prx/libSceAgcDriver/Graphics/src/State.cpp index 3316fd778..981c8dee3 100644 --- a/core/libs/prx/libSceAgcDriver/Graphics/src/State.cpp +++ b/core/libs/prx/libSceAgcDriver/Graphics/src/State.cpp @@ -1004,7 +1004,7 @@ std::optional DecodeColorMetadataPass(const QueueState& queue if (mode != 2u && mode != 6u && !resolve) return std::nullopt; ColorMetadataPass pass{resolve ? ColorMetadataPass::Mode::Resolve : mode == 2u ? ColorMetadataPass::Mode::EliminateFastClear : ColorMetadataPass::Mode::DccDecompress, {}, std::nullopt}; Require((control->second & ~0x70u) == 0xcc0000u, "CB metadata pass with a nonstandard ROP, dual quads disabled or degamma"); - Require((read(cx, 0x200) & 0xfu) == 0 && (read(cx, 0x0) & 0xfu) == 0, "CB metadata pass with depth or stencil work"); + Require(depthPlanesAbsent(cx) || ((read(cx, 0x200) & 0xfu) == 0 && (read(cx, 0x0) & 0xfu) == 0), "CB metadata pass with depth or stencil work"); const auto samples = resolve ? decodeSamples(cx) : 1u; if (!resolve) zero(cx, 0x2f8, ~0u, "multisampling or coverage conversion"); zero(cx, 0x80, ~0u, "window offset"); diff --git a/core/libs/prx/libSceAgcDriver/tests/Graphics.cpp b/core/libs/prx/libSceAgcDriver/tests/Graphics.cpp index 0103b5aec..c0b2cc36e 100644 --- a/core/libs/prx/libSceAgcDriver/tests/Graphics.cpp +++ b/core/libs/prx/libSceAgcDriver/tests/Graphics.cpp @@ -1434,6 +1434,23 @@ void metadataPassTests() { queue.context[0x202] = 0xcc0060; queue.context[0x200] = 2; expectFailure([&] { DecodeColorMetadataPass(queue); }, "depth or stencil work"); + queue.context[0x10] = 0x80000180; + queue.context[0x11] = 0x20000180; + queue.context[0x200] = 0x700763; + queue.context[0x0] = 0x20; + Require(DecodeColorMetadataPass(queue).has_value(), "depth and stencil state without depth or stencil planes refused the pass"); + queue.context[0x10] = 0x80000183; + expectFailure([&] { DecodeColorMetadataPass(queue); }, "depth or stencil work"); + queue.context[0x10] = 0x80000180; + queue.context[0x11] = 0x20000181; + expectFailure([&] { DecodeColorMetadataPass(queue); }, "depth or stencil work"); + queue.context[0x11] = 0x20000180; + queue.context.erase(0x200); + queue.context.erase(0x0); + Require(DecodeColorMetadataPass(queue).has_value(), "unwritten depth and render control refused a pass without depth or stencil planes"); + queue.context.erase(0x10); + queue.context.erase(0x11); + queue.context[0x0] = 0; queue.context[0x200] = 0x70; Require(DecodeColorMetadataPass(queue).has_value(), "an always-pass depth function without a test refused the pass"); queue.context[0x91] = 0x40020;