Firmware 4.03 shows the ACB and DCB variants share the same
reserve-and-emit structure and differ only in a flag bit the command
IR does not model, so mirror the DCB NOP-carried semantic payloads:
stream and workload ids plus the 64-bit mask for complete and active,
stream id only for inactive (9 dwords, matching
sceAgcDriverGetSetWorkloadStreamInactivePacketSize). Validation is
identical to the DCB twins: null buffer, unregistered or out-of-range
stream, workload ids above 63, empty or oversized id lists and
duplicate ids all return null.
Generated with [Devin](https://devin.ai)
Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
On a PS5 the builder writes 15 dwords: a tag write of 0xc6000006, opcode 0x3a with its arguments, initiator 0x80 whatever the modifier, and a closing tag write; GetSize returns 60. AnyPS5 wrote NUM_INSTANCES and DRAW_INDEX_2 under argument meanings nothing confirms. The driver refuses 0x3a, whose field meanings are not known, and names it DRAW_INDEX_MULTI_INST as Linux's nvd.h does.
On a PS5, sceAgcAcbWaitOnAddressGetSize and sceAgcDcbWaitOnAddressGetSize return 56 for size 0, 64 for size 1 and 0 for any other 32-bit value, and sceAgcDcbContextStateOpGetSize returns 0 for an operation above 3. The ACB wait size takes a 32-bit argument instead of a byte.
sceAgcDcbWaitRegMem and sceAgcDcbDrawIndirectMulti now write their 0x342 tag writes with header flag bit 2 and sceAgcAcbWaitRegMem with no flags, as libSceAgc on a PS5 does, instead of the predicate bit. ValidateWait accepts both forms and Pm4::IsTagMarker no longer depends on the header flags.
On a PS5 (firmware 13.40) the builder writes SET_UCONFIG_REG 0x342 = 0xc6000005 before its DRAW_INDEX_INDIRECT_MULTI packet and 0xc6000000 after it, 64 bytes in all, and sceAgcDcbDrawIndexIndirectMultiGetSize returns 64.
The 2026-10-21 split PRs added Export.cpp stub files to seven libraries
that have their own CMakeLists.txt, so core/libs/CMakeLists.txt never
adds Export.cpp for them and no target compiled the 101 stubs. A title
that imports one fails to load instead of throwing on the call.
Ngs2, Ngs2.native and AvPlayer.native build with hidden visibility, so
their stub files also need default visibility. libSceNgs2 already
compiled PendingExports.cpp, but its 6 stubs stayed local.
A null command buffer with an unreadable text pointer must take the
checked error path in sceAgcAcbPushMarker; without the buffer check
before measuring the text, the test faults.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01RbLgECLQ2bpDM7oe2urGZK
sceAgcAcbPushMarkerSpan, sceAgcAcbSetMarkerSpan, sceAgcDcbPushMarkerSpan and
sceAgcDcbSetMarkerSpan take (buffer, text, length, color) and, on the console,
build the same user-data marker packet as their NUL-terminated counterparts
with the length given by the caller. They now share the existing marker
packets: the text is cut at the given length and terminated, and the set
variants push and pop as sceAgc*SetMarker does.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01RbLgECLQ2bpDM7oe2urGZK