Skip to content

test(agc): cover the draw-indirect, index-offset, instance count and index size packets - #11678

Open
milescoviello wants to merge 2 commits into
boykopovar:mainfrom
milescoviello:test/agc-draw-packets
Open

milescoviello wants to merge 2 commits into
boykopovar:mainfrom
milescoviello:test/agc-draw-packets

Conversation

@milescoviello

@milescoviello milescoviello commented Oct 27, 2026 •

Copy link
Copy Markdown
Contributor

What

tests/Commands.cpp gets a testDrawPackets case after testIndexBuffer. With modifier 0, sceAgcDcbDrawIndirect writes a five-word DRAW_INDIRECT with the argument offset, both patch offsets at 0x280 and the auto-index initiator 2. Modifier bit 8 adds 0x20 to the initiator unless bit 32 is set. sceAgcDcbDrawIndexOffset writes a five-word DRAW_INDEX_OFFSET_2 whose first word is the index count, or 1 for a count of 0. sceAgcDcbSetNumInstances writes the two-word NUM_INSTANCES. sceAgcDcbSetIndexSize writes the index size and cache policy (bits 6-7) into the second word of its three-word packet, and sceAgcDcbSetIndexSize_0600 adds the per-instance object id at bit 14. A misaligned argument offset, a modifier past 33 bits, an index size above 2, a cache policy above 3 and an object id above 1 are refused before anything is written, and the size getters report 20, 20, 8 and 12 bytes.

It is called by all eight titles run here for sceAgcDcbSetNumInstances; PPSA01494, PPSA03984, PPSA18194, PPSA30839, PPSA31162, PPSA34502 and PPSA36591 for sceAgcDcbDrawIndirect; PPSA01494, PPSA18194, PPSA21564, PPSA30839, PPSA31162, PPSA34502 and PPSA36591 for sceAgcDcbSetIndexSize_0600; PPSA01494, PPSA21564, PPSA30839, PPSA31162, PPSA34502 and PPSA36591 for sceAgcDcbDrawIndexOffset; PPSA03984 for sceAgcDcbSetIndexSize (call sites found through the import's PLT stub in each title's relinked eboot.bin), and until now no test called it.

Changed: core/libs/prx/libSceAgc/tests/Commands.cpp. Test only, no change to the library.

Tested

Linux (Ubuntu 26.04, GCC 15.2), Release: cmake --build build --target agc_command_tests and ctest -R '^agc_commands$' --repeat until-fail:3 pass on this branch, which is current main plus the test. tools/check_conventions.py --base upstream/main passes.

Windows 11 with an RTX 2070 SUPER (maskym's run, NVIDIA 621.01, Khronos validation layer, WinLibs GCC 15.2, Release): this PR's tests pass at head 60ee0115d0 merged into main f759e165d9, in a joint tree with other open PRs, and every other agc and video_out test gives the same result as on main.

Checklist

  • Based on current main; no other open PR implements the same functions
  • One topic per PR; follow-ups go in a new PR
  • No comments in code except technical debt
  • Unimplemented paths throw (NotImplemented_nid_no_patch); silent stubs are listed under Silent stubs in their library's technical debt file
  • No notes, investigation .md files or images added to the repository (attach them to this PR)
  • New third-party code is a submodule built from source
  • Generic behaviour, not specific to one title
  • Depends on: none
  • Fixes: none
  • Unblocks: none
  • GPUs tested: n/a
  • AI-assisted: yes

🤖 Generated with Claude Code

milescoviello and others added 2 commits October 27, 2026 02:28
…index size packets

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…unchanged

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@milescoviello

Copy link
Copy Markdown
Contributor Author

Pushed 60ee011. It applies the check MarcZX10 asked for on #11674: the refused-packet buffer is filled with a sentinel first, and after each refusal the test compares all 64 words and cursor_up with the snapshot, instead of only the first word. agc_initialization and agc_commands pass on Linux.

AI-assisted: yes (Claude Code)

@milescoviello

Copy link
Copy Markdown
Contributor Author

Windows 11 VM (GT 1030, NVIDIA 582.66, WinLibs GCC 15.2.0, Release, Ninja): this head 60ee0115d0 and its base main abed035 each build agc_command_tests, and agc_initialization and agc_commands pass 3 of 3 on both.

AI-assisted: yes (Claude Code)

@maskym

maskym commented Oct 28, 2026

Copy link
Copy Markdown
Contributor

Windows + NVIDIA result for head 60ee0115d0, merged into main f759e165d9 (the PR's GPUs tested line names no NVIDIA run on Windows).

This PR's own tests: the libSceAgc packet tests agc_commands (0.15 s), agc_shader_helpers (0.08 s), agc_register_command_tests, agc_dma_data_tests and agc_initialization, which are CPU-side, all passed.

Host: Windows 11 26300, Intel i7-12700K, NVIDIA GeForce RTX 2070 SUPER (vendor 0x10de, device 0x1e84; Vulkan loader 1.4.357 from the NVIDIA driver 621.01), Khronos Validation Layers nightly 1.4.366 (b2b44c0d37) through VK_ADD_LAYER_PATH, WinLibs GCC 15.2.0 (x86_64-ucrt-posix-seh, r6), Release, BUILD_TESTING=ON, Ninja.

Same focused run on main f759e165d9 and on this tree, same machine and GPU: VK_INSTANCE_LAYERS=VK_LAYER_KHRONOS_validation, ANYPS5_NO_SHADER_CACHE=1, ANYPS5_REQUIRE_VULKAN=1, VK_LOADER_DEBUG=error,warn,layer, ctest --test-dir build -R '^(agc|guest_video_out|video_out)' --parallel 4 -V.

The tree also carried the open PRs #11948, #12062, #12132, #12070, #11680, #11679, #11677, #11675, #11674, #11605, #11604, #11600, all merged cleanly, so the run is a joint one. Not run on a PS5.

AI-assisted: yes (Claude Code), the runs and the numbers above are from this machine.

@milescoviello

Copy link
Copy Markdown
Contributor Author

@maskym thanks for the Windows NVIDIA run with the validation layer. I've added it to Tested.

AI-assisted: yes (Claude Code)

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

agc libSceAgc*

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants