Repository navigation
Age of Mythology: Retold (PPSA18653) #15328
XatiX
started this conversation in
Game bring-up
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Existing thread
Title
Age of Mythology: Retold (PPSA18653)
Content version tested
01.043.000 (with DLC)
AnyPS5 commit
Updated 2026-11-04. A local stack on
main1e658521a0, made of these pull requests and one local copy of #7508, in this order:APS5_FAIL_UNKNOWN_CLOCKS=1makes clock ids 16 to 31 fail withEINVALPlain
mainstill hangs the GPU (blocker 1).System tested
Windows 11 Pro 26300, Ryzen 7 9800X3D, NVIDIA GeForce RTX 5080 (driver 617.42), MinGW-w64 GCC, Release.
Furthest point
Title screen ("Press to continue"), with no input sent
What is shown
The title screen renders correctly at 3840x2160, with music, at about 0.48 FPS (2.1 s per frame). Earlier runs with only blockers 1 and 2 fixed reached the first-run preferences screen ("Welcome to Age of Mythology: Retold") with music, at about 0.14 FPS. At these speeds the first frame stays black for several seconds before the screen appears. Input, menus and play are not tested yet.
Current blocker
GPU hang, fixed by fix(agc): copy GPU-side indirect draw records when the packet is processed #15327 (open).
vkCmdDrawIndirect. VK_LAYER_LUNARG_crash_diagnostic found it, and Nsight Aftermath reports the device as hung with no active warps.APS5_NO_HOST_IMPORT=1orAPS5_NO_GPU_INDIRECT_DRAW=1also avoid the hang onmain.clock_gettime: unsupported clock_id 20, thenabort()at about 50 s, fixed withAPS5_FAIL_UNKNOWN_CLOCKS=1(feat(libkernel): fail unknown clock ids 16 to 31 with EINVAL on request #15656, open).gettimeofday, thentime(0), when the call fails; a sibling function uses clock 0.Speed: the title runs on one CPU-bound worker thread. The title screen issues about 650 draws per frame, and each binds a bindless image table of about 14,200 entries that the game rewrites in part once per frame.
Before perf(agc): reuse image tables that hold storage-viewed entries #15563, every draw resolved every table entry: 5.3 s per frame in
Resources.Complete, of which worker sampling put 56 % inShaderResources::resolveImageTablesand 35 % in the per-entry texture lookup. The existing table reuse never applied (0 reused), because about 1.6 % of each table's entries (about 229) are surfaces in host-imported memory, sampled as views of their storage images, and one such entry kept the whole table from being reused. The welcome screen then had about 730 draws per frame, with the GPU busy about 330 ms per frame.Median frame time on the title or welcome screen, idle, from traces with
APS5_TRACE_SECONDS=20:60(one run each, measured in this order):Where a frame goes now:
CPU, about 2.6 ms per draw:
Graphics::Draw) about 1.5 ms;APS5_RESULT_MEMO_MB=256; 1024 helps about 7%);GPU, about 225 ms per frame (
APS5_PROFILE_GPU). Two small pixel shaders take about 120 ms of it:Both sample through the table with a waterfall loop over a per-pixel index. Uploads and copies are a few ms.
The draw cache never hits:
deferred write-back failed ... words ffffffff ... invalid format, 60 to 78 lines per run), fixed by fix(shader): map image-table entries filled with ones to no record #15611. Three or four pixel shaders select table entries filled with 0xFFFFFFFF, and the picture is the same with and without the fix.Next steps
How it was run
The dump's contents go into
app0\.eboot.bin,sce_module\*.prx(5) andext_module\*.prx(6: Party, PlayFabCore.PS, PlayFabServices.PS, libHttpClient, libfmod, libfmodstudio) are unwrapped withtools/unwrap_self.py. The backport'sfakelib\libSceAgc.sprxis left out.tools/import_audit.py --libs libs --modules app0/ext_module --modules app0/sce_module *.registry.jsonis clean.APS5_FAIL_UNKNOWN_CLOCKS=1is needed with #15656 to get past blocker 2.Tools that helped:
APS5_PROFILE_DRAW,APS5_PROFILE_GPUwithAPS5_PROFILE_GPU_DRAWS,APS5_SAMPLE_WORKERwithtools/symbolize_samples.py, andAPS5_DUMP_SHADERSwithAPS5_DUMP_PREPARE_INPUTSandagc_shader_replay --asmto disassemble a shader. For the hang: VK_LAYER_LUNARG_crash_diagnostic (its dump goes to%USERPROFILE%\cdl), Nsight Aftermath (nv-aftermath-control --mode Globalelevated,nv-aftermath-monitor,nv-aftermath-format -j),APS5_TRACE_INDIRECT_DRAWS,APS5_CHECK_INDIRECT_ARGS,APS5_HANG_DUMP_SECS, andAPS5_TRACE_CALLS=all(needs a conversion with--trace-imports).AI-assisted testing and report: yes (Claude Code).
All reactions