From 2cd5c75dc8f8238d72c688cc032b032b2067b346 Mon Sep 17 00:00:00 2001 From: Michon <231849@buas.nl> Date: Tue, 13 Oct 2026 17:43:13 +0200 Subject: [PATCH] fix(agc): a pipelined release with INT_SEL 3 raises no interrupt The pipelined label path treated every nonzero RELEASE_MEM INT_SEL as an end-of-pipe interrupt; main's PacketMemory excludes 3 (send data after write confirm). agc_driver failed on it with APS5_PIPELINED_DRAWS=1 ("release with INT_SEL send data after write confirm raised an interrupt"). Co-Authored-By: TheAggie <67454+TheAggie@users.noreply.github.com> Co-Authored-By: Claude Opus 5.5 (1M context) --- .../Execution/src/Driver/Packets/PacketMemory.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/libs/prx/libSceAgcDriver/Execution/src/Driver/Packets/PacketMemory.cpp b/core/libs/prx/libSceAgcDriver/Execution/src/Driver/Packets/PacketMemory.cpp index 8a5d4da464..f8704cd755 100644 --- a/core/libs/prx/libSceAgcDriver/Execution/src/Driver/Packets/PacketMemory.cpp +++ b/core/libs/prx/libSceAgcDriver/Execution/src/Driver/Packets/PacketMemory.cpp @@ -334,7 +334,8 @@ void Driver::commitDmaStore(std::uint32_t queue, std::uint64_t address, std::spa bool Driver::enqueueLabelPacket(std::span packet, std::uint32_t opcode, std::uint32_t queue) { static const bool ordered = std::getenv("APS5_PIPELINE_DRAIN_LABELS") == nullptr; if (!ordered || !DeferLabels() || (opcode != 0x49 && opcode != 0x37)) return false; - const bool endOfPipeInterrupt = opcode == 0x49 && ((packet[2] >> 24u) & 7u) != 0; + const auto interruptSelect = opcode == 0x49 ? (packet[2] >> 24u) & 7u : 0u; + const bool endOfPipeInterrupt = interruptSelect != 0 && interruptSelect != 3; const auto label = Pm4::DecodeLabelWrite(packet); if (!label.has_value()) { if (opcode != 0x49) return false;