Repository navigation
Hollow Knight: Silksong (PPSA12544) on Linux #1519
Replies: 4 comments 1 reply
|
Update: gameplay reached on Linux. The game now gets past the intro cinematic into gameplay. It runs slowly (7–19 fps on a GTX 1050 Ti) and the cinematic still flickers; both are being looked at. The branch
Also: the white box sometimes drawn over the "O" of OPTIONS on the title screen comes and goes between runs, and is older than these changes. This update was investigated and written by Claude Code (AI), and posted by me after review. |
Update: the Linux fixes are now PRs The two changes that got Silksong past the end of the intro cinematic, plus the flicker fix, are now separate PRs on current
With #1586 and #1600 (on the test stack), the cinematic plays through and the game reaches gameplay: the tutorial area loads and the game saves. Still open:
|
|
Linux NVIDIA here too (RTX 5070 Ti, 595.91.07, Nobara 44), running Demon's Souls (PPSA01341). Before you set the baseline, these are the Linux costs that skewed our numbers. All are quick to check. Window placement. When our window sat off-screen (on an output that was switched off), KWin on NVIDIA throttled swapchain acquire in FIFO, and the title's WAIT_FLIP_DONE waited about 129 ms per flip. The movie went from 5.5 to 19-27 fps when the window moved to a visible output. I haven't tried Hyprland. A window on a hidden workspace may be throttled the same way, so keep it visible during baseline runs. PROCMAP_QUERY per guest-range check. Since #157, each page-access check is one sudo bpftrace -e 'tracepoint:syscalls:sys_enter_ioctl /pid == $1/ { @[args->cmd] = count(); }
interval:s:10 { print(@); clear(@); }' $(pgrep -f app.elf)Title threads starving the queue worker. DS's 12 job workers spin on all 12 hardware threads. Over 25 s of movie, the queue-0 worker spent 7.6 s preempted and 3.8 s waiting in the run queue. Raising only the driver's queue threads (nice -10 through rtkit) took the movie from 25 to 33-35 fps. GPU or CPU. With Method. Single runs misled us more than once. After a recompiler change, the first run builds the shader cache (we saw 0.04-0.2 fps in that run), so we throw it away, interleave A and B (ABAB, 2-4 runs each) and compare medians over the steady windows. I have a small script that digests an AI-assisted: yes (Claude Code; the runs are on my machine). |
Update: sound sync, the load crash, and first performance numbers Thanks to @hikazey for testing #1586 on Windows: the PE output is byte-identical with and without the PR, and the full suite passes there. Sound ahead of the picture (issue #1635)
Crash while loading the first area: White boxes over menu letters Performance, first measurements (Hyprland, GTX 1050 Ti)
|
Uh oh!
There was an error while loading. Please reload this page.
Bring-up notes for Hollow Knight: Silksong (PPSA12544) on Linux, kept separate from the Windows thread (#726). Everything below can be reproduced from a ready-made branch.
Status (2026-10-08)
Terminating due to uncaught exception of type Il2CppExceptionWrapper. This is being investigated; I will post updates here.guest memory changed while GPU results were pending; keeping the CPU's blocks, agc-driver: storage image write-back drops GPU results for CPU-stamped 64 KiB edge blocks (boxes in Silksong's menu text) #865), but that is not confirmed.Test machine: Arch Linux, i7-8750H, GTX 1050 Ti Max-Q 4 GB, NVIDIA 580.178.04, Wayland (Hyprland), GCC.
Ready-made branch
awake-devel/AnyPS5@test/silksong-linux(fbb383e). It ismain296d68a plus the open PRs below and one local workaround. It is a test stack, not a PR.What is in it, in the order each one became necessary
sce_module/libc.prx'smallocreturns NULL insideIl2cppUserAssemblies.prx_umtx_opmissingMedia/Plugins)sceKernelLoadStartModule with start arguments not implemented#ifdef _WIN32insceKernelLoadStartModule: Windows keeps #846's call, Linux uses #1102's blockIl2CppUserAssemblies.prxrequested, but the file isIl2cppUserAssemblies.prx(ENOENT, then a jump to address 0)CppWebApi::Common::initialize() failed(0x80553504): the bundled libc refuses a heap above the PS5 address windowdisplay buffer ... reads mixed DCC keys ... not implementedDepthSurfaceTextureis resolved by keeping #454's function and applying #1495's rule only on its single-slice sampled path.Running it
eboot.bin,sce_module/,Media/Modules,Media/Plugins) as relinker input, and the full game folder asapp0/.app0/is the folder the relinker writes the*.guest.prxfiles into:main. fix(agc): keep dma-buf import off the NVIDIA proprietary driver #1329 fixed the NVIDIA device creation (AGC: Vulkan device creation fails on the NVIDIA proprietary driver since #943 (dma-buf import probe) #1289).Notes
libc.prx, both libc instances run the application-heap handshake, so the title initialises its main pool twice #693 (both libc copies initialise the heap). Nothing suspicious so far, up to the cinematic.sceKernelGetModuleInfoFromAddrwith an uninitialised size, which throws (ModuleInfo.cpp). This only happens at shutdown.#ifdef _WIN32side of the feat(relinker): add --module-dir for modules loaded at run time #846/fix(libkernel): pass module args and argp to runtime-loaded modules on Linux #1102 merge was not built on Windows.If you try it on another distribution or GPU, please post how far it gets and the last lines of the log.
All reactions