[Tracking] Linux and Steam Deck: GPU hangs, crashes, low FPS and build failures #1000

Open
opened 2026-11-09 05:39:03 +00:00 by NotRexed · 102 comments
NotRexed commented 2026-11-09 05:39:03 +00:00 (Migrated from github.com)

This issue collects every open report of Linux / Steam Deck GPU hangs, crashes, low fps and build failures, so there is one place to follow it. The individual reports were closed pointing here; their logs, screenshots and discussion stay in each linked issue.

Summary

Linux reports that are still open after v2.0.6:

  • RADV GPU hangs (gfx ring timeout and GPU reset);
  • low fps on RADV, limited by submits;
  • coloured noise on RADV;
  • NVIDIA driver crashes;
  • AppImage builder link failures.

Two Linux problems are fixed in v2.0.6:

  • the RADV crash right after "Preparing shaders" (write 0x40 in libvulkan_radeon.so, #803, PR #834);
  • builds stopping with BrokenPipeError / signal 9 or stuck at "jump tables".

Affected GPUs and versions

  • GPUs: Steam Deck (LCD / OLED), Steam Machine, RX 6600 to RX 9070 XT, Radeon 680M / 780M / 8060S on RADV; RTX 3060 / 3090 / 4090 / 5070 / 5090 on the NVIDIA driver.
  • Systems: CachyOS, Bazzite, SteamOS, Fedora, NixOS, Pop!_OS, Arch.
  • Versions: v2.0.1-v2.0.5 and main.

Evidence from the logs

RADV GPU hangs

  • #620: gfx ring timeout and MODE1 reset about 3 minutes in. v2.0.5 checkpoints: last finished c36a4f3f667c886a, first unfinished 89ca750f9852b7ca (the foliage colour pass).
  • #604 (RX 6800 XT): comp ring then gfx ring timeout, and the PC reboots.
  • #817 (Steam Deck): hardicd traced the hang to the task shader code 2c56dc1006942f74, a nested 2D culling loop that runs for seconds.
  • #984 (680M): MODE2 reset after the intro movie; fine on Windows on the same laptop.
  • #977 (RX 6600, Fedora): device lost after the logo.

RADV low fps

  • #528: the batched-submit poll flushes 10x more. RX_VK_BATCH_POLL_US=2000 restores the fps (+65% on a 7900 XTX); RX_VK_PARALLEL=4 with HOS_FPS_TARGET=60 reached 55 fps.
  • #789 (8060S): each vkQueueSubmit2 costs about 2 ms (userptr imports), a cap of about 42 fps.
  • #756, #776: similar reports (Steam Machine in #776).
  • v2.0.6 makes fewer submits on RADV (PR #689) and puts the startup compute shaders behind the driver-crash guard (PR #758).

RADV rendering

  • #361: coloured noise after the intro; Resolution 50% worked around it.
  • #873: garbled colours.

NVIDIA on Linux

  • #801: segfault in libnvidia-gpucomp.so.580.142 during a pipeline compile; the bundled SDL picked the offscreen driver.
  • #797: exits at "no graphics server yet (headless)".
  • #950: freeze when throwing bombs (dma-buf not imported (-2)).
  • #745: black textures.

Start-up

  • #836, #862: may be the write-0x40 crash fixed in v2.0.6; please retest.

Builder

  • #478 (Deck): lift.py stops on "ADR / ADRP+ADD code addresses outside the unwind-covered functions".
  • #733, #890: link FAILED with undefined f_8xxxxxxx symbols. Deleting sa/gen/.lift_key is the workaround in #890; open PR #918 stops reusing an incomplete lift.
  • #762: builder error, photo only.
  • #990 (kept open as a separate bug): the v2.0.6 AppImage build stops at hos_main.c:14: fatal error: '../gpu/vk/oot_cheat_items.h' file not found. A commenter copied gpu/vk/oot_cheat_items.h from main into ~/.local/share/hookshot/builder/versions/v2.0.6/usr/share/hookshot/gpu/vk/ and the build finished.

Wayland

  • #992 (hybrid AMD iGPU + GTX 1650, COSMIC Wayland): freezes after nvn: window of 3 textures and never reaches vkCreateInstance. It runs with SDL_VIDEODRIVER=x11 plus VK_DRIVER_FILES=/usr/share/vulkan/icd.d/nvidia_icd.json.

Workarounds

  • Steam Deck GPU hang (#817): RX_VK_NO_MESH=1 avoided it on v2.0.4 / v2.0.5. RX_VK_SKIP_CODE=2c56dc1006942f74 needs hardicd's patch and is not in a release.
  • RADV low fps: RX_VK_BATCH_POLL_US=2000, RX_VK_PARALLEL=4.
  • RADV coloured noise: Resolution 50%.
  • Builder link FAILED: delete sa/gen/.lift_key and build again.
  • Wayland on hybrid laptops: SDL_VIDEODRIVER=x11 (#992).

Reports merged here (25 issues, about 53 people)

Issue Title People GPU Version Key detail
#361 Corrupted rendering (noise / psychedelic colours) on AMD RADV (BC-250… 9 BC-250, RX 6600, RX 580, Ally X, RX 6800 XT (RADV) v2.0.1 RADV coloured-noise picture after intro: PR #425 (in v2.0.0) fixes the noise per adnanioricce (Ally Z1E Bazzite); Resolution 50% worked around it. sabogalc RX 6800 XT Ca…
#620 Crash On RX 6600 6 RX 6600 x3, RX 6900 XT (RADV) v2.0.5 Linux RADV hang ~3 min into intro/Kokiri (gfx ring timeout, MODE1 reset, KWin dies); v2.0.5 checkpoints: last finished c36a4f3f667c886a, first unfinished 89ca750f9852b7c…
#817 GPU hang on Steam Deck running CachyOS (RADV): gfx ring timeout, ring… 5 Steam Deck (CachyOS, SteamOS 3.8/3.9.5) v2.0.4-v2.0.5 GPU hang (gfx ring timeout, reset fails) in Kokiri/Deku Tree on RDNA2 Deck: hardicd traced it to one task shader, NVN code 2c56dc1006942f74 (~30 programs, nested 2D cull…
#528 [AMD RX 9070 / RADV Linux] Low FPS (22-25) in Kokiri Forest + color d… 4 RX 9070, RX 9060 XT, RX 7900 XTX, Radeon 860M (RADV) v2.0.1 RADV low fps: faster-fps batched-submit poll flushes 10x more (11.5 -> 2.5 fps on 9060 XT); RX_VK_BATCH_POLL_US=2000 restores (+65% on 7900 XTX); PR #448 udmabuf halves…
#50 Tested on CachyOS (Linux) with RX 6700 XT + Ryzen 5 5600 3 RX 6700 XT, RX 6600 (CachyOS) early Linux: 9-10 fps, black after cutscene 30 min
#756 Just unplayable on mid-high end setup (on Linux) 3 RX 9070 XT (CachyOS) v2.0.2 5-10 fps at start, CPU 35% GPU 45%, no visible shader preparation (RADV poll issue #528?)
#776 Steam Machine 3 Steam Machine (RDNA3 Navi 33) v2.0.2 10-15 fps in Kokiri with CPU/GPU ~30% (SteamOS); another Steam Machine user can't open it
#478 steam deck build error app image 2 Steam Deck device-lost-fix Steam Deck AppImage build stops in lift.py: "ADR / ADRP+ADD code addresses outside the 284387 unwind-covered functions: 14083" with romfs/exefs and .nup; another Deck us…
#873 Game freezes on loading screen and crashes OS after restarting due to… 2 RX 6600 XT (RADV), MSI Claw 8 AI+ (Arc) v2.0.0 Garbled colours at the Deku Tree/Navi scene, save load hangs, OS freeze
#490 Cachyos & AMD Testing Info (9070XT, R7 5800X) 1 RX 9070 XT (CachyOS) no-visual-studio Stutter, flashing, freezes to one frame (log)
#604 RX 6800 XT (RADV, Linux): GPU hang and full GPU reset a few seconds a… 1 RX 6800 XT (RADV) main 97e7c55 RADV RDNA2: GPU hang (comp ring then gfx ring timeout, MODE1 reset, PC reboot) a few seconds after loading a Kokiri save, also with RX_VK_KEEP_RETIRED=1; no page fault;…
#733 Build error: link FAILED (0s), 0 undefined symbols 1 Steam Deck v2.0.3 Linux link fails: v2.0.2 missing code_0xx.o objects, v2.0.3 ld.lld undefined symbols f_82647a90... (new code split)
#745 Black screen and bad renderings in hyrule castle and death montain af… 1 RTX 4090 (Linux 615.78) v2.0.2 Hyrule Castle / Death Mountain black textures and shaders after v2.0.2, fixed by restart for a while (log)
#762 Error in linux builder lastest versión 1 SteamOS v2.0.3 Linux builder compile error, only a photo of the screen
#770 RX 6700XT Ryzen 5 5600 graphic driver crash and low fps 1 RX 6700 XT (RADV CachyOS) v2.0.3 Wrong colours, PC crash when the Deku Tree appears, 23 fps (5 logs)
#789 RADV (Radeon 8060S / Linux): each vkQueueSubmit2 costs ~2 ms on the r… 1 Radeon 8060S (RADV) v2.0.2 Each vkQueueSubmit2 ~2 ms on the replay thread (userptr imports), ~42 fps cap; submit thread patch +4-8 fps but flashes; asks RX_VK_WAIT_GPU=1 default on RADV
#797 Immediate crash on Linux (Pop!_OS, NVIDIA GTX 1650) - headless graphi… 1 GTX 1650 (Pop!_OS) v2.0.4 Linux AppImage exits at once: log stops at "no graphics server yet (headless)" then "window closed, exiting" (SDL video driver; cf. #801 offscreen driver on NixOS)
#801 Linux/NVIDIA: gameplay freeze and crash in libnvidia-gpucomp.so.580.1… 1 RTX 3060 (NixOS, driver 580.142) a598b9f Segfault in libnvidia-gpucomp.so.580.142+0xe3facc on an mkw_vk worker (pipeline compile) after 2 h, and again at the next start after 27 s; 18 GB RAM + full swap; bundle…
#836 SteamOS 9070XT never launches after successful setup 1 RX 9070 XT (SteamOS) v2.0.5 SteamOS: Play does nothing, icon in taskbar, no window (log .1); maybe same as #803
#862 Steam Deck (RADV VANGOGH): process exits leaving the starting room th… 1 Steam Deck OLED (RADV VANGOGH) main 58af2c0 / 15ec28d Process exits (exit 0, no device lost) walking out of the starting room on 58af2c0 + ms-eviction patch; vanilla 15ec28d segfaults write 0x40 in libvulkan_radeon.so durin…
#890 Linux AppImage v2.0.5: link FAILED, 20 undefined symbols (f_811f3a80… 1 Linux v2.0.5 Linux link fails with 20 undefined f_81xxxxxx: lift cache (.lift_key) reused C missing the code_NNN_k parts; delete sa/gen/.lift_key; PR #918 stops reusing an incomplete…
#950 Frozen Screen when throwing bombs 1 RTX 5070 (Linux) v2.0.5 Picture freezes when throwing bombs; one log crashes reading guest memory in hookshot_vk.so; dma-buf not imported (-2) in all logs
#977 [AMD RX6600] Saturated colors, crashes after the first scene of the i… 1 RX 6600 (RADV, Fedora) v2.0.5 Oversaturated colours, crash right after the logo that takes down the GNOME session; device lost in both logs
#984 [CachyOS Linux/AMD] GPU hang (gfx ring timeout → MODE2 reset, device… 1 Radeon 680M (RADV, CachyOS) a598b9f GPU hang after the intro movie (gfx ring timeout, MODE2 reset, device lost), 4 times; fine on Windows on the same laptop (honest-eta-era build)
#992 [Wayland] Freezes after NVN window creation on hybrid AMD+NVIDIA lapt… 1 GTX 1650 + Renoir iGPU (hybrid, Pop!_OS COSMIC Wayland) v2.0.5 Wayland hybrid laptop: freezes after 'nvn: window of 3 textures', renderer never reaches vkCreateInstance, process unkillable (D state); works with SDL_VIDEODRIVER=x11 +…

Adding a report

Please update to v2.0.6 first (https://github.com/NotRexed/Hookshot/releases/tag/v2.0.6; Update next to Play in the launcher). Please add: distro, kernel, Mesa or NVIDIA driver version, GPU, version, hookshot_log.txt, and for hangs the dmesg lines around the reset.

All tracking issues

  • #993 Garbled / rainbow textures that get worse over play time (VRAM over budget, mostly 4-8 GB cards)
  • #994 Floating trees, missing mountains and vanishing near vegetation
  • #995 Low FPS with low GPU usage (CPU-bound), FPS drops in Castle Town / Hyrule Field, shader stutter
  • #996 AMD on Windows: driver crash, device lost or freeze (RX 5000-9000, Deku Tree / after cutscenes)
  • #997 AMD handhelds and APUs (ROG Ally / Ally X, Legion Go, Radeon 780M/860M/890M): black screen, device lost, reboot
  • #998 Black screen with audio after the intro / at the Deku Tree cutscene
  • #999 Intel Arc and Core Ultra iGPUs: device lost, black screen after the intro, Linux ANV crashes
  • #1000 Linux and Steam Deck: GPU hangs, crashes, low FPS and build failures
  • #1001 GPUs without mesh shaders (GTX 9xx/10xx, RX 400/500/5000, Iris Xe/UHD): v2.0.6 fallback reports
  • #1002 Invisible or missing objects, walls and effects
  • #1003 Antivirus false positives on HookshotBuilder.exe (Defender Trojan:Script/Wacatac.H!ml)
  • #1004 Lighting: overexposure, over-bright bloom, crushed or black shadows, black faces
  • #1005 Flicker and flashing: brightness pulses, one-frame flashes, doubled image with frame pacing
  • #1006 AMD rendering: white silhouettes, block squares / grid lines, no anti-aliasing (networks in software)
  • #1007 Feature requests (collected)
This issue collects every open report of Linux / Steam Deck GPU hangs, crashes, low fps and build failures, so there is one place to follow it. The individual reports were closed pointing here; their logs, screenshots and discussion stay in each linked issue. ## Summary Linux reports that are still open after v2.0.6: - RADV GPU hangs (gfx ring timeout and GPU reset); - low fps on RADV, limited by submits; - coloured noise on RADV; - NVIDIA driver crashes; - AppImage builder link failures. Two Linux problems are **fixed in v2.0.6**: - the RADV crash right after "Preparing shaders" (write 0x40 in libvulkan_radeon.so, #803, PR #834); - builds stopping with BrokenPipeError / signal 9 or stuck at "jump tables". ## Affected GPUs and versions - **GPUs:** Steam Deck (LCD / OLED), Steam Machine, RX 6600 to RX 9070 XT, Radeon 680M / 780M / 8060S on RADV; RTX 3060 / 3090 / 4090 / 5070 / 5090 on the NVIDIA driver. - **Systems:** CachyOS, Bazzite, SteamOS, Fedora, NixOS, Pop!_OS, Arch. - **Versions:** v2.0.1-v2.0.5 and main. ## Evidence from the logs **RADV GPU hangs** - **#620:** gfx ring timeout and MODE1 reset about 3 minutes in. v2.0.5 checkpoints: last finished c36a4f3f667c886a, first unfinished 89ca750f9852b7ca (the foliage colour pass). - **#604** (RX 6800 XT): comp ring then gfx ring timeout, and the PC reboots. - **#817** (Steam Deck): hardicd traced the hang to the task shader code 2c56dc1006942f74, a nested 2D culling loop that runs for seconds. - **#984** (680M): MODE2 reset after the intro movie; fine on Windows on the same laptop. - **#977** (RX 6600, Fedora): device lost after the logo. **RADV low fps** - **#528:** the batched-submit poll flushes 10x more. `RX_VK_BATCH_POLL_US=2000` restores the fps (+65% on a 7900 XTX); `RX_VK_PARALLEL=4` with `HOS_FPS_TARGET=60` reached 55 fps. - **#789** (8060S): each vkQueueSubmit2 costs about 2 ms (userptr imports), a cap of about 42 fps. - **#756, #776:** similar reports (Steam Machine in #776). - v2.0.6 makes fewer submits on RADV (PR #689) and puts the startup compute shaders behind the driver-crash guard (PR #758). **RADV rendering** - **#361:** coloured noise after the intro; Resolution 50% worked around it. - **#873:** garbled colours. **NVIDIA on Linux** - **#801:** segfault in libnvidia-gpucomp.so.580.142 during a pipeline compile; the bundled SDL picked the offscreen driver. - **#797:** exits at "no graphics server yet (headless)". - **#950:** freeze when throwing bombs (`dma-buf not imported (-2)`). - **#745:** black textures. **Start-up** - **#836, #862:** may be the write-0x40 crash fixed in v2.0.6; please retest. **Builder** - **#478** (Deck): lift.py stops on "ADR / ADRP+ADD code addresses outside the unwind-covered functions". - **#733, #890:** `link FAILED` with undefined f_8xxxxxxx symbols. Deleting `sa/gen/.lift_key` is the workaround in #890; open PR #918 stops reusing an incomplete lift. - **#762:** builder error, photo only. - **#990** (kept open as a separate bug): the **v2.0.6** AppImage build stops at `hos_main.c:14: fatal error: '../gpu/vk/oot_cheat_items.h' file not found`. A commenter copied `gpu/vk/oot_cheat_items.h` from main into `~/.local/share/hookshot/builder/versions/v2.0.6/usr/share/hookshot/gpu/vk/` and the build finished. **Wayland** - **#992** (hybrid AMD iGPU + GTX 1650, COSMIC Wayland): freezes after `nvn: window of 3 textures` and never reaches vkCreateInstance. It runs with `SDL_VIDEODRIVER=x11` plus `VK_DRIVER_FILES=/usr/share/vulkan/icd.d/nvidia_icd.json`. ## Workarounds - Steam Deck GPU hang (#817): `RX_VK_NO_MESH=1` avoided it on v2.0.4 / v2.0.5. `RX_VK_SKIP_CODE=2c56dc1006942f74` needs hardicd's patch and is not in a release. - RADV low fps: `RX_VK_BATCH_POLL_US=2000`, `RX_VK_PARALLEL=4`. - RADV coloured noise: Resolution 50%. - Builder `link FAILED`: delete `sa/gen/.lift_key` and build again. - Wayland on hybrid laptops: `SDL_VIDEODRIVER=x11` (#992). ## Reports merged here (25 issues, about 53 people) | Issue | Title | People | GPU | Version | Key detail | |---|---|---|---|---|---| | #361 | Corrupted rendering (noise / psychedelic colours) on AMD RADV (BC-250… | 9 | BC-250, RX 6600, RX 580, Ally X, RX 6800 XT (RADV) | v2.0.1 | RADV coloured-noise picture after intro: PR #425 (in v2.0.0) fixes the noise per adnanioricce (Ally Z1E Bazzite); Resolution 50% worked around it. sabogalc RX 6800 XT Ca… | | #620 | Crash On RX 6600 | 6 | RX 6600 x3, RX 6900 XT (RADV) | v2.0.5 | Linux RADV hang ~3 min into intro/Kokiri (gfx ring timeout, MODE1 reset, KWin dies); v2.0.5 checkpoints: last finished c36a4f3f667c886a, first unfinished 89ca750f9852b7c… | | #817 | GPU hang on Steam Deck running CachyOS (RADV): gfx ring timeout, ring… | 5 | Steam Deck (CachyOS, SteamOS 3.8/3.9.5) | v2.0.4-v2.0.5 | GPU hang (gfx ring timeout, reset fails) in Kokiri/Deku Tree on RDNA2 Deck: hardicd traced it to one task shader, NVN code 2c56dc1006942f74 (~30 programs, nested 2D cull… | | #528 | [AMD RX 9070 / RADV Linux] Low FPS (22-25) in Kokiri Forest + color d… | 4 | RX 9070, RX 9060 XT, RX 7900 XTX, Radeon 860M (RADV) | v2.0.1 | RADV low fps: faster-fps batched-submit poll flushes 10x more (11.5 -> 2.5 fps on 9060 XT); RX_VK_BATCH_POLL_US=2000 restores (+65% on 7900 XTX); PR #448 udmabuf halves… | | #50 | Tested on CachyOS (Linux) with RX 6700 XT + Ryzen 5 5600 | 3 | RX 6700 XT, RX 6600 (CachyOS) | early | Linux: 9-10 fps, black after cutscene 30 min | | #756 | Just unplayable on mid-high end setup (on Linux) | 3 | RX 9070 XT (CachyOS) | v2.0.2 | 5-10 fps at start, CPU 35% GPU 45%, no visible shader preparation (RADV poll issue #528?) | | #776 | Steam Machine | 3 | Steam Machine (RDNA3 Navi 33) | v2.0.2 | 10-15 fps in Kokiri with CPU/GPU ~30% (SteamOS); another Steam Machine user can't open it | | #478 | steam deck build error app image | 2 | Steam Deck | device-lost-fix | Steam Deck AppImage build stops in lift.py: "ADR / ADRP+ADD code addresses outside the 284387 unwind-covered functions: 14083" with romfs/exefs and .nup; another Deck us… | | #873 | Game freezes on loading screen and crashes OS after restarting due to… | 2 | RX 6600 XT (RADV), MSI Claw 8 AI+ (Arc) | v2.0.0 | Garbled colours at the Deku Tree/Navi scene, save load hangs, OS freeze | | #490 | Cachyos & AMD Testing Info (9070XT, R7 5800X) | 1 | RX 9070 XT (CachyOS) | no-visual-studio | Stutter, flashing, freezes to one frame (log) | | #604 | RX 6800 XT (RADV, Linux): GPU hang and full GPU reset a few seconds a… | 1 | RX 6800 XT (RADV) | main 97e7c55 | RADV RDNA2: GPU hang (comp ring then gfx ring timeout, MODE1 reset, PC reboot) a few seconds after loading a Kokiri save, also with RX_VK_KEEP_RETIRED=1; no page fault;… | | #733 | Build error: link FAILED (0s), 0 undefined symbols | 1 | Steam Deck | v2.0.3 | Linux link fails: v2.0.2 missing code_0xx.o objects, v2.0.3 ld.lld undefined symbols f_82647a90... (new code split) | | #745 | Black screen and bad renderings in hyrule castle and death montain af… | 1 | RTX 4090 (Linux 615.78) | v2.0.2 | Hyrule Castle / Death Mountain black textures and shaders after v2.0.2, fixed by restart for a while (log) | | #762 | Error in linux builder lastest versión | 1 | SteamOS | v2.0.3 | Linux builder compile error, only a photo of the screen | | #770 | RX 6700XT Ryzen 5 5600 graphic driver crash and low fps | 1 | RX 6700 XT (RADV CachyOS) | v2.0.3 | Wrong colours, PC crash when the Deku Tree appears, 23 fps (5 logs) | | #789 | RADV (Radeon 8060S / Linux): each vkQueueSubmit2 costs ~2 ms on the r… | 1 | Radeon 8060S (RADV) | v2.0.2 | Each vkQueueSubmit2 ~2 ms on the replay thread (userptr imports), ~42 fps cap; submit thread patch +4-8 fps but flashes; asks RX_VK_WAIT_GPU=1 default on RADV | | #797 | Immediate crash on Linux (Pop!_OS, NVIDIA GTX 1650) - headless graphi… | 1 | GTX 1650 (Pop!_OS) | v2.0.4 | Linux AppImage exits at once: log stops at "no graphics server yet (headless)" then "window closed, exiting" (SDL video driver; cf. #801 offscreen driver on NixOS) | | #801 | Linux/NVIDIA: gameplay freeze and crash in libnvidia-gpucomp.so.580.1… | 1 | RTX 3060 (NixOS, driver 580.142) | a598b9f | Segfault in libnvidia-gpucomp.so.580.142+0xe3facc on an mkw_vk worker (pipeline compile) after 2 h, and again at the next start after 27 s; 18 GB RAM + full swap; bundle… | | #836 | SteamOS 9070XT never launches after successful setup | 1 | RX 9070 XT (SteamOS) | v2.0.5 | SteamOS: Play does nothing, icon in taskbar, no window (log .1); maybe same as #803 | | #862 | Steam Deck (RADV VANGOGH): process exits leaving the starting room th… | 1 | Steam Deck OLED (RADV VANGOGH) | main 58af2c0 / 15ec28d | Process exits (exit 0, no device lost) walking out of the starting room on 58af2c0 + ms-eviction patch; vanilla 15ec28d segfaults write 0x40 in libvulkan_radeon.so durin… | | #890 | Linux AppImage v2.0.5: link FAILED, 20 undefined symbols (f_811f3a80… | 1 | Linux | v2.0.5 | Linux link fails with 20 undefined f_81xxxxxx: lift cache (.lift_key) reused C missing the code_NNN_k parts; delete sa/gen/.lift_key; PR #918 stops reusing an incomplete… | | #950 | Frozen Screen when throwing bombs | 1 | RTX 5070 (Linux) | v2.0.5 | Picture freezes when throwing bombs; one log crashes reading guest memory in hookshot_vk.so; dma-buf not imported (-2) in all logs | | #977 | [AMD RX6600] Saturated colors, crashes after the first scene of the i… | 1 | RX 6600 (RADV, Fedora) | v2.0.5 | Oversaturated colours, crash right after the logo that takes down the GNOME session; device lost in both logs | | #984 | [CachyOS Linux/AMD] GPU hang (gfx ring timeout → MODE2 reset, device… | 1 | Radeon 680M (RADV, CachyOS) | a598b9f | GPU hang after the intro movie (gfx ring timeout, MODE2 reset, device lost), 4 times; fine on Windows on the same laptop (honest-eta-era build) | | #992 | [Wayland] Freezes after NVN window creation on hybrid AMD+NVIDIA lapt… | 1 | GTX 1650 + Renoir iGPU (hybrid, Pop!_OS COSMIC Wayland) | v2.0.5 | Wayland hybrid laptop: freezes after 'nvn: window of 3 textures', renderer never reaches vkCreateInstance, process unkillable (D state); works with SDL_VIDEODRIVER=x11 +… | ## Adding a report Please update to v2.0.6 first (https://github.com/NotRexed/Hookshot/releases/tag/v2.0.6; Update next to Play in the launcher). Please add: distro, kernel, Mesa or NVIDIA driver version, GPU, version, `hookshot_log.txt`, and for hangs the `dmesg` lines around the reset. ## All tracking issues - #993 Garbled / rainbow textures that get worse over play time (VRAM over budget, mostly 4-8 GB cards) - #994 Floating trees, missing mountains and vanishing near vegetation - #995 Low FPS with low GPU usage (CPU-bound), FPS drops in Castle Town / Hyrule Field, shader stutter - #996 AMD on Windows: driver crash, device lost or freeze (RX 5000-9000, Deku Tree / after cutscenes) - #997 AMD handhelds and APUs (ROG Ally / Ally X, Legion Go, Radeon 780M/860M/890M): black screen, device lost, reboot - #998 Black screen with audio after the intro / at the Deku Tree cutscene - #999 Intel Arc and Core Ultra iGPUs: device lost, black screen after the intro, Linux ANV crashes - #1000 Linux and Steam Deck: GPU hangs, crashes, low FPS and build failures - #1001 GPUs without mesh shaders (GTX 9xx/10xx, RX 400/500/5000, Iris Xe/UHD): v2.0.6 fallback reports - #1002 Invisible or missing objects, walls and effects - #1003 Antivirus false positives on HookshotBuilder.exe (Defender Trojan:Script/Wacatac.H!ml) - #1004 Lighting: overexposure, over-bright bloom, crushed or black shadows, black faces - #1005 Flicker and flashing: brightness pulses, one-frame flashes, doubled image with frame pacing - #1006 AMD rendering: white silhouettes, block squares / grid lines, no anti-aliasing (networks in software) - #1007 Feature requests (collected)
thelinuxgmr commented 2026-11-09 07:27:25 +00:00 (Migrated from github.com)

Update from the #817 Deck (CachyOS, RADV VANGOGH, Mesa 26.2.6): RX_VK_NO_MESH=1 makes the game playable — confirmed tonight on v2.0.7-rc.1.

Setup: Steam Deck (CachyOS Deckify), launch env HOS_HANDHELD=1 RX_VK_CHECKPOINTS=1 RX_VK_NO_MESH=1, game at v2.0.7-rc.1.

Results:

  • Without NO_MESH: v2.0.7-rc.1 crashed at exactly the same point as v2.0.3/v2.0.4 — the Great Deku Tree speech right after the intro (gfx ring timeout / GPU reset). Same repro as the original report, so rc.1 does not change the hang.
  • With RX_VK_NO_MESH=1: ran straight past the Deku Tree, through the intro, into player control. Stable in gameplay; was able to create a save (so the long intro never has to be re-run to test). Base framerate ~12–20 fps with frame generation off; choppy in places, and some shader-compile stutter in new areas, but no hang.
  • Trade-off observed: some geometry renders missing/clear — at least one door was completely invisible/transparent. Consistent with objects that are only drawn through the mesh path.

So the workaround does hold on the newest build, and the elimination is clean: mesh/task shaders on = hang at the Tree on every version tested (v2.0.3 → v2.0.7-rc.1); off = playable. That keeps the focus on the core issue — the task shader traced in this thread (2c56dc1006942f74, the nested 2D culling loop) and why it runs long enough on RDNA2/RADV to trip the GPU watchdog, while a desktop RDNA4 card finishes it in time.

Next test on this Deck (single change, will report back): re-enabling LSFG frame generation on top of NO_MESH to see if it stays stable.

**Update from the #817 Deck (CachyOS, RADV VANGOGH, Mesa 26.2.6): `RX_VK_NO_MESH=1` makes the game playable — confirmed tonight on v2.0.7-rc.1.** Setup: Steam Deck (CachyOS Deckify), launch env `HOS_HANDHELD=1 RX_VK_CHECKPOINTS=1 RX_VK_NO_MESH=1`, game at v2.0.7-rc.1. Results: - **Without NO_MESH:** v2.0.7-rc.1 crashed at exactly the same point as v2.0.3/v2.0.4 — the Great Deku Tree speech right after the intro (gfx ring timeout / GPU reset). Same repro as the original report, so rc.1 does not change the hang. - **With `RX_VK_NO_MESH=1`:** ran straight past the Deku Tree, through the intro, into player control. Stable in gameplay; was able to create a save (so the long intro never has to be re-run to test). Base framerate ~12–20 fps with frame generation off; choppy in places, and some shader-compile stutter in new areas, but no hang. - **Trade-off observed:** some geometry renders missing/clear — at least one door was completely invisible/transparent. Consistent with objects that are only drawn through the mesh path. So the workaround does hold on the newest build, and the elimination is clean: mesh/task shaders on = hang at the Tree on every version tested (v2.0.3 → v2.0.7-rc.1); off = playable. That keeps the focus on the core issue — the task shader traced in this thread (2c56dc1006942f74, the nested 2D culling loop) and why it runs long enough on RDNA2/RADV to trip the GPU watchdog, while a desktop RDNA4 card finishes it in time. Next test on this Deck (single change, will report back): re-enabling LSFG frame generation on top of NO_MESH to see if it stays stable.
thelinuxgmr commented 2026-11-09 07:32:03 +00:00 (Migrated from github.com)

Follow-up from the same Deck: LSFG test + overall verdict on the NO_MESH workaround.

Ran the promised single change: LSFG (lossless scaling frame generation) enabled on top of RX_VK_NO_MESH=1, loading from the save created in the previous test (save/load works fine, no intro re-run needed).

Results:

  • Stability: still good. No hang with frame generation layered on.
  • Performance: still rough. Base framerate bounces around (~12–20 fps) with some deep dips; frame generation does not smooth that out — the generated frames inherit the uneven base pacing.
  • Rendering: noticeably broken beyond the missing door. A lot of flickering, and geometry that doesn't fully render. On a game that leans heavily on looking for visual clues, things not rendering is not a cosmetic problem — it blocks actually playing it properly.

Verdict from this Deck: the NO_MESH workaround makes the game technically playable and is excellent as a diagnostic — it isolates the hang to the mesh/task shader path beyond reasonable doubt. But the resulting experience is workable-but-broken, not a viable way to play. The real fix has to be in that shader path itself (or in how long it is allowed to run on RADV/RDNA2), not in workarounds layered on top.

Saves from the stable run are backed up on this end, so this Deck is ready to re-test the moment a build touches the mesh path.

**Follow-up from the same Deck: LSFG test + overall verdict on the NO_MESH workaround.** Ran the promised single change: LSFG (lossless scaling frame generation) enabled on top of `RX_VK_NO_MESH=1`, loading from the save created in the previous test (save/load works fine, no intro re-run needed). Results: - **Stability: still good.** No hang with frame generation layered on. - **Performance: still rough.** Base framerate bounces around (~12–20 fps) with some deep dips; frame generation does not smooth that out — the generated frames inherit the uneven base pacing. - **Rendering: noticeably broken beyond the missing door.** A lot of flickering, and geometry that doesn't fully render. On a game that leans heavily on looking for visual clues, things not rendering is not a cosmetic problem — it blocks actually playing it properly. Verdict from this Deck: the NO_MESH workaround makes the game *technically playable* and is excellent as a diagnostic — it isolates the hang to the mesh/task shader path beyond reasonable doubt. But the resulting experience is workable-but-broken, not a viable way to play. The real fix has to be in that shader path itself (or in how long it is allowed to run on RADV/RDNA2), not in workarounds layered on top. Saves from the stable run are backed up on this end, so this Deck is ready to re-test the moment a build touches the mesh path.
thelinuxgmr commented 2026-11-09 07:38:21 +00:00 (Migrated from github.com)

One more data point from the #817 Deck — tested whether submit settings can save the mesh path. They can't.

After the NO_MESH results above, I tried the "best of both worlds" experiment on v2.0.7-rc.1: mesh shaders back on, with RX_VK_PARALLEL=4 + RX_VK_BATCH_POLL_US=2000 (the RADV submit settings from #528), LSFG on top.

Result: hung at the Deku Tree again. The Deck's kernel log shows the same signature at 23:37 PT: GPU reset begin → MODE2 reset → reset succeeded — the game died in the reset, identical to the v2.0.3–v2.0.7-rc.1 no-workaround runs.

So on this hardware the elimination is now complete:

  • Mesh on, default submits → hang.
  • Mesh on, parallel + batched submits → hang. Submit pacing/parallelism does not get the task shader under the watchdog.
  • Mesh off (RX_VK_NO_MESH=1) → playable (with the flicker / missing-geometry costs already reported).

That points squarely at the RDNA2 (Van Gogh) + RADV side of the mesh/task shader path itself — the nested culling task shader (2c56dc1006942f74) simply runs longer than the GPU watchdog allows on this chip, while RDNA4 desktop cards finish it in time. Nothing on the launch-settings side changes that; the fix has to come from the shader's compiled form or how it's dispatched.

This Deck is back on the stable NO_MESH + LSFG configuration, saves backed up, ready to re-test any build that touches the mesh path.

**One more data point from the #817 Deck — tested whether submit settings can save the mesh path. They can't.** After the NO_MESH results above, I tried the "best of both worlds" experiment on v2.0.7-rc.1: mesh shaders back **on**, with `RX_VK_PARALLEL=4` + `RX_VK_BATCH_POLL_US=2000` (the RADV submit settings from #528), LSFG on top. Result: hung at the Deku Tree again. The Deck's kernel log shows the same signature at 23:37 PT: **GPU reset begin → MODE2 reset → reset succeeded** — the game died in the reset, identical to the v2.0.3–v2.0.7-rc.1 no-workaround runs. So on this hardware the elimination is now complete: - Mesh on, default submits → hang. - Mesh on, parallel + batched submits → hang. Submit pacing/parallelism does not get the task shader under the watchdog. - Mesh off (`RX_VK_NO_MESH=1`) → playable (with the flicker / missing-geometry costs already reported). That points squarely at the RDNA2 (Van Gogh) + RADV side of the mesh/task shader path itself — the nested culling task shader (2c56dc1006942f74) simply runs longer than the GPU watchdog allows on this chip, while RDNA4 desktop cards finish it in time. Nothing on the launch-settings side changes that; the fix has to come from the shader's compiled form or how it's dispatched. This Deck is back on the stable NO_MESH + LSFG configuration, saves backed up, ready to re-test any build that touches the mesh path.
MattDev-974 commented 2026-11-09 07:38:27 +00:00 (Migrated from github.com)

With RX_VK_NO_MESH=1, it now passes the intro cutscene and gets into gameplay on the RX 6600, but there is a lot of missing geometry (e.g., foliage in the intro scene, invisible doors, etc.).

Tested on v2.0.6

With RX_VK_NO_MESH=1, it now passes the intro cutscene and gets into gameplay on the RX 6600, but there is a lot of missing geometry (e.g., foliage in the intro scene, invisible doors, etc.). Tested on v2.0.6
metroid98 commented 2026-11-09 09:08:48 +00:00 (Migrated from github.com)

v2.0.7 works on NVIDIA here, for the tracker's "works" column: RTX 3060 12 GB, NVIDIA 615.78 (log: vk: NVIDIA GeForce RTX 3060, Vulkan 1.4, driver 0x99d38200; mesh shaders yes, host memory import yes, pipeline libraries yes), Bazzite 45 (Fedora KDE Plasma, Wayland), Ryzen 12 threads, 15 GB RAM.

  • Build from the .nup with the v2.0.7 AppImage finished with 0 failed units (no oot_cheat_items.h error), then --prepare-shaders ran in 9.8 s.
  • Three launches from the built folder (default settings, quality preset 4, frame generation 2, fullscreen) reached the title screen with no RX_VK_NO_MESH, no crash or GPU hang, and no error or warning lines in hookshot_log.txt. The title movie ran at 60.0 fps (vk: ... presents, 60.0 fps) from about 360 presents on; the first 120 presents are slow (4-6 fps) while it starts up.
  • I only ran the title screen, so this says nothing about gameplay fps; my earlier #227 numbers are from v2.0.5.

Update, v2.0.10 (same machine, title screen only)

  • v2.0.10 also works here: built from the .nup in place with the v2.0.10 AppImage (sha256 matches the release), 0 failed units; log hookshot v2.0.10, same RTX 3060 / Vulkan 1.4 / mesh shaders yes line, no error or warning lines. The compile step took 1013 s this time (about 19 min in all), against about 2 min for v2.0.8 on the same box, so a first build here is slow even though the result is fine.
  • After ./bin/hookshot --prepare-shaders, the start-up precompile in the game takes 9-10 s (about 10,330 compute pipelines) and the title movie (AV1) reaches 60.0 fps; the first 120 presents run at about 7 fps and the next 120 at about 42 fps while the movie decoder starts, then it holds 59-60 fps (about 5,000 presents measured over two runs, one of them held 60 s at the title). SIGTERM exits cleanly (exit code 0), no .running file is left.
  • When a newer release exists (v2.0.11 appeared while I tested), ./bin/hookshot and ./hookshot stop at a zenity "Update now / Not now / Skip this version" dialog before anything starts; started from a script with nobody at the screen it just sits there. HOOKSHOT_NO_UPDATE_CHECK=1 skips the check.

AI-assisted: run and collected by Claude Code on my behalf.

v2.0.7 works on NVIDIA here, for the tracker's "works" column: RTX 3060 12 GB, NVIDIA 615.78 (log: `vk: NVIDIA GeForce RTX 3060, Vulkan 1.4, driver 0x99d38200; mesh shaders yes, host memory import yes, pipeline libraries yes`), Bazzite 45 (Fedora KDE Plasma, Wayland), Ryzen 12 threads, 15 GB RAM. - Build from the .nup with the v2.0.7 AppImage finished with 0 failed units (no `oot_cheat_items.h` error), then `--prepare-shaders` ran in 9.8 s. - Three launches from the built folder (default settings, quality preset 4, frame generation 2, fullscreen) reached the title screen with no `RX_VK_NO_MESH`, no crash or GPU hang, and no error or warning lines in `hookshot_log.txt`. The title movie ran at 60.0 fps (`vk: ... presents, 60.0 fps`) from about 360 presents on; the first 120 presents are slow (4-6 fps) while it starts up. - I only ran the title screen, so this says nothing about gameplay fps; my earlier #227 numbers are from v2.0.5. **Update, v2.0.10 (same machine, title screen only)** - v2.0.10 also works here: built from the .nup in place with the v2.0.10 AppImage (sha256 matches the release), 0 failed units; log `hookshot v2.0.10`, same RTX 3060 / Vulkan 1.4 / mesh shaders yes line, no error or warning lines. The compile step took 1013 s this time (about 19 min in all), against about 2 min for v2.0.8 on the same box, so a first build here is slow even though the result is fine. - After `./bin/hookshot --prepare-shaders`, the start-up precompile in the game takes 9-10 s (about 10,330 compute pipelines) and the title movie (AV1) reaches 60.0 fps; the first 120 presents run at about 7 fps and the next 120 at about 42 fps while the movie decoder starts, then it holds 59-60 fps (about 5,000 presents measured over two runs, one of them held 60 s at the title). SIGTERM exits cleanly (exit code 0), no `.running` file is left. - When a newer release exists (v2.0.11 appeared while I tested), `./bin/hookshot` and `./hookshot` stop at a zenity "Update now / Not now / Skip this version" dialog before anything starts; started from a script with nobody at the screen it just sits there. `HOOKSHOT_NO_UPDATE_CHECK=1` skips the check. AI-assisted: run and collected by Claude Code on my behalf.
quazardous commented 2026-11-09 19:04:52 +00:00 (Migrated from github.com)

Adding a Linux/RADV data point on hardware that is not in the table yet: ROG Ally X (Z1 Extreme, RADV PHOENIX). Mostly good news, with three concrete problems and their log lines.

Setup

Device ASUS ROG Ally X (RC72LA), BIOS RC72LA.312
GPU AMD Ryzen Z1 Extreme (RADV PHOENIX), Vulkan 1.4, driver 0x6802006 (Mesa 26.2.6)
OS Bazzite 45 (Fedora 45), kernel 7.2.15, Wayland, SDL3
RAM 24 GB, but the UEFI reserves 8 GiB as VRAM, so the OS sees 15.3 GiB
Hookshot v2.0.10 (source a2043637)
vk: AMD Ryzen Z1 Extreme (RADV PHOENIX), Vulkan 1.4, driver 0x6802006;
    mesh shaders yes, host memory import yes, pipeline libraries yes
vk: swapchain 1280x720, 4 images, mailbox
vk: batched submits on (RX_VK_BATCH, on with RADV)
oe: output resolution 2048x1152 (the game's)

What works, against what the trackers describe

  • No GPU hang, no device lost, no reset after ~20 minutes running. The gfx-ring timeouts in #620 / #604 / #977 did not happen here.
  • Got through the intro movie and the Deku Tree cutscene with no black screen. That is the symptom of #998 and of the Windows handheld reports in #997, so it may be useful that a Z1 Extreme on RADV passes it.
  • Controller works out of the box.
  • Peak memory 5.9 GiB RSS, 10 GiB of 15.3 GiB system-wide: no OOM.

Built headless, which may be worth a line in the README: Hookshot.AppImage --cli --nup ... --out ... --work ... works fine and is only documented in a comment inside AppRun. Build took 24 min 26 s (21 min 41 s compiling), 0 failed.

1. Multi-second stalls around the Deku Tree scene

This is the most visible problem in play: the picture freezes for one to two seconds. The log attributes it to single uploads and submits, not to a steady load:

vk: slow upload 1256.4 ms: #469 0x115cb3d000 260x260x1 x1 levels 1 NVN 0xa, 408 of 408 KB
vk: slow upload  300.5 ms: #21  0x7fdc887000 832x640x1 x1 levels 1 NVN 0x87 ASTC, 832 of 832 KB
vk: slow submit: 1972.2 ms: draw 1042.2 descriptors 165.1 texture lookups 42.3 uploads 155.9 pipelines 12.6 programs 76.0 commands 44.0
vk: slow submit:  255.8 ms: draw 1903.6 descriptors 2.3 uploads 1.0 pipelines 1.5 programs 10.7 commands 1.6 queue submit 1.5

1256 ms to upload 408 KB stands out: that is 0.3 MB/s, so it reads like a stall rather than a bandwidth limit. Cumulative pipeline building over the session: 367 pipelines (17617 ms).

2. Flicker: shadows, foliage, and occasional white flashes

In and around the Deku Tree scene the picture flickers, and it moves between targets: sometimes the shadows shimmer, sometimes the leaves / foliage, and every so often there is a whole-screen white flash.

The white flashes look like the same family as #1186 (AMD 8060S / Strix Halo, Linux RADV) and #1126 (Legion Go S, SteamOS), so this is probably a confirmation of those on another AMD iGPU — a Z1 Extreme on v2.0.10 — rather than something new. The shadow and foliage shimmer may be the same cause or a separate one; I cannot tell from the outside. Tracker is presumably #1005.

Textures themselves look correct between flashes. Happy to film it if a video helps tell these apart.

3. Frame rate

title screen / movie:   60.0 fps,    3-6 draws a frame
Deku Tree scene:        32-34 fps, ~1000 draws, 90 dispatches, 141 passes, 6 submits a frame

The 60 fps on the light scenes suggests the batched-submit work (PR #689) is doing its job here — I am not hitting the ~42 fps submit cap described in #789. I have not tried RX_VK_BATCH_POLL_US=2000 or RX_VK_PARALLEL=4 from #528; tell me if a before/after on this APU is useful.

4. Failed shader programs

vk: prepared 38809 shader programs (46516 new, 151 failed, 10091 stage libraries;
    10095 compute variants, 754 programs with texture variants, 65 at the limit) in 364.6 s

151 at startup, 162 after a while in play. I do not know whether that count is expected; say the word and I will pull the list.

Also present, informational: [a64] unimplemented import for three nn::audio device-notification / auto-tune-volume symbols. Audio works.

Not tested

  • Nothing past Kokiri Forest and the Deku Tree.
  • No frame generation, no upscaling presets, no save/reload cycle.
  • No comparison on Windows on the same device.

I can test

I am a developer and the device is free for debugging. I can build from source with patches, run with any RX_* / HOS_* variables, bisect versions, or capture logs and video for any of the three points above. Just say which would help most.

Adding a Linux/RADV data point on hardware that is not in the table yet: **ROG Ally X (Z1 Extreme, RADV PHOENIX)**. Mostly good news, with three concrete problems and their log lines. ## Setup | | | |---|---| | Device | ASUS ROG Ally X (RC72LA), BIOS RC72LA.312 | | GPU | AMD Ryzen Z1 Extreme (RADV PHOENIX), Vulkan 1.4, driver `0x6802006` (Mesa 26.2.6) | | OS | Bazzite 45 (Fedora 45), kernel 7.2.15, Wayland, SDL3 | | RAM | 24 GB, but the UEFI reserves 8 GiB as VRAM, so the OS sees 15.3 GiB | | Hookshot | **v2.0.10** (source `a2043637`) | ``` vk: AMD Ryzen Z1 Extreme (RADV PHOENIX), Vulkan 1.4, driver 0x6802006; mesh shaders yes, host memory import yes, pipeline libraries yes vk: swapchain 1280x720, 4 images, mailbox vk: batched submits on (RX_VK_BATCH, on with RADV) oe: output resolution 2048x1152 (the game's) ``` ## What works, against what the trackers describe - **No GPU hang, no device lost, no reset** after ~20 minutes running. The gfx-ring timeouts in #620 / #604 / #977 did not happen here. - **Got through the intro movie and the Deku Tree cutscene** with no black screen. That is the symptom of #998 and of the Windows handheld reports in #997, so it may be useful that a Z1 Extreme on RADV passes it. - Controller works out of the box. - Peak memory 5.9 GiB RSS, 10 GiB of 15.3 GiB system-wide: no OOM. **Built headless**, which may be worth a line in the README: `Hookshot.AppImage --cli --nup ... --out ... --work ...` works fine and is only documented in a comment inside `AppRun`. Build took 24 min 26 s (21 min 41 s compiling), 0 failed. ## 1. Multi-second stalls around the Deku Tree scene This is the most visible problem in play: the picture freezes for one to two seconds. The log attributes it to single uploads and submits, not to a steady load: ``` vk: slow upload 1256.4 ms: #469 0x115cb3d000 260x260x1 x1 levels 1 NVN 0xa, 408 of 408 KB vk: slow upload 300.5 ms: #21 0x7fdc887000 832x640x1 x1 levels 1 NVN 0x87 ASTC, 832 of 832 KB vk: slow submit: 1972.2 ms: draw 1042.2 descriptors 165.1 texture lookups 42.3 uploads 155.9 pipelines 12.6 programs 76.0 commands 44.0 vk: slow submit: 255.8 ms: draw 1903.6 descriptors 2.3 uploads 1.0 pipelines 1.5 programs 10.7 commands 1.6 queue submit 1.5 ``` **1256 ms to upload 408 KB** stands out: that is 0.3 MB/s, so it reads like a stall rather than a bandwidth limit. Cumulative pipeline building over the session: `367 pipelines (17617 ms)`. ## 2. Flicker: shadows, foliage, and occasional white flashes In and around the Deku Tree scene the picture flickers, and it moves between targets: sometimes the **shadows** shimmer, sometimes the **leaves / foliage**, and every so often there is a **whole-screen white flash**. The white flashes look like the same family as #1186 (AMD 8060S / Strix Halo, Linux RADV) and #1126 (Legion Go S, SteamOS), so this is probably a confirmation of those on another AMD iGPU — a Z1 Extreme on v2.0.10 — rather than something new. The shadow and foliage shimmer may be the same cause or a separate one; I cannot tell from the outside. Tracker is presumably #1005. Textures themselves look correct between flashes. Happy to film it if a video helps tell these apart. ## 3. Frame rate ``` title screen / movie: 60.0 fps, 3-6 draws a frame Deku Tree scene: 32-34 fps, ~1000 draws, 90 dispatches, 141 passes, 6 submits a frame ``` The 60 fps on the light scenes suggests the batched-submit work (PR #689) is doing its job here — I am not hitting the ~42 fps submit cap described in #789. I have **not** tried `RX_VK_BATCH_POLL_US=2000` or `RX_VK_PARALLEL=4` from #528; tell me if a before/after on this APU is useful. ## 4. Failed shader programs ``` vk: prepared 38809 shader programs (46516 new, 151 failed, 10091 stage libraries; 10095 compute variants, 754 programs with texture variants, 65 at the limit) in 364.6 s ``` 151 at startup, 162 after a while in play. I do not know whether that count is expected; say the word and I will pull the list. Also present, informational: `[a64] unimplemented import` for three `nn::audio` device-notification / auto-tune-volume symbols. Audio works. ## Not tested - Nothing past Kokiri Forest and the Deku Tree. - No frame generation, no upscaling presets, no save/reload cycle. - No comparison on Windows on the same device. ## I can test I am a developer and the device is free for debugging. I can build from source with patches, run with any `RX_*` / `HOS_*` variables, bisect versions, or capture logs and video for any of the three points above. Just say which would help most.
zackfairccff-bot commented 2026-11-09 19:38:12 +00:00 (Migrated from github.com)

Steam Deck LCD / SteamOS / RADV VANGOGH — Hookshot v2.0.10: reproducible GPU ring timeouts, MODE2 resets, desktop session disruption and 5.8 FPS in Kokiri

Hi NotRexed and contributors,

I'm following up with a detailed report from my Steam Deck LCD running SteamOS, after testing multiple Hookshot builds, most recently v2.0.10.

I managed to compile and launch the native Linux build, including shader preparation. However, loading Kokiri Forest remains unreliable, with severe rendering problems, extremely low FPS, Vulkan device loss, and, in some runs, GPU resets affecting the entire desktop session.

1. System information

  • Device: Steam Deck LCD
  • Operating system: SteamOS, KDE Plasma / Wayland
  • GPU: AMD Van Gogh integrated GPU (RADV VANGOGH)
  • Graphics driver: AMDGPU kernel driver / Mesa RADV Vulkan
  • Hookshot version: v2.0.10
  • Execution: Native Linux executable, launched from Konsole
  • Game location: External microSD storage
  • Failure point: Loading Kokiri Forest, after the opening sequence or from an existing save

Exact Mesa, Vulkan, kernel and SteamOS build numbers were not captured in this particular report.

2. Observed behavior

The game successfully launches and completes shader preparation. On v2.0.10, the preparation screen reported approximately 38,809 shaders.

However, loading Kokiri Forest frequently results in:

  • Black screen and severe flickering.
  • Performance dropping to approximately 1–6 FPS.
  • Missing or disappearing scene geometry.
  • Vegetation flickering or not rendering correctly.
  • Overexposed lighting and white fog.
  • Vulkan VK_ERROR_DEVICE_LOST.
  • Application termination.
  • In some attempts, the entire graphical session is disrupted, causing Firefox, Chrome, Konsole and other applications to close.

Earlier builds sometimes allowed limited movement and interaction in Kokiri Forest, but with significant graphical corruption and instability.

3. Launch configurations tested

Baseline workaround:

RX_VK_NO_FOLLOW=1 ./hookshot

This previously allowed the game to progress beyond an immediate Vulkan crash, but did not resolve the Kokiri GPU hang.

RADV submission polling adjustment:

RX_VK_NO_FOLLOW=1 RX_VK_BATCH_POLL_US=2000 ./hookshot

This did not produce a stable gameplay experience.

Experimental shader skip:

RX_VK_NO_FOLLOW=1 RX_VK_SKIP_CODE=2c56dc1006942f74 ./hookshot

The introduction appeared to stutter less, but the game still entered a black, flickering state at approximately 1 FPS before closing.

I cannot confirm from the logs whether this experimental skip was actually applied by the v2.0.10 executable.

Earlier experiment:

RX_VK_NO_FOLLOW=1 RX_VK_NO_MESH=1 ./hookshot

This previously allowed further progress into gameplay and cutscenes, but produced substantially worse rendering, including invisible doors and missing vegetation.

None of these configurations provided stable gameplay.

4. Hookshot Vulkan device-loss errors

Captured output:

[hos host] vk: present failed (VkResult -4)

[hos OptimizeChangeBanc] vk: batched submit 12756 failed (-4)
[hos OptimizeChangeBanc] vk: device lost: reading the fault info (RX_VK_CHECKPOINTS=1 for markers)
[hos OptimizeChangeBanc] vk: batched submit 12757 failed (-4)

VkResult -4 corresponds to VK_ERROR_DEVICE_LOST.

5. Confirmed AMDGPU timeout directly associated with Hookshot

On November 9, 2026, at 16:11:31, the SteamOS kernel recorded:

amdgpu 0000:04:00.0: Dumping IP State
amdgpu 0000:04:00.0: Dumping IP State Completed
amdgpu 0000:04:00.0: [drm] AMDGPU device coredump file has been created
amdgpu 0000:04:00.0: ring gfx_0.0.0 timeout, signaled seq=539615, emitted seq=539617
amdgpu 0000:04:00.0: Process hookshot pid 19405 thread OptimizeChangeB pid 19548
amdgpu 0000:04:00.0: Starting gfx_0.0.0 ring reset
amdgpu 0000:04:00.0: Ring gfx_0.0.0 reset failed
amdgpu 0000:04:00.0: GPU reset begin!. Source: 1
amdgpu 0000:04:00.0: MODE2 reset
amdgpu 0000:04:00.0: GPU reset succeeded, trying to resume
amdgpu 0000:04:00.0: GPU reset(9) succeeded!

This confirms a graphics ring timeout with the Hookshot process explicitly identified by the kernel, followed by a failed ring-level recovery and successful full GPU reset.

6. Second GPU timeout involving the Wayland compositor

At 16:17:20, another GPU timeout occurred:

amdgpu 0000:04:00.0: ring gfx_0.1.0 timeout, signaled seq=373428, emitted seq=373432
amdgpu 0000:04:00.0: Process kwin_wayland pid 16007 thread kwin_wayla:cs0 pid 16034
amdgpu 0000:04:00.0: Starting gfx_0.1.0 ring reset
amdgpu 0000:04:00.0: Ring gfx_0.1.0 reset failed
amdgpu 0000:04:00.0: GPU reset begin!. Source: 1
amdgpu 0000:04:00.0: MODE2 reset
amdgpu 0000:04:00.0: GPU reset succeeded, trying to resume
amdgpu 0000:04:00.0: GPU reset(10) succeeded!

The second timeout identifies kwin_wayland rather than Hookshot.

This is consistent with the observed disruption of the KDE desktop session, although the logs alone do not establish whether the second timeout was a direct consequence of the first.

7. Severe performance degradation before Wayland disconnect

Another captured Hookshot log contained:

[hos Presentation Thread] vk: a frame's replay time (ms): submit 137.40, present 0.46, draw 21.79, descriptors 4.56, texture lookups 6.57, uploads 24.25, pipelines 0.13, programs 2.67, commands 2.35, dispatch 3.21, memory sync 1.44, queue submit 11.92, slot wait 58.98

[hos Presentation Thread] vk: 3960 presents, 5.8 fps; a frame: 433 draws (0 skipped), 24 dispatches, 34 passes, 32 barriers, 6 submits, 8.0 uploads (8.2 MB), 28 ub updates (19 overlays), GPU-bound wait 59.0 ms; 854 pipelines (15573 ms), 0 programs (11 failed), 1239 textures (2603 MB)

[hos Presentation Thread] vk: GPU time 11.7 ms a frame (the longest submission 181.8 ms); 9.2 textures made a frame

ERROR: Wayland display connection closed by server (fatal)
[hos host] display: window closed, exiting

Important observations:

  • Actual reported performance: 5.8 FPS.
  • Reported GPU execution time: 11.7 ms per frame.
  • Replay submission time: 137.40 ms in the captured frame.
  • GPU-bound slot wait: approximately 59 ms.
  • Texture memory reported: approximately 2.6 GB.
  • Eleven failed program compilations reported.
  • The application ultimately lost its Wayland display connection.

The large difference between GPU execution time and overall frame/replay time suggests substantial overhead or waiting outside the measured GPU work.

This appears potentially related to the Linux/RADV submission overhead investigated in #312 and #528, but I cannot establish that it has the same underlying cause.

8. Possible connection to existing reports

The symptoms resemble several existing reports:

  • #150: Steam Deck RADV VANGOGH device loss while loading Kokiri, including GPU resets and memory pressure.
  • #817: Steam Deck RADV GPU hangs associated with graphics ring timeouts and MODE2 recovery.
  • #312: RX 7600 Linux/RADV reporting very low FPS despite relatively low GPU execution time.
  • #528: RADV submission overhead and performance issues.

I understand that some device-loss cases were addressed by commit 9bb52a9, but the problem remains reproducible in my v2.0.10 testing.

I have not yet confirmed the exact source commit corresponding to my v2.0.10 executable.

9. Questions for the developers

  1. Could the Steam Deck's RADV VANGOGH driver be hitting a separate GPU synchronization or memory-lifetime issue from the one addressed in 9bb52a9?
  2. Could the high submission/replay times and memory pressure contribute to the GPU ring timeout?
  3. Is the RX_VK_SKIP_CODE=2c56dc1006942f74 workaround supported in the current public Linux release, or does it require a patched build?
  4. Is there a recommended diagnostic configuration for collecting useful GPU fault information on SteamOS without repeatedly disrupting the desktop session?
  5. Would the kernel log and full hookshot_log.txt be sufficient, or would an AMDGPU device coredump be helpful?

The kernel reported creating an AMDGPU device coredump, but the previously reported sysfs path was not available when I attempted to inspect it.

10. Current status

Hookshot v2.0.10 is not currently playable reliably on my Steam Deck LCD.

The game builds and starts successfully, but Kokiri Forest loading can cause severe performance degradation, Vulkan device loss, graphics ring timeouts, GPU resets and desktop session disruption.

I have paused further execution tests to avoid repeated GPU resets and loss of other open applications.

I can provide the saved kernel logs and additional Hookshot logs if needed.

Thank you for your work on this project and for continuing to investigate Linux/AMD compatibility.

hookshot_log.txt

## Steam Deck LCD / SteamOS / RADV VANGOGH — Hookshot v2.0.10: reproducible GPU ring timeouts, MODE2 resets, desktop session disruption and 5.8 FPS in Kokiri Hi NotRexed and contributors, I'm following up with a detailed report from my **Steam Deck LCD running SteamOS**, after testing multiple Hookshot builds, most recently **v2.0.10**. I managed to compile and launch the native Linux build, including shader preparation. However, loading Kokiri Forest remains unreliable, with severe rendering problems, extremely low FPS, Vulkan device loss, and, in some runs, GPU resets affecting the entire desktop session. ### 1. System information - **Device:** Steam Deck LCD - **Operating system:** SteamOS, KDE Plasma / Wayland - **GPU:** AMD Van Gogh integrated GPU (RADV VANGOGH) - **Graphics driver:** AMDGPU kernel driver / Mesa RADV Vulkan - **Hookshot version:** v2.0.10 - **Execution:** Native Linux executable, launched from Konsole - **Game location:** External microSD storage - **Failure point:** Loading Kokiri Forest, after the opening sequence or from an existing save Exact Mesa, Vulkan, kernel and SteamOS build numbers were not captured in this particular report. ### 2. Observed behavior The game successfully launches and completes shader preparation. On v2.0.10, the preparation screen reported approximately 38,809 shaders. However, loading Kokiri Forest frequently results in: - Black screen and severe flickering. - Performance dropping to approximately 1–6 FPS. - Missing or disappearing scene geometry. - Vegetation flickering or not rendering correctly. - Overexposed lighting and white fog. - Vulkan `VK_ERROR_DEVICE_LOST`. - Application termination. - In some attempts, the entire graphical session is disrupted, causing Firefox, Chrome, Konsole and other applications to close. Earlier builds sometimes allowed limited movement and interaction in Kokiri Forest, but with significant graphical corruption and instability. ### 3. Launch configurations tested **Baseline workaround:** `RX_VK_NO_FOLLOW=1 ./hookshot` This previously allowed the game to progress beyond an immediate Vulkan crash, but did not resolve the Kokiri GPU hang. **RADV submission polling adjustment:** `RX_VK_NO_FOLLOW=1 RX_VK_BATCH_POLL_US=2000 ./hookshot` This did not produce a stable gameplay experience. **Experimental shader skip:** `RX_VK_NO_FOLLOW=1 RX_VK_SKIP_CODE=2c56dc1006942f74 ./hookshot` The introduction appeared to stutter less, but the game still entered a black, flickering state at approximately 1 FPS before closing. I cannot confirm from the logs whether this experimental skip was actually applied by the v2.0.10 executable. **Earlier experiment:** `RX_VK_NO_FOLLOW=1 RX_VK_NO_MESH=1 ./hookshot` This previously allowed further progress into gameplay and cutscenes, but produced substantially worse rendering, including invisible doors and missing vegetation. None of these configurations provided stable gameplay. ### 4. Hookshot Vulkan device-loss errors Captured output: ``` [hos host] vk: present failed (VkResult -4) [hos OptimizeChangeBanc] vk: batched submit 12756 failed (-4) [hos OptimizeChangeBanc] vk: device lost: reading the fault info (RX_VK_CHECKPOINTS=1 for markers) [hos OptimizeChangeBanc] vk: batched submit 12757 failed (-4) ``` `VkResult -4` corresponds to `VK_ERROR_DEVICE_LOST`. ### 5. Confirmed AMDGPU timeout directly associated with Hookshot On November 9, 2026, at **16:11:31**, the SteamOS kernel recorded: ``` amdgpu 0000:04:00.0: Dumping IP State amdgpu 0000:04:00.0: Dumping IP State Completed amdgpu 0000:04:00.0: [drm] AMDGPU device coredump file has been created amdgpu 0000:04:00.0: ring gfx_0.0.0 timeout, signaled seq=539615, emitted seq=539617 amdgpu 0000:04:00.0: Process hookshot pid 19405 thread OptimizeChangeB pid 19548 amdgpu 0000:04:00.0: Starting gfx_0.0.0 ring reset amdgpu 0000:04:00.0: Ring gfx_0.0.0 reset failed amdgpu 0000:04:00.0: GPU reset begin!. Source: 1 amdgpu 0000:04:00.0: MODE2 reset amdgpu 0000:04:00.0: GPU reset succeeded, trying to resume amdgpu 0000:04:00.0: GPU reset(9) succeeded! ``` This confirms a graphics ring timeout with the **Hookshot process explicitly identified by the kernel**, followed by a failed ring-level recovery and successful full GPU reset. ### 6. Second GPU timeout involving the Wayland compositor At **16:17:20**, another GPU timeout occurred: ``` amdgpu 0000:04:00.0: ring gfx_0.1.0 timeout, signaled seq=373428, emitted seq=373432 amdgpu 0000:04:00.0: Process kwin_wayland pid 16007 thread kwin_wayla:cs0 pid 16034 amdgpu 0000:04:00.0: Starting gfx_0.1.0 ring reset amdgpu 0000:04:00.0: Ring gfx_0.1.0 reset failed amdgpu 0000:04:00.0: GPU reset begin!. Source: 1 amdgpu 0000:04:00.0: MODE2 reset amdgpu 0000:04:00.0: GPU reset succeeded, trying to resume amdgpu 0000:04:00.0: GPU reset(10) succeeded! ``` The second timeout identifies `kwin_wayland` rather than Hookshot. This is consistent with the observed disruption of the KDE desktop session, although the logs alone do not establish whether the second timeout was a direct consequence of the first. ### 7. Severe performance degradation before Wayland disconnect Another captured Hookshot log contained: ``` [hos Presentation Thread] vk: a frame's replay time (ms): submit 137.40, present 0.46, draw 21.79, descriptors 4.56, texture lookups 6.57, uploads 24.25, pipelines 0.13, programs 2.67, commands 2.35, dispatch 3.21, memory sync 1.44, queue submit 11.92, slot wait 58.98 [hos Presentation Thread] vk: 3960 presents, 5.8 fps; a frame: 433 draws (0 skipped), 24 dispatches, 34 passes, 32 barriers, 6 submits, 8.0 uploads (8.2 MB), 28 ub updates (19 overlays), GPU-bound wait 59.0 ms; 854 pipelines (15573 ms), 0 programs (11 failed), 1239 textures (2603 MB) [hos Presentation Thread] vk: GPU time 11.7 ms a frame (the longest submission 181.8 ms); 9.2 textures made a frame ERROR: Wayland display connection closed by server (fatal) [hos host] display: window closed, exiting ``` Important observations: - Actual reported performance: **5.8 FPS**. - Reported GPU execution time: **11.7 ms per frame**. - Replay submission time: **137.40 ms** in the captured frame. - GPU-bound slot wait: approximately **59 ms**. - Texture memory reported: approximately **2.6 GB**. - Eleven failed program compilations reported. - The application ultimately lost its Wayland display connection. The large difference between GPU execution time and overall frame/replay time suggests substantial overhead or waiting outside the measured GPU work. This appears potentially related to the Linux/RADV submission overhead investigated in #312 and #528, but I cannot establish that it has the same underlying cause. ### 8. Possible connection to existing reports The symptoms resemble several existing reports: - **#150:** Steam Deck RADV VANGOGH device loss while loading Kokiri, including GPU resets and memory pressure. - **#817:** Steam Deck RADV GPU hangs associated with graphics ring timeouts and MODE2 recovery. - **#312:** RX 7600 Linux/RADV reporting very low FPS despite relatively low GPU execution time. - **#528:** RADV submission overhead and performance issues. I understand that some device-loss cases were addressed by commit `9bb52a9`, but the problem remains reproducible in my v2.0.10 testing. I have not yet confirmed the exact source commit corresponding to my v2.0.10 executable. ### 9. Questions for the developers 1. Could the Steam Deck's RADV VANGOGH driver be hitting a separate GPU synchronization or memory-lifetime issue from the one addressed in `9bb52a9`? 2. Could the high submission/replay times and memory pressure contribute to the GPU ring timeout? 3. Is the `RX_VK_SKIP_CODE=2c56dc1006942f74` workaround supported in the current public Linux release, or does it require a patched build? 4. Is there a recommended diagnostic configuration for collecting useful GPU fault information on SteamOS without repeatedly disrupting the desktop session? 5. Would the kernel log and full `hookshot_log.txt` be sufficient, or would an AMDGPU device coredump be helpful? The kernel reported creating an AMDGPU device coredump, but the previously reported sysfs path was not available when I attempted to inspect it. ### 10. Current status **Hookshot v2.0.10 is not currently playable reliably on my Steam Deck LCD.** The game builds and starts successfully, but Kokiri Forest loading can cause severe performance degradation, Vulkan device loss, graphics ring timeouts, GPU resets and desktop session disruption. I have paused further execution tests to avoid repeated GPU resets and loss of other open applications. I can provide the saved kernel logs and additional Hookshot logs if needed. Thank you for your work on this project and for continuing to investigate Linux/AMD compatibility. [hookshot_log.txt](https://github.com/user-attachments/files/34596668/hookshot_log.txt)
DistantThunder commented 2026-11-09 20:48:10 +00:00 (Migrated from github.com)

Hi all,

Sorry if I don't get the way this Megaissue works, willing to change this comment if needed:

v2.0.11
Arch / RADV 26.2.6 / 7900XTX

Is this:

Image

How it's supposed to look? It's a bit... desaturated?

Hi all, Sorry if I don't get the way this Megaissue works, willing to change this comment if needed: v2.0.11 Arch / RADV 26.2.6 / 7900XTX Is this: <img width="3760" height="2126" alt="Image" src="https://github.com/user-attachments/assets/e4cf19e3-1aec-4331-b7f5-0b75fbb772c9" /> How it's supposed to look? It's a bit... desaturated?
morpheus302 commented 2026-11-09 21:21:24 +00:00 (Migrated from github.com)

A driver bug in the same area as this hang. I checked whether it explains #817, and our data says it probably does
not
. It is still worth knowing about, because Hookshot's mesh shaders can reach it, and a small change on Hookshot's
side avoids it on every driver.

Context. I'm porting Hookshot (v2.0.7, 8b2e1d3) to my own jailbroken PS5, for personal use. The driver is
mihawk-99's PS5_Mesa, RADV with a PS5 winsys. The bug below is in code that
upstream Mesa shares, unchanged from 24.3 to current main, so it includes the 26.2 builds reported in this thread.

The bug

  • RADV's mesh lowering (src/amd/common/nir/ac_nir_lower_ngg_mesh.c) keeps the vertex and primitive counts in two
    variables that start undefined. Only OpSetMeshOutputsEXT sets them, and the end of the shader always reads them for
    GS_ALLOC_REQ.
  • A mesh shader that returns before OpSetMeshOutputsEXT therefore asks the hardware for a garbage number of
    primitives. In our case that was about a million, with none exported, and the GPU waits for them forever.
  • Hookshot can take that path. When a recompiled indirect branch reaches a target that matches none of the table
    entries, the translator emits OpUnreachable
    (structured_control_flow.cpp:459,
    emit_spirv.cpp:219-221).
    Mesa compiles OpUnreachable as a plain return.

Evidence

  • On the PS5 GPU. One mesh pipeline took that path in an offline test harness that binds null descriptors. Its first
    draw lost the device.
  • With either fix, on the console. The same pipeline draws with no hang. Both fixes give the same binary:
    • the two-line driver fix, which starts both counts at 0;
    • the Hookshot-side change below.
  • PC model. An emulation of the final ACO code shows the garbage GS_ALLOC_REQ.
  • Upstream Mesa. Debian's Mesa 25.0.7 with RADV_FORCE_FAMILY=vangogh shows the same undefined values reaching
    GS_ALLOC_REQ in a small valid shader that returns early. I'm reporting it to Mesa (link to follow).

Why it is probably not this hang

  • Different programs. An offline census of the game's shaders finds 1,312 task/mesh programs. We translated 1,300
    of them with our build, including every program that uses 2c56dc1006942f74.

    • 102 of them have OpUnreachable in their mesh shader. None of them uses task shader 2c56dc1006942f74: 51 are
      mesh-only, and 51 use six other task shaders.
    • The 1,078 programs that do use 2c56dc1006942f74 have no OpUnreachable in their mesh shader. Neither does
      2c56dc1006942f74 itself.
    • This includes the two programs named above that we could map: 6f9142def3b6a978 (mesh code 4797e4cd2b870a69) and
      636eed4d5000d1c0.
    • We couldn't map 155b02322a3ee490 and 38cdd9d8563b16eb: their keys depend on state our offline census doesn't
      have.
  • The path probably never runs with real data. In 878 of the 882 OpUnreachable sites:

    • the jump table is read from the program's own constants (c1);
    • its index is clamped to the table.

    Hookshot binds those same constants at draw time, so the loaded target always matches. We only reached the path
    because our harness binds null descriptors. We didn't classify the remaining 4 sites.

  • The timing doesn't match. A GS_ALLOC_REQ deadlock never ends. hardicd saw a draw of 155b02322a3ee490 run for
    9 s and then finish.

  • The workaround doesn't touch these programs. RX_VK_SKIP_CODE=2c56dc1006942f74 fixes the Deck without skipping
    any of the 102 programs.

Suggested change in Hookshot (defensive)

In mesh shaders, leave with no outputs instead of OpUnreachable: emit OpSetMeshOutputsEXT 0 0, then OpReturn.

  • The behaviour is then defined on every driver. Executing OpUnreachable is undefined in SPIR-V anyway.
  • On that path, nothing has been written to an Output variable yet: Hookshot's mesh epilogue does those writes.
  • In the shaders we looked at, the branch index comes from a uniform buffer, so the call is under uniform control flow.

Where:

Here is an untested sketch. What we ran on the console was the same SPIR-V produced by patching the binary.

--- a/gpu/vk/eden/shader_recompiler/backend/spirv/emit_spirv.cpp
+++ b/gpu/vk/eden/shader_recompiler/backend/spirv/emit_spirv.cpp
@@ Traverse()
         case IR::AbstractSyntaxNode::Type::Unreachable:
-            ctx.OpUnreachable();
+            if (ctx.stage == Stage::Mesh && !ctx.mesh_fallback) {
+                // (an indirect branch with no known target: leave with no outputs. RADV turns OpUnreachable into a
+                // return that leaves its output counts undefined, and GS_ALLOC_REQ then hangs the GPU)
+                ctx.OpStore(ctx.u32_zero_value, ctx.u32_zero_value);   // marker: OpSetMeshOutputsEXT 0 0
+                ctx.mesh_zero_outputs_marker = true;
+                ctx.OpReturn();
+            } else {
+                ctx.OpUnreachable();
+            }
             break;
@@ PatchMeshInstructions()
-    if (!set_outputs && !emit_tasks) {
+    const bool zero_outputs{ctx.mesh_zero_outputs_marker};
+    if (!set_outputs && !emit_tasks && !zero_outputs) {
         return;
     }
 ...
         if (set_outputs &&
             store_at(offset, ctx.mesh_outputs_marker[0], ctx.mesh_outputs_marker[1])) {
             code[offset] = (3U << 16) | static_cast<u32>(spv::Op::OpSetMeshOutputsEXT);
             patched = true;
+        } else if (zero_outputs && store_at(offset, ctx.u32_zero_value, ctx.u32_zero_value)) {
+            code[offset] = (3U << 16) | static_cast<u32>(spv::Op::OpSetMeshOutputsEXT);
+            patched = true;
         } else if (emit_tasks && ...

The sketch also needs bool mesh_zero_outputs_marker{}; in spirv_emit_context.h, next to mesh_outputs_marker.

A test for Deck users, if someone wants to settle it

  1. Hookshot-side change. Build with the change above and load the Deku Tree save without RX_VK_SKIP_CODE. If it
    still hangs, which is what we expect, this bug is ruled out for #817. If it stops hanging, it's back in play.

  2. Driver-side change. If you rebuild Mesa yourself, for example from CachyOS's PKGBUILD, this two-line RADV patch
    gives the same answer without touching Hookshot. It goes in ac_nir_lower_ngg_mesh(), right after the builder is placed at the
    start of the shader and before the API shader is wrapped:

    nir_store_var(b, state.vertex_count_var, nir_imm_int(b, 0), 0x1);
    nir_store_var(b, state.primitive_count_var, nir_imm_int(b, 0), 0x1);
    
  3. A hang outside 2c56dc1006942f74. If a hang remains with RX_VK_SKIP_CODE=2c56dc1006942f74 set, the
    its code: line of the stuck draw tells whether its mesh shader is one of the programs with OpUnreachable. We can
    check it against our list.

What is and isn't confirmed

  • Confirmed:
    • The driver bug is in the code, on PS5_Mesa and upstream, from 24.3 to main.
    • It hangs the PS5 GPU.
    • Both fixes stop that hang and give the same binary.
    • The mesh shaders that use 2c56dc1006942f74 have no OpUnreachable in our build.
  • Not confirmed:
    • That this bug fires anywhere in normal play, on any GPU.
    • Anything about the Deck. We have no AMD PC or Deck, so nothing here ran on a desktop RDNA 2 GPU or on Van Gogh; only on the PS5's own GPU.
    • The keys and counts come from our v2.0.7 build. Other versions could translate a few programs differently.

The analysis and this write-up were done with the help of an AI assistant (Claude). The driver fix and the Hookshot-side variant were tested on my own PS5.

A driver bug in the same area as this hang. I checked whether it explains #817, and our data says it **probably does not**. It is still worth knowing about, because Hookshot's mesh shaders can reach it, and a small change on Hookshot's side avoids it on every driver. **Context.** I'm porting Hookshot (v2.0.7, `8b2e1d3`) to my own jailbroken PS5, for personal use. The driver is mihawk-99's [PS5_Mesa](https://github.com/mihawk-99/PS5_Mesa), RADV with a PS5 winsys. The bug below is in code that upstream Mesa shares, unchanged from 24.3 to current main, so it includes the 26.2 builds reported in this thread. ### The bug - RADV's mesh lowering (`src/amd/common/nir/ac_nir_lower_ngg_mesh.c`) keeps the vertex and primitive counts in two variables that start undefined. Only `OpSetMeshOutputsEXT` sets them, and the end of the shader always reads them for `GS_ALLOC_REQ`. - A mesh shader that returns before `OpSetMeshOutputsEXT` therefore asks the hardware for a garbage number of primitives. In our case that was about a million, with none exported, and the GPU waits for them forever. - Hookshot can take that path. When a recompiled indirect branch reaches a target that matches none of the table entries, the translator emits `OpUnreachable` ([`structured_control_flow.cpp:459`](https://git.magicbean.dev/MagicBeanDev/Hookshot/src/branch/8b2e1d3/gpu/vk/eden/shader_recompiler/frontend/maxwell/structured_control_flow.cpp#L449-L460), [`emit_spirv.cpp:219-221`](https://git.magicbean.dev/MagicBeanDev/Hookshot/src/branch/8b2e1d3/gpu/vk/eden/shader_recompiler/backend/spirv/emit_spirv.cpp#L219-L221)). Mesa compiles `OpUnreachable` as a plain return. ### Evidence - **On the PS5 GPU.** One mesh pipeline took that path in an offline test harness that binds null descriptors. Its first draw lost the device. - **With either fix, on the console.** The same pipeline draws with no hang. Both fixes give the same binary: - the two-line driver fix, which starts both counts at 0; - the Hookshot-side change below. - **PC model.** An emulation of the final ACO code shows the garbage `GS_ALLOC_REQ`. - **Upstream Mesa.** Debian's Mesa 25.0.7 with `RADV_FORCE_FAMILY=vangogh` shows the same undefined values reaching `GS_ALLOC_REQ` in a small valid shader that returns early. I'm reporting it to Mesa (link to follow). ### Why it is probably not this hang - **Different programs.** An offline census of the game's shaders finds 1,312 task/mesh programs. We translated 1,300 of them with our build, including every program that uses `2c56dc1006942f74`. - 102 of them have `OpUnreachable` in their mesh shader. **None of them uses task shader `2c56dc1006942f74`**: 51 are mesh-only, and 51 use six other task shaders. - The 1,078 programs that do use `2c56dc1006942f74` have no `OpUnreachable` in their mesh shader. Neither does `2c56dc1006942f74` itself. - This includes the two programs named above that we could map: `6f9142def3b6a978` (mesh code `4797e4cd2b870a69`) and `636eed4d5000d1c0`. - We couldn't map `155b02322a3ee490` and `38cdd9d8563b16eb`: their keys depend on state our offline census doesn't have. - **The path probably never runs with real data.** In 878 of the 882 `OpUnreachable` sites: - the jump table is read from the program's own constants (c1); - its index is clamped to the table. Hookshot binds those same constants at draw time, so the loaded target always matches. We only reached the path because our harness binds null descriptors. We didn't classify the remaining 4 sites. - **The timing doesn't match.** A `GS_ALLOC_REQ` deadlock never ends. hardicd saw a draw of `155b02322a3ee490` run for 9 s and then finish. - **The workaround doesn't touch these programs.** `RX_VK_SKIP_CODE=2c56dc1006942f74` fixes the Deck without skipping any of the 102 programs. ### Suggested change in Hookshot (defensive) In mesh shaders, leave with no outputs instead of `OpUnreachable`: emit `OpSetMeshOutputsEXT 0 0`, then `OpReturn`. - The behaviour is then defined on every driver. Executing `OpUnreachable` is undefined in SPIR-V anyway. - On that path, nothing has been written to an `Output` variable yet: Hookshot's mesh epilogue does those writes. - In the shaders we looked at, the branch index comes from a uniform buffer, so the call is under uniform control flow. Where: - [`emit_spirv.cpp` `Traverse()`, lines 219-221](https://git.magicbean.dev/MagicBeanDev/Hookshot/src/branch/8b2e1d3/gpu/vk/eden/shader_recompiler/backend/spirv/emit_spirv.cpp#L219-L221) emits the `OpUnreachable`. - [`PatchMeshInstructions()`, lines 615-658](https://git.magicbean.dev/MagicBeanDev/Hookshot/src/branch/8b2e1d3/gpu/vk/eden/shader_recompiler/backend/spirv/emit_spirv.cpp#L615-L658) already turns a marker `OpStore` into `OpSetMeshOutputsEXT`, which Sirit cannot emit ([`MeshEpilogue()`, `emit_spirv_mesh.cpp:330-342`](https://git.magicbean.dev/MagicBeanDev/Hookshot/src/branch/8b2e1d3/gpu/vk/eden/shader_recompiler/backend/spirv/emit_spirv_mesh.cpp#L330-L342)). Here is an untested sketch. What we ran on the console was the same SPIR-V produced by patching the binary. ```diff --- a/gpu/vk/eden/shader_recompiler/backend/spirv/emit_spirv.cpp +++ b/gpu/vk/eden/shader_recompiler/backend/spirv/emit_spirv.cpp @@ Traverse() case IR::AbstractSyntaxNode::Type::Unreachable: - ctx.OpUnreachable(); + if (ctx.stage == Stage::Mesh && !ctx.mesh_fallback) { + // (an indirect branch with no known target: leave with no outputs. RADV turns OpUnreachable into a + // return that leaves its output counts undefined, and GS_ALLOC_REQ then hangs the GPU) + ctx.OpStore(ctx.u32_zero_value, ctx.u32_zero_value); // marker: OpSetMeshOutputsEXT 0 0 + ctx.mesh_zero_outputs_marker = true; + ctx.OpReturn(); + } else { + ctx.OpUnreachable(); + } break; @@ PatchMeshInstructions() - if (!set_outputs && !emit_tasks) { + const bool zero_outputs{ctx.mesh_zero_outputs_marker}; + if (!set_outputs && !emit_tasks && !zero_outputs) { return; } ... if (set_outputs && store_at(offset, ctx.mesh_outputs_marker[0], ctx.mesh_outputs_marker[1])) { code[offset] = (3U << 16) | static_cast<u32>(spv::Op::OpSetMeshOutputsEXT); patched = true; + } else if (zero_outputs && store_at(offset, ctx.u32_zero_value, ctx.u32_zero_value)) { + code[offset] = (3U << 16) | static_cast<u32>(spv::Op::OpSetMeshOutputsEXT); + patched = true; } else if (emit_tasks && ... ``` The sketch also needs `bool mesh_zero_outputs_marker{};` in `spirv_emit_context.h`, next to `mesh_outputs_marker`. ### A test for Deck users, if someone wants to settle it 1. **Hookshot-side change.** Build with the change above and load the Deku Tree save without `RX_VK_SKIP_CODE`. If it still hangs, which is what we expect, this bug is ruled out for #817. If it stops hanging, it's back in play. 2. **Driver-side change.** If you rebuild Mesa yourself, for example from CachyOS's PKGBUILD, this two-line RADV patch gives the same answer without touching Hookshot. It goes in `ac_nir_lower_ngg_mesh()`, right after the builder is placed at the start of the shader and before the API shader is wrapped: ```c nir_store_var(b, state.vertex_count_var, nir_imm_int(b, 0), 0x1); nir_store_var(b, state.primitive_count_var, nir_imm_int(b, 0), 0x1); ``` 3. **A hang outside `2c56dc1006942f74`.** If a hang remains with `RX_VK_SKIP_CODE=2c56dc1006942f74` set, the `its code:` line of the stuck draw tells whether its mesh shader is one of the programs with `OpUnreachable`. We can check it against our list. ### What is and isn't confirmed - **Confirmed:** - The driver bug is in the code, on PS5_Mesa and upstream, from 24.3 to main. - It hangs the PS5 GPU. - Both fixes stop that hang and give the same binary. - The mesh shaders that use `2c56dc1006942f74` have no `OpUnreachable` in our build. - **Not confirmed:** - That this bug fires anywhere in normal play, on any GPU. - Anything about the Deck. We have no AMD PC or Deck, so nothing here ran on a desktop RDNA 2 GPU or on Van Gogh; only on the PS5's own GPU. - The keys and counts come from our v2.0.7 build. Other versions could translate a few programs differently. The analysis and this write-up were done with the help of an AI assistant (Claude). The driver fix and the Hookshot-side variant were tested on my own PS5.
dieMarten commented 2026-11-09 21:55:06 +00:00 (Migrated from github.com)

Im sorry I dont know if I need the format but Ive been told to drop my hookshot_log.txt here. Game runs at 25-30 now (before 5-10) but looks awful, very and I mean very white.

Image Image

some generic system info:
v2.0.11
7.3.1-1-cashyos (64-bit) / RADV 3:26.2.6-1 / RX 9070 XT / KDE Plasma 6.8.2 / Wayland / 16 × AMD Ryzen 7 5800X 8-Core Processor / 64 GiB of RAM

Also the hookshot_log u asked for
hookshot_log.txt

Im sorry I dont know if I need the format but Ive been told to drop my hookshot_log.txt here. Game runs at 25-30 now (before 5-10) but looks awful, very and I mean very white. <img width="3349" height="1400" alt="Image" src="https://github.com/user-attachments/assets/30147c6e-a0b3-4503-af46-b6f2872fc00e" /> <img width="3440" height="1440" alt="Image" src="https://github.com/user-attachments/assets/90cf000e-50c2-4cda-9c58-3c7fe7f07cc5" /> some generic system info: v2.0.11 7.3.1-1-cashyos (64-bit) / RADV 3:26.2.6-1 / RX 9070 XT / KDE Plasma 6.8.2 / Wayland / 16 × AMD Ryzen 7 5800X 8-Core Processor / 64 GiB of RAM Also the hookshot_log u asked for [hookshot_log.txt](https://github.com/user-attachments/files/34601428/hookshot_log.txt)
Basstard75 commented 2026-11-09 21:55:51 +00:00 (Migrated from github.com)

Per-draw program lookup gets slower after each area change; only a restart brings fps back (v2.0.11, Linux, NVIDIA)

Setup

  • Hookshot v2.0.11 (AppImage, built with --cli), game log header: hookshot v2.0.11 (source 10f983ad)
  • Nobara Linux (kernel 7.3), Wayland, Ryzen 7 5800X, 31 GB RAM
  • RTX 5070 Ti 16 GB (Vulkan 1.4, driver 0x94dc01c0 as reported in the log)
  • Settings: frame generation 2x/3x, output 1920x1080 / 2048x1152, robust buffers Off/Auto (same pattern with both)

What happens
After starting the game, a new area runs at 50-60 fps. After the next area change, fps drops to 20-30 and stays there. Restarting the game in that same area brings it back to 50-60 fps until the next area change.

What the log shows
The programs phase of a frame's replay time jumps after an area change and does not come back down; the GPU is not the limit:

Session (log) Before the area change After the area change
hookshot_log.2.txt programs 0.5-1.0 ms, submit 12-21 ms, 40-60 fps programs 12-18 ms, submit 29-42 ms, 20-30 fps
hookshot_log.1.txt programs 0.6-1.1 ms, 45-57 fps programs 7-38 ms, 17-33 fps
hookshot_log.3.txt programs climbing 6 -> 22 ms after the load, 18-30 fps
  • Draws per frame are similar before and after (about 1000-2400).
  • GPU time stays at 5-10 ms per frame.
  • slow submit lines after the change are dominated by programs, e.g. slow submit: 34.4 ms: draw 35.1 ... programs 26.7.
  • program picks rates do not change: about 55k-90k of every 200k picks miss the fast path, both before and after. So the number of slow-path picks stays the same, but each one gets more expensive as the session goes on.
  • No shader prediction or translation is running then (0 jobs queued, 0 draws left out).

My guess, unverified: something program_for -> still_valid / program_pick walks (variants, codes or answers per program, or shader_mu contention) grows with every area visited and is never trimmed. I can attach full logs and test switches if that helps.

hookshot_log.3.txt
hookshot_log.2.txt
hookshot_log.1.txt

**Per-draw program lookup gets slower after each area change; only a restart brings fps back (v2.0.11, Linux, NVIDIA)** **Setup** - Hookshot v2.0.11 (AppImage, built with `--cli`), game log header: `hookshot v2.0.11 (source 10f983ad)` - Nobara Linux (kernel 7.3), Wayland, Ryzen 7 5800X, 31 GB RAM - RTX 5070 Ti 16 GB (Vulkan 1.4, driver 0x94dc01c0 as reported in the log) - Settings: frame generation 2x/3x, output 1920x1080 / 2048x1152, robust buffers Off/Auto (same pattern with both) **What happens** After starting the game, a new area runs at 50-60 fps. After the next area change, fps drops to 20-30 and stays there. Restarting the game in that same area brings it back to 50-60 fps until the next area change. **What the log shows** The `programs` phase of `a frame's replay time` jumps after an area change and does not come back down; the GPU is not the limit: | Session (log) | Before the area change | After the area change | |---|---|---| | hookshot_log.2.txt | programs 0.5-1.0 ms, submit 12-21 ms, 40-60 fps | programs 12-18 ms, submit 29-42 ms, 20-30 fps | | hookshot_log.1.txt | programs 0.6-1.1 ms, 45-57 fps | programs 7-38 ms, 17-33 fps | | hookshot_log.3.txt | | programs climbing 6 -> 22 ms after the load, 18-30 fps | - Draws per frame are similar before and after (about 1000-2400). - GPU time stays at 5-10 ms per frame. - `slow submit` lines after the change are dominated by programs, e.g. `slow submit: 34.4 ms: draw 35.1 ... programs 26.7`. - `program picks` rates do not change: about 55k-90k of every 200k picks miss the fast path, both before and after. So the number of slow-path picks stays the same, but each one gets more expensive as the session goes on. - No shader prediction or translation is running then (0 jobs queued, 0 draws left out). My guess, unverified: something `program_for` -> `still_valid` / `program_pick` walks (variants, codes or answers per program, or `shader_mu` contention) grows with every area visited and is never trimmed. I can attach full logs and test switches if that helps. [hookshot_log.3.txt](https://github.com/user-attachments/files/34601680/hookshot_log.3.txt) [hookshot_log.2.txt](https://github.com/user-attachments/files/34601681/hookshot_log.2.txt) [hookshot_log.1.txt](https://github.com/user-attachments/files/34601682/hookshot_log.1.txt)
meepcat55 commented 2026-11-09 22:28:14 +00:00 (Migrated from github.com)

Colors look all washed out and brightened on my rx 9070 archlinux build 2.0.11

Game under Lichii
Image
Game under hookshot
Image

Colors look all washed out and brightened on my rx 9070 archlinux build 2.0.11 Game under Lichii <img width="2560" height="1440" alt="Image" src="https://github.com/user-attachments/assets/96140705-e535-49df-bf5d-bbef92a50c80" /> Game under hookshot <img width="2560" height="1440" alt="Image" src="https://github.com/user-attachments/assets/54496444-3da7-4d6d-9afb-f35e6d71f6ff" />
omgitsgela commented 2026-11-09 23:06:30 +00:00 (Migrated from github.com)

Two findings from a Steam Deck (RADV VANGOGH), v2.0.11 built from the official Linux AppImage. Both are reproducible; logs below are verbatim. Posting here per the routing in #1318.

Device: SteamOS 3.8.28, kernel 6.18.50-valve2-1-neptune, AMD Custom GPU 0405 (RADV VANGOGH), Mesa 26.2.0-devel, Vulkan 1.4.350, 3 GiB device-local + 6 GiB shared VRAM, 14 GiB RAM.

1. RX_VK_SKIP_CODE=2c56dc1006942f74 did not prevent the reset at the Deku Tree

The skip does engage — 10 programs were left out — and the GPU still resets when the scene begins. This corroborates #1318 ("SKIP_CODE not enough") with the skip verified active:

vk: draws of program 2bcc4174a654992f left out (RX_VK_SKIP_CODE); its code: 1:0bae1f63e05e3ba1 6:2c56dc1006942f74
vk: draws of program ae384cff0ad0f467 left out (RX_VK_SKIP_CODE); its code: 1:3437c9d19d611d61 6:2c56dc1006942f74
vk: draws of program d13aac3cec1a4bb5 left out (RX_VK_SKIP_CODE); its code: 1:a6dbb83b9de18fb7 6:2c56dc1006942f74
vk: draws of program c70332b4adb4aa9f left out (RX_VK_SKIP_CODE); its code: 1:7fbc23eaf07763db 6:2c56dc1006942f74

Then:

amdgpu: ring gfx_0.0.0 timeout, signaled seq=406360, emitted seq=406364
amdgpu:  Process hookshot pid 9115 thread mkw_vk order pid 9178
amdgpu: GPU reset(3) succeeded!

Worth noting: the source comment says "about 30 programs use it". Only 10 had been reached when the reset happened, so it is possible the fatal program is among the ones not yet seen. If that is the case, the skip list cannot be assumed complete — a program list driven by observation will always under-cover.

2. Movie decoder starvation (low fps + audio drift, with a flat fps counter)

During intro movie playback the decoder repeatedly has nothing ready, and presentation waits on it:

video: acquire 1505: nothing decoded (idle: its sync not reached), buffer 0 again
video: acquire 1506: nothing decoded (idle: its sync not reached), buffer 1 again
queues ordered by their events: 6000 submissions stopped at a wait, 5994 went on once it was reached, 3 waits gone past

What the user sees with this:

  • long stretches at a steady 60.0 fps, then drops to about 5 fps at scene changes;
  • the fps overlay stays flat through those dips (smoothed over 5 s), so it reads as "stutter without a frame-rate drop";
  • a 1-2 second audio delay/hiccup inside the movie scene.

The slow frames in the same run are dominated by texture work at the scene transition, not by shader compilation:

slow frame at present 12269: 1738.2 ms; submit 1616.9, draw 1093.8, descriptors 666.6
slow submit: 1004.3 ms: draw 1588.9 descriptors 418.5 texture lookups 418.8 commands 1144.0
slow submit: 2154.9 ms: draw 603.4 descriptors 581.1 texture lookups 2085.3 uploads 517.0
slow upload 37.4 ms: #227 1365x1365x1 x90 levels 11 NVN 0x8e ASTC (BC3), 57825 of 57825 KB

3. A separate movie hang, worked around

On the same build, before any of the above, one draw took 20.5 s in the upscale network and the ring was reset:

vk: network fd029a317a9a4b94: dispatch 32x36x1, 1 textures 1 images: 1536x864x1/122 2048x1152x1/122
vk: slow submit: 20589.6 ms: draw 20576.9

fd029a317a9a4b94 is in the default RX_VK_NETWORK_KEEP list (gpu/vk/vk_shader.cpp, "amd-fix"). Excluding it kept the movie stable and the linear upscale took over:

RX_VK_NETWORK_KEEP=9dc98871eb7fc101

After that: network fd029a 0 occurrences, typed upscale helper 0, no 20 s submit. It did not stop the Deku Tree reset, so these are separate faults.

4. Operational note

Every run that ends in a GPU reset discards the shader program cache (vk: program cache ...: 0 program keys kept) and the next launch rebuilds all 38,809 programs, measured at about 7-10 minutes on this device (~94 programs/s). Each crash therefore costs a full rebuild before the next test, which makes per-crash iteration on Deck expensive.

Two findings from a Steam Deck (RADV VANGOGH), v2.0.11 built from the official Linux AppImage. Both are reproducible; logs below are verbatim. Posting here per the routing in #1318. **Device:** SteamOS 3.8.28, kernel `6.18.50-valve2-1-neptune`, AMD Custom GPU 0405 (RADV VANGOGH), Mesa `26.2.0-devel`, Vulkan 1.4.350, 3 GiB device-local + 6 GiB shared VRAM, 14 GiB RAM. ## 1. `RX_VK_SKIP_CODE=2c56dc1006942f74` did not prevent the reset at the Deku Tree The skip does engage — 10 programs were left out — and the GPU still resets when the scene begins. This corroborates #1318 ("SKIP_CODE not enough") with the skip verified active: ``` vk: draws of program 2bcc4174a654992f left out (RX_VK_SKIP_CODE); its code: 1:0bae1f63e05e3ba1 6:2c56dc1006942f74 vk: draws of program ae384cff0ad0f467 left out (RX_VK_SKIP_CODE); its code: 1:3437c9d19d611d61 6:2c56dc1006942f74 vk: draws of program d13aac3cec1a4bb5 left out (RX_VK_SKIP_CODE); its code: 1:a6dbb83b9de18fb7 6:2c56dc1006942f74 vk: draws of program c70332b4adb4aa9f left out (RX_VK_SKIP_CODE); its code: 1:7fbc23eaf07763db 6:2c56dc1006942f74 ``` Then: ``` amdgpu: ring gfx_0.0.0 timeout, signaled seq=406360, emitted seq=406364 amdgpu: Process hookshot pid 9115 thread mkw_vk order pid 9178 amdgpu: GPU reset(3) succeeded! ``` Worth noting: the source comment says "about 30 programs use it". Only 10 had been reached when the reset happened, so it is possible the fatal program is among the ones not yet seen. If that is the case, the skip list cannot be assumed complete — a program list driven by observation will always under-cover. ## 2. Movie decoder starvation (low fps + audio drift, with a flat fps counter) During intro movie playback the decoder repeatedly has nothing ready, and presentation waits on it: ``` video: acquire 1505: nothing decoded (idle: its sync not reached), buffer 0 again video: acquire 1506: nothing decoded (idle: its sync not reached), buffer 1 again queues ordered by their events: 6000 submissions stopped at a wait, 5994 went on once it was reached, 3 waits gone past ``` What the user sees with this: - long stretches at a steady 60.0 fps, then drops to about 5 fps at scene changes; - the fps overlay stays flat through those dips (smoothed over 5 s), so it reads as "stutter without a frame-rate drop"; - a 1-2 second audio delay/hiccup inside the movie scene. The slow frames in the same run are dominated by texture work at the scene transition, not by shader compilation: ``` slow frame at present 12269: 1738.2 ms; submit 1616.9, draw 1093.8, descriptors 666.6 slow submit: 1004.3 ms: draw 1588.9 descriptors 418.5 texture lookups 418.8 commands 1144.0 slow submit: 2154.9 ms: draw 603.4 descriptors 581.1 texture lookups 2085.3 uploads 517.0 slow upload 37.4 ms: #227 1365x1365x1 x90 levels 11 NVN 0x8e ASTC (BC3), 57825 of 57825 KB ``` ## 3. A separate movie hang, worked around On the same build, before any of the above, one draw took 20.5 s in the upscale network and the ring was reset: ``` vk: network fd029a317a9a4b94: dispatch 32x36x1, 1 textures 1 images: 1536x864x1/122 2048x1152x1/122 vk: slow submit: 20589.6 ms: draw 20576.9 ``` `fd029a317a9a4b94` is in the default `RX_VK_NETWORK_KEEP` list (`gpu/vk/vk_shader.cpp`, "amd-fix"). Excluding it kept the movie stable and the linear upscale took over: ``` RX_VK_NETWORK_KEEP=9dc98871eb7fc101 ``` After that: `network fd029a` 0 occurrences, `typed upscale helper` 0, no 20 s submit. It did not stop the Deku Tree reset, so these are separate faults. ## 4. Operational note Every run that ends in a GPU reset discards the shader program cache (`vk: program cache ...: 0 program keys kept`) and the next launch rebuilds all 38,809 programs, measured at about 7-10 minutes on this device (~94 programs/s). Each crash therefore costs a full rebuild before the next test, which makes per-crash iteration on Deck expensive.
zackfairccff-bot commented 2026-11-10 01:43:07 +00:00 (Migrated from github.com)

Update: Steam Deck LCD — Kokiri rendering improvements, but memory pressure causes Hookshot to freeze and terminate

Hi everyone,

I'm sharing additional findings from my latest Hookshot tests on the Steam Deck LCD.

System:

  • Steam Deck LCD — AMD Van Gogh / RADV
  • SteamOS 3.9.5 (build 20261023.100)
  • KDE Plasma / Wayland
  • Native Linux Hookshot executable
  • Game files stored on a microSD card

1. Latest gameplay test

After rebuilding Hookshot with newer changes, I managed to reach Kokiri Forest.

Compared with my previous v2.0.10 tests, the rendering appeared noticeably better:

  • Link, the house, and nearby vegetation were visible.
  • I could move the camera briefly.
  • Performance was approximately 14 FPS.
  • The game then froze, and the desktop temporarily became unresponsive.
  • Eventually, Hookshot closed and the desktop recovered without requiring a forced reboot.

The intro still stutters, and some areas that should appear black are rendered green.

For comparison, an earlier v2.0.5 build allowed me to move around Kokiri and interact with the environment, although with significant rendering glitches.

2. Confirmed earlyoom termination

I inspected the system journal after the latest freeze.

Unlike my earlier crashes, which included AMDGPU ring timeouts and GPU resets, this test did not show another GPU ring timeout in the inspected kernel logs.

Instead, the SteamOS earlyoom service explicitly selected the Hookshot process for termination:

Nov 09 22:26:53 earlyoom: sending SIGTERM to process 34604 "hookshot"
oom_score 913
oom_score_adj 200
VmRSS 2527 MiB

The log also recorded:

Nov 09 22:26:48 kwin_wayland: The main thread was hanging temporarily!

This confirms that the latest incident involved memory pressure severe enough for SteamOS to intervene.

The approximately 2.5 GiB VmRSS value represents resident process memory, not total system or GPU memory consumption.

3. Memory information collected after the crash

System RAM: 14 GiB
RAM available: 8.1 GiB

Total swap: 8.2 GiB
Swap used: 3.9 GiB

zram: 7.2 GiB
zram used: 3.9 GiB

Dedicated VRAM reservation: 1 GiB
VRAM used: approximately 543 MiB

GTT total: 8 GiB
GTT used: approximately 1.16 GiB

These measurements were taken after Hookshot had already closed, so they should not be interpreted as peak memory usage during gameplay.

I also confirmed that previously installed Distrobox/Podman development environments were removed and were not occupying significant storage.

4. Two distinct failure modes

Across my tests, I have now documented two different outcomes:

Earlier v2.0.10 tests:

  • Vulkan VK_ERROR_DEVICE_LOST
  • AMDGPU graphics ring timeouts
  • Failed graphics ring resets
  • MODE2 GPU resets
  • Desktop session instability

Latest rebuilt version:

  • Kokiri Forest renders more correctly
  • Approximately 14 FPS
  • Freeze shortly after moving the camera
  • Temporary Wayland compositor hang
  • Hookshot terminated by SteamOS earlyoom
  • No GPU ring timeout found in the inspected logs

These may be related, but the evidence does not establish a single underlying cause.

5. Possible connection to other Steam Deck reports

This behavior seems relevant to the memory-pressure and GPU-hang investigations in #817 and #150.

I noticed that other Steam Deck testers have experimented with limits for texture memory, VRAM and mirrors.

Would it be possible to introduce a Steam Deck / RADV VANGOGH low-memory preset, or recommend a tested combination of memory-related settings?

In particular, I'd be interested in knowing whether limiting texture dimensions, texture-cache size and mirror memory could reduce memory pressure without introducing the severe rendering issues seen when disabling mesh rendering.

I'm avoiding further stress tests for now because previous builds caused full GPU resets.

I can provide the system journal and additional logs if useful.

Thank you for continuing to investigate Linux and Steam Deck compatibility.

### Update: Steam Deck LCD — Kokiri rendering improvements, but memory pressure causes Hookshot to freeze and terminate Hi everyone, I'm sharing additional findings from my latest Hookshot tests on the Steam Deck LCD. **System:** - Steam Deck LCD — AMD Van Gogh / RADV - SteamOS 3.9.5 (build 20261023.100) - KDE Plasma / Wayland - Native Linux Hookshot executable - Game files stored on a microSD card ### 1. Latest gameplay test After rebuilding Hookshot with newer changes, I managed to reach Kokiri Forest. Compared with my previous v2.0.10 tests, the rendering appeared noticeably better: - Link, the house, and nearby vegetation were visible. - I could move the camera briefly. - Performance was approximately 14 FPS. - The game then froze, and the desktop temporarily became unresponsive. - Eventually, Hookshot closed and the desktop recovered without requiring a forced reboot. The intro still stutters, and some areas that should appear black are rendered green. For comparison, an earlier v2.0.5 build allowed me to move around Kokiri and interact with the environment, although with significant rendering glitches. ### 2. Confirmed earlyoom termination I inspected the system journal after the latest freeze. Unlike my earlier crashes, which included AMDGPU ring timeouts and GPU resets, **this test did not show another GPU ring timeout in the inspected kernel logs**. Instead, the SteamOS `earlyoom` service explicitly selected the Hookshot process for termination: ```text Nov 09 22:26:53 earlyoom: sending SIGTERM to process 34604 "hookshot" oom_score 913 oom_score_adj 200 VmRSS 2527 MiB ``` The log also recorded: ```text Nov 09 22:26:48 kwin_wayland: The main thread was hanging temporarily! ``` This confirms that the latest incident involved memory pressure severe enough for SteamOS to intervene. The approximately 2.5 GiB VmRSS value represents resident process memory, not total system or GPU memory consumption. ### 3. Memory information collected after the crash ```text System RAM: 14 GiB RAM available: 8.1 GiB Total swap: 8.2 GiB Swap used: 3.9 GiB zram: 7.2 GiB zram used: 3.9 GiB Dedicated VRAM reservation: 1 GiB VRAM used: approximately 543 MiB GTT total: 8 GiB GTT used: approximately 1.16 GiB ``` These measurements were taken **after Hookshot had already closed**, so they should not be interpreted as peak memory usage during gameplay. I also confirmed that previously installed Distrobox/Podman development environments were removed and were not occupying significant storage. ### 4. Two distinct failure modes Across my tests, I have now documented two different outcomes: **Earlier v2.0.10 tests:** - Vulkan `VK_ERROR_DEVICE_LOST` - AMDGPU graphics ring timeouts - Failed graphics ring resets - MODE2 GPU resets - Desktop session instability **Latest rebuilt version:** - Kokiri Forest renders more correctly - Approximately 14 FPS - Freeze shortly after moving the camera - Temporary Wayland compositor hang - Hookshot terminated by SteamOS `earlyoom` - No GPU ring timeout found in the inspected logs These may be related, but the evidence does not establish a single underlying cause. ### 5. Possible connection to other Steam Deck reports This behavior seems relevant to the memory-pressure and GPU-hang investigations in #817 and #150. I noticed that other Steam Deck testers have experimented with limits for texture memory, VRAM and mirrors. Would it be possible to introduce a **Steam Deck / RADV VANGOGH low-memory preset**, or recommend a tested combination of memory-related settings? In particular, I'd be interested in knowing whether limiting texture dimensions, texture-cache size and mirror memory could reduce memory pressure without introducing the severe rendering issues seen when disabling mesh rendering. I'm avoiding further stress tests for now because previous builds caused full GPU resets. I can provide the system journal and additional logs if useful. Thank you for continuing to investigate Linux and Steam Deck compatibility.
martinlepadan commented 2026-11-10 02:28:40 +00:00 (Migrated from github.com)

Test report: Ubuntu 24.04, NVIDIA PRIME laptop (RTX 3070 Laptop, 16 GB RAM), built from source

Setup

  • Acer Nitro AN515-57: i7-11800H, RTX 3070 Laptop 8 GB (PRIME on-demand, Intel iGPU drives the display), 16 GB RAM, 8 GB swap
  • Ubuntu 24.04, kernel 6.17, NVIDIA 580.178.04 (proprietary module), GNOME Wayland
  • main at c94d80e (hookshot v2.0.9-34-gc94d80e), built from source with make_game.py --nup ... --jobs 8 and system clang 18 (not the AppImage), so this is older than v2.0.11
  • Settings: Minimum preset, fullscreen

Works

  • Build: 42 min (38 min compile, 8 jobs). Peak 13 GB used and 4.6 GB of swap during the compile.
  • The NVIDIA GPU is picked automatically from the Intel / NVIDIA / llvmpipe list. On native Wayland the window opens directly, without the #992 freeze and with no SDL_VIDEODRIVER=x11 needed.
  • First start prepares the shaders (38,809) in about 10 min, then the game starts in seconds.
  • AV1 intro, Kokiri Forest (about 30-34 fps, GPU thermally limited, see below), Insert menu, USB controller, and save/load all work.
  • 72-minute session: no crash and no Xid.

Findings

  1. Memory on 16 GB: the game's RSS reached 10 GB and the 8 GB swap was completely full after about an hour (no OOM kill). This matches the Steam Deck memory-pressure report above. 16 GB is a tight minimum once a browser or IDE is also open.
  2. Source build doesn't check its prerequisites up front: a missing zstandard, missing CPM headers (RX_CPM) or missing FFmpeg dev packages each surface mid-build as a failed step (e.g. nup.py stopped: ModuleNotFoundError: No module named 'zstandard'), not as a list at the start. The readme lists them, so this is minor, and the AppImage avoids it.
  3. Tip for PRIME laptops (driver, not Hookshot): this laptop had a udev rule setting d3cold_allowed=0 to avoid Xid 119 (GSP) when the GPU woke from D3cold. In on-demand mode the card then stayed in D3hot and kept warming the shared heatpipes. In-game, the GPU dropped to 210 MHz (thermal slowdown 0x20) within seconds, and the engine scenes ran at 2-10 fps. With options nvidia NVreg_EnableGpuFirmware=0 (proprietary module only), D3cold is allowed again: 6 wake cycles and a 72-minute session with no Xid, and the GPU held 1,700+ MHz until the laptop's own cooling saturated.
**Test report: Ubuntu 24.04, NVIDIA PRIME laptop (RTX 3070 Laptop, 16 GB RAM), built from source** **Setup** - Acer Nitro AN515-57: i7-11800H, RTX 3070 Laptop 8 GB (PRIME on-demand, Intel iGPU drives the display), 16 GB RAM, 8 GB swap - Ubuntu 24.04, kernel 6.17, NVIDIA 580.178.04 (proprietary module), GNOME Wayland - `main` at c94d80e (`hookshot v2.0.9-34-gc94d80e`), built from source with `make_game.py --nup ... --jobs 8` and system clang 18 (not the AppImage), so this is older than v2.0.11 - Settings: Minimum preset, fullscreen **Works** - Build: 42 min (38 min compile, 8 jobs). Peak 13 GB used and 4.6 GB of swap during the compile. - The NVIDIA GPU is picked automatically from the Intel / NVIDIA / llvmpipe list. On native Wayland the window opens directly, without the #992 freeze and with no `SDL_VIDEODRIVER=x11` needed. - First start prepares the shaders (38,809) in about 10 min, then the game starts in seconds. - AV1 intro, Kokiri Forest (about 30-34 fps, GPU thermally limited, see below), Insert menu, USB controller, and save/load all work. - 72-minute session: no crash and no Xid. **Findings** 1. **Memory on 16 GB:** the game's RSS reached **10 GB** and the 8 GB swap was **completely full** after about an hour (no OOM kill). This matches the Steam Deck memory-pressure report above. 16 GB is a tight minimum once a browser or IDE is also open. 2. **Source build doesn't check its prerequisites up front:** a missing `zstandard`, missing CPM headers (`RX_CPM`) or missing FFmpeg dev packages each surface mid-build as a failed step (e.g. `nup.py stopped: ModuleNotFoundError: No module named 'zstandard'`), not as a list at the start. The readme lists them, so this is minor, and the AppImage avoids it. 3. **Tip for PRIME laptops (driver, not Hookshot):** this laptop had a udev rule setting `d3cold_allowed=0` to avoid Xid 119 (GSP) when the GPU woke from D3cold. In on-demand mode the card then stayed in D3hot and kept warming the shared heatpipes. In-game, the GPU dropped to 210 MHz (thermal slowdown `0x20`) within seconds, and the engine scenes ran at 2-10 fps. With `options nvidia NVreg_EnableGpuFirmware=0` (proprietary module only), D3cold is allowed again: 6 wake cycles and a 72-minute session with no Xid, and the GPU held 1,700+ MHz until the laptop's own cooling saturated.
thelinuxgmr commented 2026-11-10 02:55:49 +00:00 (Migrated from github.com)

Follow-up on the Steam Deck Deku Tree hang (#817, tracked here): v2.0.11 fixes it.

Tested v2.0.11 on the same Steam Deck (CachyOS Deckify, RADV Van Gogh), loading from the save used in the earlier tests:

  • The RX_VK_SKIP_CODE Steam Deck workaround fixed the crash — the Great Deku Tree speech now plays through with no GPU hang. Overall it works well now. Huge win — thank you.
  • It also looks better and runs better than the previous build.
  • The old RX_VK_NO_MESH=1 workaround is no longer needed to avoid the crash.

Two smaller things remaining, neither is a blocker:

  1. Performance is still a bit choppy — playable, but not perfectly smooth yet; a bit more performance would help.
  2. Some flickering in the world — minor, not bad.

Thanks again for the fix — this was the one keeping the game from being genuinely playable on the Deck.

**Follow-up on the Steam Deck Deku Tree hang (#817, tracked here): v2.0.11 fixes it.** Tested v2.0.11 on the same Steam Deck (CachyOS Deckify, RADV Van Gogh), loading from the save used in the earlier tests: - The `RX_VK_SKIP_CODE` Steam Deck workaround **fixed the crash** — the Great Deku Tree speech now plays through with no GPU hang. Overall it works well now. Huge win — thank you. - It also looks better and runs better than the previous build. - The old `RX_VK_NO_MESH=1` workaround is **no longer needed** to avoid the crash. Two smaller things remaining, neither is a blocker: 1. **Performance is still a bit choppy** — playable, but not perfectly smooth yet; a bit more performance would help. 2. **Some flickering in the world** — minor, not bad. Thanks again for the fix — this was the one keeping the game from being genuinely playable on the Deck.
omgitsgela commented 2026-11-10 03:46:51 +00:00 (Migrated from github.com)

Steam Deck (RADV VANGOGH), v2.0.11: the Deku Tree hang is the native task/mesh path, and the fallback that avoids it draws nothing. Details below, with two debugging techniques that may be worth adopting.

1. The hang is in native task/mesh, not in one program

A/B on the same build, same save:

  • RX_VK_NO_MESH=1 (mesh/task draws left out): reaches the Deku Tree, creates and renders the 12288x12288 DEPTH16 target, 0 GPU resets — but the screen is black, because those draws carry the geometry.
  • RX_VK_NO_MESH=2 (everything except mesh/task draws left out): reaches the same target and resets — ring gfx_0.0.0 timeout, signaled seq=1220264, emitted seq=1220266, thread Presentation Th.

So mesh/task draw execution is necessary and sufficient for the reset.

2. It is not one program — skip lists cannot fix it

Two runs, same config, breadcrumb naming the last dispatch issued:

run A: frame=10728 key=6ea0c171f1a7b6d8 groups=13,1,1   → reset
run B: (that program skipped)  frame=10812 key=3a131272834635ab groups=2,1,1  → reset

Skipping the named program moved the hang to another one. RX_VK_SKIP_CODE=2c56dc1006942f74 also does not prevent it here — the program that hangs is not among the ones sharing that task shader. That is consistent with several programs hanging the same way rather than one bad shader.

The set of mesh programs drawn at the fatal frame also differs between runs (only one of twelve from a previous fatal frame appeared in the next), so a frozen list cannot be bisected either.

3. The fallback avoids the hang but renders nothing

I ported PR #1314's SPIR-V fixes (054f7a8, 7c7bfe3, 14e0865) onto v2.0.11 — they cherry-pick cleanly — and forced RX_VK_FORCE_MESH_FALLBACK=1.

  • The fallback engages: vk: no mesh shaders: task and mesh programs run as compute shaders (issue 640 fallback).
  • The game reaches the Deku Tree and never resets: 12 minutes, steady 60 fps, the 12288x12288 target created and rendered, no fallback: the compute pipeline ... could not be made lines.
  • The screen stays black. A control run with no mesh special-casing renders the intro normally (real 3D scene, 1.4 MB screenshot vs ~60 KB for black), so the capture method is not the explanation.

So the crash is in the native task/mesh path, and the fallback currently fixes it by not drawing.

4. Two things that made this measurable

RADV hang dumps don't reach disk with the default fault features. vk_main.cpp chains VkPhysicalDeviceFaultFeaturesEXT and the vkGetPhysicalDeviceFeatures2 call fills it in place, so whatever RADV advertises is enabled at vkCreateDevice — including deviceFaultVendorBinary under RADV_DEBUG=hang, which makes RADV keep the report in memory. This renderer only reads the address and vendor-info lists (vk_draw.cpp, counts.vendorBinarySize = 0), never the binary. One line makes the dumps land on disk:

vkGetPhysicalDeviceFeatures2(dev.physical, &f);
fault.deviceFaultVendorBinary = VK_FALSE;

With that, two separate crashes produced radv_dumps_*/trace.log, both ending on the same command:

DISPATCH_TASKMESH_DIRECT_ACE(shader_type=compute)
    X_DIM <- 12   Y_DIM <- 1   Z_DIM <- 1
    COMPUTE_DISPATCH_INITIATOR <- 0x0002a041
  → EVENT_WRITE CS_PARTIAL_FLUSH (x2) → ACQUIRE_MEM → WRITE_DATA (WR_CONFIRM) → hang

pipeline.log was empty in both, so the dump does not name the pipeline.

A breadcrumb survives the reset. Because the kernel reset kills the process, anything only in the log buffer is lost. Writing one small record before each native vkCmdDrawMeshTasksEXT (frame, program key, groups) puts the last dispatch on disk in the page cache. That is what produced the two keys in section 2, and it may be a useful optional diagnostic for other Deck users.


If it helps, I can attach the two trace.log dumps and the exact patch series; I have kept them out of the issue since they contain GPU addresses and register dumps.

Steam Deck (RADV VANGOGH), v2.0.11: the Deku Tree hang is the native task/mesh path, and the fallback that avoids it draws nothing. Details below, with two debugging techniques that may be worth adopting. ## 1. The hang is in native task/mesh, not in one program A/B on the same build, same save: - `RX_VK_NO_MESH=1` (mesh/task draws left out): reaches the Deku Tree, creates and renders the `12288x12288` DEPTH16 target, **0 GPU resets** — but the screen is black, because those draws carry the geometry. - `RX_VK_NO_MESH=2` (everything *except* mesh/task draws left out): reaches the same target and **resets** — `ring gfx_0.0.0 timeout, signaled seq=1220264, emitted seq=1220266`, thread `Presentation Th`. So mesh/task draw execution is necessary and sufficient for the reset. ## 2. It is not one program — skip lists cannot fix it Two runs, same config, breadcrumb naming the last dispatch issued: ``` run A: frame=10728 key=6ea0c171f1a7b6d8 groups=13,1,1 → reset run B: (that program skipped) frame=10812 key=3a131272834635ab groups=2,1,1 → reset ``` Skipping the named program moved the hang to another one. `RX_VK_SKIP_CODE=2c56dc1006942f74` also does not prevent it here — the program that hangs is not among the ones sharing that task shader. That is consistent with several programs hanging the same way rather than one bad shader. The set of mesh programs drawn at the fatal frame also **differs between runs** (only one of twelve from a previous fatal frame appeared in the next), so a frozen list cannot be bisected either. ## 3. The fallback avoids the hang but renders nothing I ported PR #1314's SPIR-V fixes (`054f7a8`, `7c7bfe3`, `14e0865`) onto v2.0.11 — they cherry-pick cleanly — and forced `RX_VK_FORCE_MESH_FALLBACK=1`. - The fallback engages: `vk: no mesh shaders: task and mesh programs run as compute shaders (issue 640 fallback)`. - The game **reaches the Deku Tree and never resets**: 12 minutes, steady 60 fps, the `12288x12288` target created and rendered, no `fallback: the compute pipeline ... could not be made` lines. - **The screen stays black.** A control run with no mesh special-casing renders the intro normally (real 3D scene, 1.4 MB screenshot vs ~60 KB for black), so the capture method is not the explanation. So the crash is in the native task/mesh path, and the fallback currently fixes it by not drawing. ## 4. Two things that made this measurable **RADV hang dumps don't reach disk with the default fault features.** `vk_main.cpp` chains `VkPhysicalDeviceFaultFeaturesEXT` and the `vkGetPhysicalDeviceFeatures2` call fills it in place, so whatever RADV advertises is enabled at `vkCreateDevice` — including `deviceFaultVendorBinary` under `RADV_DEBUG=hang`, which makes RADV keep the report in memory. This renderer only reads the address and vendor-info lists (`vk_draw.cpp`, `counts.vendorBinarySize = 0`), never the binary. One line makes the dumps land on disk: ```cpp vkGetPhysicalDeviceFeatures2(dev.physical, &f); fault.deviceFaultVendorBinary = VK_FALSE; ``` With that, two separate crashes produced `radv_dumps_*/trace.log`, both ending on the same command: ``` DISPATCH_TASKMESH_DIRECT_ACE(shader_type=compute) X_DIM <- 12 Y_DIM <- 1 Z_DIM <- 1 COMPUTE_DISPATCH_INITIATOR <- 0x0002a041 → EVENT_WRITE CS_PARTIAL_FLUSH (x2) → ACQUIRE_MEM → WRITE_DATA (WR_CONFIRM) → hang ``` `pipeline.log` was empty in both, so the dump does not name the pipeline. **A breadcrumb survives the reset.** Because the kernel reset kills the process, anything only in the log buffer is lost. Writing one small record before each native `vkCmdDrawMeshTasksEXT` (frame, program key, groups) puts the last dispatch on disk in the page cache. That is what produced the two keys in section 2, and it may be a useful optional diagnostic for other Deck users. --- If it helps, I can attach the two `trace.log` dumps and the exact patch series; I have kept them out of the issue since they contain GPU addresses and register dumps.
LucianoMSS commented 2026-11-10 05:07:55 +00:00 (Migrated from github.com)

Follow-up from #1318 (Steam Deck LCD, RADV VANGOGH, v2.0.11): false positive on “it works”.

Interior vs outdoor

  • Save inside Link’s house: runs with RX_VK_SKIP_CODE=2c56dc1006942f74 (+ RX_VK_MESH_NOCULL same key), but graphics are wrong (models those programs draw are missing — expected for SKIP_CODE).
  • Save just outside the door (same account, next slot): still device lost after the 12288x12288 DEPTH16-style upload / multi-second submits, with SKIP_CODE already engaged and logging programs left out. Latest outdoor reset also showed amdgpu: ring comp_1.3.0 timeout (not only gfx).

So SKIP_CODE / MESH_NOCULL are not enough for the post-door outdoor load on this Deck. Matches omgitsgela’s note that the hang moves between mesh programs and is not covered by that one task-shader key.

Happy to run further A/Bs (RX_VK_NO_MESH=1, RX_VK_FORCE_MESH_FALLBACK=1, checkpoints, etc.) if useful.

Follow-up from #1318 (Steam Deck LCD, RADV VANGOGH, v2.0.11): false positive on “it works”. **Interior vs outdoor** - Save **inside Link’s house**: runs with `RX_VK_SKIP_CODE=2c56dc1006942f74` (+ `RX_VK_MESH_NOCULL` same key), but **graphics are wrong** (models those programs draw are missing — expected for SKIP_CODE). - Save **just outside the door** (same account, next slot): still **device lost** after the `12288x12288` DEPTH16-style upload / multi-second submits, with SKIP_CODE already engaged and logging programs left out. Latest outdoor reset also showed `amdgpu: ring comp_1.3.0 timeout` (not only gfx). So SKIP_CODE / MESH_NOCULL are not enough for the post-door outdoor load on this Deck. Matches omgitsgela’s note that the hang moves between mesh programs and is not covered by that one task-shader key. Happy to run further A/Bs (`RX_VK_NO_MESH=1`, `RX_VK_FORCE_MESH_FALLBACK=1`, checkpoints, etc.) if useful.
quazardous commented 2026-11-10 07:46:09 +00:00 (Migrated from github.com)

Follow-up on v2.0.11, same machine as my earlier report: ROG Ally X, Ryzen Z1 Extreme, RADV, Mesa 26.2.6, Bazzite 45. One new finding, and a correction to two things I said before.

The integrated-GPU texture cap is being exceeded

This is the headline of v2.0.11 — "Textures are now capped at 2.5 GB on integrated GPUs" — and on this device it does not hold:

vk: VRAM: 4817 MB used of 10489 MB allowed (466 MB of it free in the blocks);
    textures 3515 MB (budget 2560 MB), 1378 textures
vk: VRAM: 4625 MB used of 10408 MB allowed (1365 MB of it free in the blocks);
    textures 2455 MB (budget 2560 MB), 612 textures

3515 MB against a 2560 MB budget, 37% over, then back under it with 612 textures instead of 1378. So the budget is not a ceiling but something the run overshoots and then falls back from, by evicting in bulk. Those eviction-and-reload waves are what hitching in a loaded area looks like from the outside, and the player here describes v2.0.11 as "not much better" than v2.0.10 for smoothness.

The cap itself clearly helps elsewhere: the process peaked at 4.83 GB RSS, against 6.9 GB when the kernel OOM-killed it on v2.0.10 on the same machine. No OOM on v2.0.11.

Correcting myself on two earlier guesses

In #1186 (now closed into #1126) I offered two log lines as possible mechanisms behind the stray-texture artefacts. v2.0.11 weakens both, and I would rather say so than leave anyone chasing them:

  • texture slots registered again at another size — a million of them on v2.0.10. The line does not appear at all in my v2.0.11 logs. That guess is dead.
  • draws kept their neighbour's descriptors — was 59 in a 2012-draw frame (2.9%), is now 4–5 in a ~530-draw frame (0.75%). The mechanism is still there, four times rarer by share. If the artefacts look the same to the player while that counter fell that much, it argues against my guess rather than for it.

I have no replacement hypothesis. Sorry for the noise.

Frame rate, without a comparison

44.6–47.7 fps, 529–592 draws a frame, GPU time 12.0–13.4 ms

I am deliberately not comparing this with the 28.9 fps I reported on v2.0.10: that was a 2012-draw frame and this is a 530-draw one, so they are different scenes and the numbers do not meet. I only note that nothing here is submit-bound: 6 submits a frame, GPU 12–13 ms.

Unchanged: 161 shader programs still fail to prepare, the same order as on v2.0.10.

Still happy to test

Device free for debugging, and I can build from source. If a RX_VK_VRAM_MB value, or anything that makes the texture budget a hard limit rather than a target, is worth measuring on a Z1 Extreme, tell me which and I will run it.

Follow-up on v2.0.11, same machine as [my earlier report](https://git.magicbean.dev/MagicBeanDev/Hookshot/issues/1000): **ROG Ally X, Ryzen Z1 Extreme, RADV, Mesa 26.2.6, Bazzite 45**. One new finding, and a correction to two things I said before. ## The integrated-GPU texture cap is being exceeded This is the headline of v2.0.11 — *"Textures are now capped at 2.5 GB on integrated GPUs"* — and on this device it does not hold: ``` vk: VRAM: 4817 MB used of 10489 MB allowed (466 MB of it free in the blocks); textures 3515 MB (budget 2560 MB), 1378 textures vk: VRAM: 4625 MB used of 10408 MB allowed (1365 MB of it free in the blocks); textures 2455 MB (budget 2560 MB), 612 textures ``` 3515 MB against a 2560 MB budget, **37% over**, then back under it with 612 textures instead of 1378. So the budget is not a ceiling but something the run overshoots and then falls back from, by evicting in bulk. Those eviction-and-reload waves are what hitching in a loaded area looks like from the outside, and the player here describes v2.0.11 as "not much better" than v2.0.10 for smoothness. The cap itself clearly helps elsewhere: the process peaked at **4.83 GB RSS**, against **6.9 GB** when the kernel OOM-killed it on v2.0.10 on the same machine. No OOM on v2.0.11. ## Correcting myself on two earlier guesses In [#1186](https://git.magicbean.dev/MagicBeanDev/Hookshot/issues/1186) (now closed into #1126) I offered two log lines as possible mechanisms behind the stray-texture artefacts. v2.0.11 weakens both, and I would rather say so than leave anyone chasing them: - **`texture slots registered again at another size`** — a million of them on v2.0.10. The line does not appear at all in my v2.0.11 logs. That guess is dead. - **`draws kept their neighbour's descriptors`** — was 59 in a 2012-draw frame (2.9%), is now 4–5 in a ~530-draw frame (0.75%). The mechanism is still there, four times rarer by share. If the artefacts look the same to the player while that counter fell that much, it argues *against* my guess rather than for it. I have no replacement hypothesis. Sorry for the noise. ## Frame rate, without a comparison ``` 44.6–47.7 fps, 529–592 draws a frame, GPU time 12.0–13.4 ms ``` I am deliberately **not** comparing this with the 28.9 fps I reported on v2.0.10: that was a 2012-draw frame and this is a 530-draw one, so they are different scenes and the numbers do not meet. I only note that nothing here is submit-bound: 6 submits a frame, GPU 12–13 ms. Unchanged: **161 shader programs still fail** to prepare, the same order as on v2.0.10. ## Still happy to test Device free for debugging, and I can build from source. If a `RX_VK_VRAM_MB` value, or anything that makes the texture budget a hard limit rather than a target, is worth measuring on a Z1 Extreme, tell me which and I will run it.
Maulth commented 2026-11-10 09:19:08 +00:00 (Migrated from github.com)

Steam Deck LCD (RADV VANGOGH), v2.0.11: device lost on loading a save with native mesh; RX_VK_NO_MESH=1 avoids it but flickers, and fps is submit-bound (not fill-bound).

Setup: SteamOS 3.9.5 (kernel 7.2.7-valve2), Mesa 26.2.0-devel (git-5c65d4fc31), Proton Experimental 11.0-20261027b. Game built on Windows with v2.0.11 and copied to the Deck; the shader caches were rebuilt on the Deck (38,809 shaders, 940 s).

1. Device lost on the first mesh draws (native mesh path)

The title screen ran at 60 fps. Loading a save (Kokiri Forest, the starting area) reset the GPU every time:

vk: mesh draw: program 1a84, 3 stages: ...          <- first mesh draws in the log
vk: slow submit: 23616.6 ms: draw 23629.1 descriptors 851.9 texture lookups 855.2 ... queue submit 871.2
vk: slow upload 5392.9 ms: #724 ... 43x85x1 x1 levels 7 NVN 0x8c ASTC, 6 of 6 KB
vk: batched submit 18151 failed (-4)
vk: device lost: reading the fault info (RX_VK_CHECKPOINTS=1 for markers)
kernel: amdgpu 0000:04:00.0: GPU reset(1) succeeded!

Memory was not a factor (11 GB free at the time of the crash). With RX_VK_NO_MESH=1 there is no reset, which matches omgitsgela's A/B above.

2. With RX_VK_NO_MESH=1: no crash, but flickering and 13-23 fps

With NO_MESH=1, Kokiri Forest renders (not black), but it flickers heavily, and none of the settings below changed that. The log has 18 upload over a drawn image lines in one session.

Frame breakdown (warm pipeline cache, 1,200-2,500 draws per frame):

Run fps submit (ms) queue submit (ms) draw (ms)
NO_MESH=1 LOW_SPEC=1 12-15 39.8 31.0 14.2
+ HOS_GRAPHICS_SCALE=0.5 (log: GetCurrentGraphicsScale -> 0.50) 12-16 41.3 36.4 16.4
NO_MESH=1 LOW_SPEC=1 VRAM_MB=4096 PROTON_USE_XALIA=0 13-23 18.4 16.0 9.0
  • Half resolution didn't change the fps, so this is not fill-bound. Most of the frame is queue submit, which fits the userptr-import cost described in #789 (about 2.4 GB imported: imports: 53 live (1376 MB), 40 retired still imported (1056 MB)).
  • Part of the third run's gain is probably just the pipeline cache warming up, so it isn't a clean A/B for the settings.
  • Proton's xalia.exe was using about 40% of a core during play; PROTON_USE_XALIA=0 removes it, which is worth adding to the Deck notes.

3. The texture budget is overshot, and RX_VK_VRAM_MB doesn't move it

The log reports two different numbers for the cap:

vk: an integrated GPU shares the system's RAM: textures at most 2560 MB (RX_VK_VRAM_MB=<MB>: other)
vk: VRAM: ... textures 2701 MB (budget 2200 MB), 1424 textures      <- with RX_VK_VRAM_MB=4096 set

Setting RX_VK_VRAM_MB=4096 (confirmed present in the process environment) still reports budget 2200 MB, and the run goes about 23% over it, the same pattern quazardous saw on the Ally X. If the flicker is eviction churn, this may be related.

Happy to run A/Bs (RX_VK_BATCH_POLL_US=2000, RX_VK_PARALLEL=4, RX_VK_FORCE_MESH_FALLBACK=1, RX_VK_CHECKPOINTS=1 for the hang) and attach full logs.

Steam Deck LCD (RADV VANGOGH), **v2.0.11**: device lost on loading a save with native mesh; `RX_VK_NO_MESH=1` avoids it but flickers, and fps is submit-bound (not fill-bound). **Setup:** SteamOS 3.9.5 (kernel 7.2.7-valve2), Mesa 26.2.0-devel (git-5c65d4fc31), Proton Experimental 11.0-20261027b. Game built on Windows with v2.0.11 and copied to the Deck; the shader caches were rebuilt on the Deck (38,809 shaders, 940 s). ## 1. Device lost on the first mesh draws (native mesh path) The title screen ran at 60 fps. Loading a save (Kokiri Forest, the starting area) reset the GPU every time: ``` vk: mesh draw: program 1a84, 3 stages: ... <- first mesh draws in the log vk: slow submit: 23616.6 ms: draw 23629.1 descriptors 851.9 texture lookups 855.2 ... queue submit 871.2 vk: slow upload 5392.9 ms: #724 ... 43x85x1 x1 levels 7 NVN 0x8c ASTC, 6 of 6 KB vk: batched submit 18151 failed (-4) vk: device lost: reading the fault info (RX_VK_CHECKPOINTS=1 for markers) kernel: amdgpu 0000:04:00.0: GPU reset(1) succeeded! ``` Memory was not a factor (11 GB free at the time of the crash). With `RX_VK_NO_MESH=1` there is no reset, which matches omgitsgela's A/B above. ## 2. With `RX_VK_NO_MESH=1`: no crash, but flickering and 13-23 fps With `NO_MESH=1`, Kokiri Forest renders (not black), but it flickers heavily, and none of the settings below changed that. The log has 18 `upload over a drawn image` lines in one session. Frame breakdown (warm pipeline cache, 1,200-2,500 draws per frame): | Run | fps | submit (ms) | queue submit (ms) | draw (ms) | |---|---|---|---|---| | `NO_MESH=1 LOW_SPEC=1` | 12-15 | 39.8 | 31.0 | 14.2 | | + `HOS_GRAPHICS_SCALE=0.5` (log: `GetCurrentGraphicsScale -> 0.50`) | 12-16 | 41.3 | 36.4 | 16.4 | | `NO_MESH=1 LOW_SPEC=1 VRAM_MB=4096 PROTON_USE_XALIA=0` | 13-23 | 18.4 | 16.0 | 9.0 | - **Half resolution didn't change the fps**, so this is not fill-bound. Most of the frame is `queue submit`, which fits the userptr-import cost described in #789 (about 2.4 GB imported: `imports: 53 live (1376 MB), 40 retired still imported (1056 MB)`). - Part of the third run's gain is probably just the pipeline cache warming up, so it isn't a clean A/B for the settings. - Proton's `xalia.exe` was using about 40% of a core during play; `PROTON_USE_XALIA=0` removes it, which is worth adding to the Deck notes. ## 3. The texture budget is overshot, and `RX_VK_VRAM_MB` doesn't move it The log reports two different numbers for the cap: ``` vk: an integrated GPU shares the system's RAM: textures at most 2560 MB (RX_VK_VRAM_MB=<MB>: other) vk: VRAM: ... textures 2701 MB (budget 2200 MB), 1424 textures <- with RX_VK_VRAM_MB=4096 set ``` Setting `RX_VK_VRAM_MB=4096` (confirmed present in the process environment) still reports `budget 2200 MB`, and the run goes about 23% over it, the same pattern quazardous saw on the Ally X. If the flicker is eviction churn, this may be related. Happy to run A/Bs (`RX_VK_BATCH_POLL_US=2000`, `RX_VK_PARALLEL=4`, `RX_VK_FORCE_MESH_FALLBACK=1`, `RX_VK_CHECKPOINTS=1` for the hang) and attach full logs.
matvei8123-cyber commented 2026-11-10 11:34:01 +00:00 (Migrated from github.com)

The same GPU crash also occurs with the Windows build running through Proton

I previously experienced this exact issue with the native Linux build of Hookshot. I have now tested the Windows build running through Proton-CachyOS, and the same problem occurs again.

This appears to be the same GPU hang and AMDGPU reset issue, not a different type of crash.

System specifications

  • OS: CachyOS Linux
  • CPU: AMD Ryzen 5 8400F
  • RAM: 32 GB
  • GPU: AMD Radeon RX 6800 (Navi 21, 16 GB VRAM)
  • Kernel: 7.3.3-1-cachyos
  • GPU driver: AMDGPU
  • Mesa: 26.2.6-1
  • Vulkan driver: RADV (26.2.6-1)
  • Compatibility layer: proton-cachyos-11.0 (build 20261015)

What happens

I built the Windows version of Hookshot and launched it through Proton-CachyOS.

During gameplay, the GPU hangs completely and both monitors lose their video signal. The AMDGPU driver then attempts to reset the GPU.

The reset eventually succeeds, but the game does not recover.

The same behavior was previously observed with the native Linux build of Hookshot.

Other games work normally on this system, and I have not experienced similar GPU crashes outside Hookshot.

Previous kernel log from the same issue

During the previous crash with the native Linux build, the kernel reported:

refcount_t: underflow; use-after-free.
WARNING: lib/refcount.c:28 at refcount_warn_saturate

amdgpu_job_free
amdgpu_cs_parser_fini
amdgpu_cs_ioctl

amdgpu: ring gfx_0.0.0 timeout
amdgpu: Starting gfx_0.0.0 ring reset
amdgpu: Ring gfx_0.0.0 reset failed
amdgpu: GPU reset begin!

amdgpu: GPU mode1 reset
amdgpu: GPU reset succeeded, trying to resume
amdgpu: VRAM is lost due to GPU reset!
amdgpu: GPU reset(1) succeeded!

The affected process was identified as sead::MainThrea, with a Presentation Th thread.

I will also attach a fresh kernel log from the Windows build running through Proton to check whether the same errors occur.

Additional information

Since the same GPU hang occurs with both the native Linux build and the Windows build through Proton, I suspect this may be related to Hookshot's rendering workload or GPU command submission.

I would appreciate any suggestions for further debugging.

hookshot_log.txt

hookshot-proton-kernel.log

hookshot-windows-build.log

## The same GPU crash also occurs with the Windows build running through Proton I previously experienced this exact issue with the native Linux build of Hookshot. I have now tested the Windows build running through Proton-CachyOS, and the same problem occurs again. This appears to be the same GPU hang and AMDGPU reset issue, not a different type of crash. ### System specifications - **OS:** CachyOS Linux - **CPU:** AMD Ryzen 5 8400F - **RAM:** 32 GB - **GPU:** AMD Radeon RX 6800 (Navi 21, 16 GB VRAM) - **Kernel:** `7.3.3-1-cachyos` - **GPU driver:** AMDGPU - **Mesa:** `26.2.6-1` - **Vulkan driver:** RADV (`26.2.6-1`) - **Compatibility layer:** `proton-cachyos-11.0` (build `20261015`) ### What happens I built the Windows version of Hookshot and launched it through Proton-CachyOS. During gameplay, the GPU hangs completely and both monitors lose their video signal. The AMDGPU driver then attempts to reset the GPU. The reset eventually succeeds, but the game does not recover. The same behavior was previously observed with the native Linux build of Hookshot. Other games work normally on this system, and I have not experienced similar GPU crashes outside Hookshot. ### Previous kernel log from the same issue During the previous crash with the native Linux build, the kernel reported: ```text refcount_t: underflow; use-after-free. WARNING: lib/refcount.c:28 at refcount_warn_saturate amdgpu_job_free amdgpu_cs_parser_fini amdgpu_cs_ioctl amdgpu: ring gfx_0.0.0 timeout amdgpu: Starting gfx_0.0.0 ring reset amdgpu: Ring gfx_0.0.0 reset failed amdgpu: GPU reset begin! amdgpu: GPU mode1 reset amdgpu: GPU reset succeeded, trying to resume amdgpu: VRAM is lost due to GPU reset! amdgpu: GPU reset(1) succeeded! ``` The affected process was identified as `sead::MainThrea`, with a `Presentation Th` thread. I will also attach a fresh kernel log from the Windows build running through Proton to check whether the same errors occur. ### Additional information Since the same GPU hang occurs with both the native Linux build and the Windows build through Proton, I suspect this may be related to Hookshot's rendering workload or GPU command submission. I would appreciate any suggestions for further debugging. [hookshot_log.txt](https://github.com/user-attachments/files/34626564/hookshot_log.txt) [hookshot-proton-kernel.log](https://github.com/user-attachments/files/34626643/hookshot-proton-kernel.log) [hookshot-windows-build.log](https://github.com/user-attachments/files/34626653/hookshot-windows-build.log)
zackfairccff-bot commented 2026-11-10 12:31:26 +00:00 (Migrated from github.com)

Steam Deck LCD — Hookshot v2.0.11: longer Kokiri gameplay with four workarounds, but severe overexposure and 19–23 FPS

Hi everyone,

Following up on my previous Steam Deck LCD reports, I managed to get significantly further into Kokiri Forest using four environment variables simultaneously.

System:

  • Steam Deck LCD
  • SteamOS 3.9.5
  • AMD Custom GPU 0405 — RADV VANGOGH
  • Hookshot v2.0.11, source "10f983ad"
  • Native Linux executable

Exact launch command:

RX_VK_NO_FOLLOW=1 RX_VK_KEEP_RETIRED=1 RX_VK_NO_MESH=1 RX_VK_SKIP_CODE=2c56dc1006942f74 ./hookshot

Gameplay results

  • Startup took longer than usual.
  • Successfully loaded Kokiri Forest.
  • I could move Link and the camera, explore the area and approach NPCs.
  • Gameplay lasted noticeably longer than my earlier attempts, although I did not measure the exact duration.
  • Observed performance: approximately 19–23 FPS.
  • The scene was severely washed out, with excessive white lighting or fog.
  • Some geometry also appeared to be missing.

This is the most substantial gameplay progress I have achieved with v2.0.11, but the rendering quality remains severely compromised.

Log observations

[hos host] hookshot v2.0.11 (source 10f983ad)
[hos host] vk: device 0: AMD Custom GPU 0405 (RADV VANGOGH), Vulkan 1.4
[hos host] vk: swapchain 1280x800, 4 images, mailbox

Unlike previous crashes, the captured log did not end with "VK_ERROR_DEVICE_LOST". Its final message was:

[hos host] display: window closed, exiting

This does not independently establish whether a GPU error occurred at kernel level.

Important limitations

Because all four variables were enabled together, I cannot determine which one improved stability.

I also cannot confirm that "RX_VK_SKIP_CODE" actually skipped the targeted shader in this build.

"RX_VK_NO_MESH=1" may contribute to missing geometry, while "RX_VK_KEEP_RETIRED=1" may increase memory pressure.

Questions

  1. Has anyone reproduced this extreme overexposure on RADV VANGOGH with mesh rendering disabled?
  2. Could the lighting corruption be related to missing mesh/task draws or incomplete shader lowering?
  3. Is there an updated workaround for the native mesh path that preserves visible geometry?
  4. Could the memory-management changes in v2.0.12 improve this specific configuration?

I have a gameplay recording, screenshot and full "hookshot_log.txt" available as supporting evidence.

My next comparison will use v2.0.12 with the same configuration to determine whether the new release changes performance, rendering or stability.

Thanks for your continued work on Steam Deck - compatibility.

Steam Deck LCD — Hookshot v2.0.11: longer Kokiri gameplay with four workarounds, but severe overexposure and 19–23 FPS Hi everyone, Following up on my previous Steam Deck LCD reports, I managed to get significantly further into Kokiri Forest using four environment variables simultaneously. System: - Steam Deck LCD - SteamOS 3.9.5 - AMD Custom GPU 0405 — RADV VANGOGH - Hookshot v2.0.11, source "10f983ad" - Native Linux executable Exact launch command: RX_VK_NO_FOLLOW=1 RX_VK_KEEP_RETIRED=1 RX_VK_NO_MESH=1 RX_VK_SKIP_CODE=2c56dc1006942f74 ./hookshot Gameplay results - Startup took longer than usual. - Successfully loaded Kokiri Forest. - I could move Link and the camera, explore the area and approach NPCs. - Gameplay lasted noticeably longer than my earlier attempts, although I did not measure the exact duration. - Observed performance: approximately 19–23 FPS. - The scene was severely washed out, with excessive white lighting or fog. - Some geometry also appeared to be missing. This is the most substantial gameplay progress I have achieved with v2.0.11, but the rendering quality remains severely compromised. Log observations [hos host] hookshot v2.0.11 (source 10f983ad) [hos host] vk: device 0: AMD Custom GPU 0405 (RADV VANGOGH), Vulkan 1.4 [hos host] vk: swapchain 1280x800, 4 images, mailbox Unlike previous crashes, the captured log did not end with "VK_ERROR_DEVICE_LOST". Its final message was: [hos host] display: window closed, exiting This does not independently establish whether a GPU error occurred at kernel level. Important limitations Because all four variables were enabled together, I cannot determine which one improved stability. I also cannot confirm that "RX_VK_SKIP_CODE" actually skipped the targeted shader in this build. "RX_VK_NO_MESH=1" may contribute to missing geometry, while "RX_VK_KEEP_RETIRED=1" may increase memory pressure. Questions 1. Has anyone reproduced this extreme overexposure on RADV VANGOGH with mesh rendering disabled? 2. Could the lighting corruption be related to missing mesh/task draws or incomplete shader lowering? 3. Is there an updated workaround for the native mesh path that preserves visible geometry? 4. Could the memory-management changes in v2.0.12 improve this specific configuration? I have a gameplay recording, screenshot and full "hookshot_log.txt" available as supporting evidence. My next comparison will use v2.0.12 with the same configuration to determine whether the new release changes performance, rendering or stability. Thanks for your continued work on Steam Deck - compatibility.
zackfairccff-bot commented 2026-11-10 13:06:10 +00:00 (Migrated from github.com)

Enviando IMG_20261109_230649.jpg …

Hi! I'm testing Hookshot on a Steam Deck LCD (AMD Van Gogh / RADV, SteamOS 3.9.5).

I've been experiencing GPU hangs, ring timeouts and severe rendering corruption with native mesh shaders enabled.

Using "RX_VK_NO_MESH=1" allows me to explore Kokiri Forest without the GPU resets seen in earlier tests, but causes extreme overexposure, flickering and missing geometry. These issues persist in v2.0.12.

I saw your investigation into potentially invalid primitive counts in RADV mesh shaders.

Do you think this Mesa/RADV issue could be related to the GPU hangs on Van Gogh, or does the evidence suggest a separate problem?

Has the proposed driver fix been tested with Hookshot on an actual Steam Deck?

I'd be interested in testing a validated fix once available. Thanks for investigating this!

![Enviando IMG_20261109_230649.jpg …]() Hi! I'm testing Hookshot on a Steam Deck LCD (AMD Van Gogh / RADV, SteamOS 3.9.5). I've been experiencing GPU hangs, ring timeouts and severe rendering corruption with native mesh shaders enabled. Using "RX_VK_NO_MESH=1" allows me to explore Kokiri Forest without the GPU resets seen in earlier tests, but causes extreme overexposure, flickering and missing geometry. These issues persist in v2.0.12. I saw your investigation into potentially invalid primitive counts in RADV mesh shaders. Do you think this Mesa/RADV issue could be related to the GPU hangs on Van Gogh, or does the evidence suggest a separate problem? Has the proposed driver fix been tested with Hookshot on an actual Steam Deck? I'd be interested in testing a validated fix once available. Thanks for investigating this!
KewinBR commented 2026-11-10 13:20:28 +00:00 (Migrated from github.com)

Steam Deck LCD (Jupiter, RADV VANGOGH, driver 0x6801063), SteamOS 3.8.28, kernel 6.18.50-valve2. v2.0.12: system RAM and swap run out about 3 minutes after loading a save next to the castle, and the Deck freezes.

On v2.0.11 the same save lasted about 14 minutes in Hyrule Field before the same thing happened. That is what made us measure it.

Build. v2.0.12 from source (hookshot_vk.so rebuilt in an Ubuntu 22.04 container like the CI), with a few renderer changes for the Deck:

  • RX_VK_MESH_NOCULL=2c56dc1006942f74 on by default;
  • RX_VK_WAIT_GPU=-1, which waits for the frame's own GPU work at present (without it, the lighting flashes on this UMA device);
  • RX_VK_VRAM_MB taking priority over the preset, the same idea as #1376;
  • marker report and flash counter diagnostics.

None of these touch texture or render-target lifetimes, but I have not ruled them out. Settings: HOS_ASPECT=1.6, resolution 75%, frame generation on, RX_VK_VRAM_MB=2048, RX_VK_TEX_MAX_MB=128, RX_VK_TEX_MAX_DIM=1024, RX_VK_MIRROR_MB=256, RX_VK_MESH_OPT=1, RX_VK_CHECKPOINTS=1.

What the memory did. Our launcher logs /proc/meminfo and the game's /proc/<pid>/status every 15 s. The machine has 15 GB of RAM and 8.6 GB of swap. The player walked from the save into the castle area:

10:03:46 MemAvailable 12148 MB  SwapFree 8319 MB  game VmRSS   18 MB  VmSwap    0 MB
10:04:17 MemAvailable  7195 MB  SwapFree 8319 MB  game VmRSS 5015 MB  VmSwap    0 MB
10:04:47 MemAvailable   983 MB  SwapFree 8109 MB  game VmRSS 8918 MB  VmSwap    0 MB
10:05:17 MemAvailable   574 MB  SwapFree 6149 MB  game VmRSS 6896 MB  VmSwap  485 MB
10:05:48 MemAvailable   796 MB  SwapFree 3393 MB  game VmRSS 4263 MB  VmSwap  978 MB
10:06:49 MemAvailable   390 MB  SwapFree  679 MB  game VmRSS 3280 MB  VmSwap 1280 MB

Once RAM is full, about 7.4 GB of swap is used in two minutes, while the game's own RSS falls and only 1.3 GB of the game goes to swap. Whatever grows is outside the process RSS. My guess is GPU allocations in GTT, but I did not log mem_info_gtt_used this time. The renderer's own counters stayed modest:

vk: VRAM: 3407 MB used of 5434 MB allowed (539 MB of it free in the blocks); textures 1802 MB (budget 2048 MB), 1660 textures
vk: system heap 3145 of 3072 MB: 24 idle imports given back (864 MB); 24 (864 MB) in all

The log also has many re-uploaded (its memory was written) lines for 2048x2048 textures (12 MB each) at that point.

Standing still, it does not happen. A headless run of the same build from the same save, standing just outside the castle for 12 minutes, held 31 fps with no GPU stalls. RSS went from 7.6 to 8.1 GB, and VRAM sat at 2.4 GB with 1.4 GB of textures. So it is tied to going into the castle area, not to time.

When it happens, the whole Deck stops responding: earlyoom logs "memory situation has recovered while selecting victim" and kills nothing. Even after our launcher killed the game at 1.2 GB free, the Steam client was already swapped out and stayed on a black screen until a reboot.

The player also reported that v2.0.12 has a different lighting flicker than v2.0.11 and a "swimming pixels" look. I have no measurement for either yet.

I can rerun with mem_info_gtt_used and mem_info_vram_used logged, or with any switch that helps narrow it down (render target pool off, upload budget, etc.).

Steam Deck LCD (Jupiter, RADV VANGOGH, driver 0x6801063), SteamOS 3.8.28, kernel 6.18.50-valve2. **v2.0.12: system RAM and swap run out about 3 minutes after loading a save next to the castle, and the Deck freezes.** On v2.0.11 the same save lasted about 14 minutes in Hyrule Field before the same thing happened. That is what made us measure it. **Build.** v2.0.12 from source (`hookshot_vk.so` rebuilt in an Ubuntu 22.04 container like the CI), with a few renderer changes for the Deck: - `RX_VK_MESH_NOCULL=2c56dc1006942f74` on by default; - `RX_VK_WAIT_GPU=-1`, which waits for the frame's own GPU work at present (without it, the lighting flashes on this UMA device); - `RX_VK_VRAM_MB` taking priority over the preset, the same idea as #1376; - marker report and flash counter diagnostics. None of these touch texture or render-target lifetimes, but I have not ruled them out. Settings: `HOS_ASPECT=1.6`, resolution 75%, frame generation on, `RX_VK_VRAM_MB=2048`, `RX_VK_TEX_MAX_MB=128`, `RX_VK_TEX_MAX_DIM=1024`, `RX_VK_MIRROR_MB=256`, `RX_VK_MESH_OPT=1`, `RX_VK_CHECKPOINTS=1`. **What the memory did.** Our launcher logs `/proc/meminfo` and the game's `/proc/<pid>/status` every 15 s. The machine has 15 GB of RAM and 8.6 GB of swap. The player walked from the save into the castle area: ``` 10:03:46 MemAvailable 12148 MB SwapFree 8319 MB game VmRSS 18 MB VmSwap 0 MB 10:04:17 MemAvailable 7195 MB SwapFree 8319 MB game VmRSS 5015 MB VmSwap 0 MB 10:04:47 MemAvailable 983 MB SwapFree 8109 MB game VmRSS 8918 MB VmSwap 0 MB 10:05:17 MemAvailable 574 MB SwapFree 6149 MB game VmRSS 6896 MB VmSwap 485 MB 10:05:48 MemAvailable 796 MB SwapFree 3393 MB game VmRSS 4263 MB VmSwap 978 MB 10:06:49 MemAvailable 390 MB SwapFree 679 MB game VmRSS 3280 MB VmSwap 1280 MB ``` Once RAM is full, about 7.4 GB of swap is used in two minutes, while the game's own RSS falls and only 1.3 GB of the game goes to swap. Whatever grows is outside the process RSS. My guess is GPU allocations in GTT, but I did not log `mem_info_gtt_used` this time. The renderer's own counters stayed modest: ``` vk: VRAM: 3407 MB used of 5434 MB allowed (539 MB of it free in the blocks); textures 1802 MB (budget 2048 MB), 1660 textures vk: system heap 3145 of 3072 MB: 24 idle imports given back (864 MB); 24 (864 MB) in all ``` The log also has many `re-uploaded (its memory was written)` lines for 2048x2048 textures (12 MB each) at that point. **Standing still, it does not happen.** A headless run of the same build from the same save, standing just outside the castle for 12 minutes, held 31 fps with no GPU stalls. RSS went from 7.6 to 8.1 GB, and VRAM sat at 2.4 GB with 1.4 GB of textures. So it is tied to going into the castle area, not to time. When it happens, the whole Deck stops responding: earlyoom logs "memory situation has recovered while selecting victim" and kills nothing. Even after our launcher killed the game at 1.2 GB free, the Steam client was already swapped out and stayed on a black screen until a reboot. The player also reported that v2.0.12 has a different lighting flicker than v2.0.11 and a "swimming pixels" look. I have no measurement for either yet. I can rerun with `mem_info_gtt_used` and `mem_info_vram_used` logged, or with any switch that helps narrow it down (render target pool off, upload budget, etc.).
Feralnet commented 2026-11-10 13:23:32 +00:00 (Migrated from github.com)

Building from source on Arch (CachyOS): scripts/linux/deps.sh assumes Debian paths

Minor, only affects building the deps yourself (the AppImage is fine). Two spots:

  • Tk step (line ~125): cp -L /usr/lib/x86_64-linux-gnu/libXft.so.2 /usr/lib/x86_64-linux-gnu/libXrender.so.1 fails on Arch, Fedora and others, where the libs live in /usr/lib or /usr/lib64. Because of set -e, FFmpeg, SDL2 and the CPM headers are never built either.
  • Licenses step: /usr/share/doc/libxft2/copyright and /usr/share/doc/libxrender1/copyright are Debian-only. Arch has them at /usr/share/licenses/libxft/COPYING and /usr/share/licenses/libxrender/COPYING.

Workaround I'm using for the first one:

for x in libXft.so.2 libXrender.so.1; do
    for d in /usr/lib/x86_64-linux-gnu /usr/lib64 /usr/lib; do
        [ -e "$d/$x" ] && { cp -L "$d/$x" "$DEPS/tk/"; break; }
    done
    [ -e "$DEPS/tk/$x" ] || { echo "$x was not found"; exit 1; }
done

Also needs nasm installed for dav1d (not mentioned in the script's header). After that, make_game.py builds main with DLSS fine on an RTX 4070 SUPER (driver 615.78.08).

**Building from source on Arch (CachyOS): `scripts/linux/deps.sh` assumes Debian paths** Minor, only affects building the deps yourself (the AppImage is fine). Two spots: - Tk step (line ~125): `cp -L /usr/lib/x86_64-linux-gnu/libXft.so.2 /usr/lib/x86_64-linux-gnu/libXrender.so.1` fails on Arch, Fedora and others, where the libs live in `/usr/lib` or `/usr/lib64`. Because of `set -e`, FFmpeg, SDL2 and the CPM headers are never built either. - Licenses step: `/usr/share/doc/libxft2/copyright` and `/usr/share/doc/libxrender1/copyright` are Debian-only. Arch has them at `/usr/share/licenses/libxft/COPYING` and `/usr/share/licenses/libxrender/COPYING`. Workaround I'm using for the first one: ```sh for x in libXft.so.2 libXrender.so.1; do for d in /usr/lib/x86_64-linux-gnu /usr/lib64 /usr/lib; do [ -e "$d/$x" ] && { cp -L "$d/$x" "$DEPS/tk/"; break; } done [ -e "$DEPS/tk/$x" ] || { echo "$x was not found"; exit 1; } done ``` Also needs `nasm` installed for dav1d (not mentioned in the script's header). After that, `make_game.py` builds main with DLSS fine on an RTX 4070 SUPER (driver 615.78.08).
zackfairccff-bot commented 2026-11-10 13:24:34 +00:00 (Migrated from github.com)

Steam Deck LCD / RADV VANGOGH — v2.0.12: MESH_NOCULL confirmed active, but GPU still hangs and resets

Hi everyone,

Following up on my previous Steam Deck LCD reports and the "RX_VK_MESH_NOCULL" workaround discussed in PR #1300.

System: Steam Deck LCD, SteamOS 3.9.5, AMD Custom GPU 0405 (RADV VANGOGH), Vulkan 1.4.

Hookshot: v2.0.12, source "cfa1aebf".

Exact launch command:

RX_VK_MESH_NOCULL=2c56dc1006942f74 ./hookshot

Result

Unfortunately, the GPU still hung and reset.

Importantly, the workaround was successfully applied. The application log contains this message eight times:

vk: task code 2c56dc1006942f74: culling off, every meshlet drawn (RX_VK_MESH_NOCULL)

Application log

vk: texture 0x1147bf6000 12288x12288x1 x1 levels 1 NVN 0x32 -> vk 124

vk: slow upload 188.5 ms: #257 ... 12288x12288x1 ... 294912 of 294912 KB

vi: 5373 frames presented (20.6 fps over the last 6.9 s)

vk: slow submit: 5117.1 ms: slot wait 5116.4

vk: batched submit 5584 failed (-4)

vk: device lost: reading the fault info

vk: FATAL: the GPU device was lost (VK_ERROR_DEVICE_LOST)

SteamOS kernel journal

At 10:17:56 on November 10:

amdgpu: ring gfx_0.0.0 timeout, signaled seq=172881, emitted seq=172885

amdgpu: Process hookshot pid 12047 thread sead::MainThrea pid 12052

amdgpu: Ring gfx_0.0.0 reset failed

amdgpu: MODE2 reset

amdgpu: GPU reset(1) succeeded!

The 12288×12288 depth target is interesting because it appears in other Steam Deck reports, although its presence does not establish that it caused the crash.

Comparison with previous tests

Using "RX_VK_NO_MESH=1" together with other workarounds, I previously managed to explore Kokiri Forest at approximately 19–23 FPS. However, the rendering suffered from extreme overexposure, severe flickering and missing geometry.

With "RX_VK_MESH_NOCULL" alone, the shader modification was confirmed active, but a GPU reset still occurred.

Could there be another task/mesh shader hang path on RADV VANGOGH beyond the culling loop addressed by MESH_NOCULL?

Is there a targeted patch or diagnostic test that could help investigate this without repeatedly triggering GPU resets?

I have the complete application log and kernel journal available.

Thanks for your continued work on Steam Deck compatibility!

Steam Deck LCD / RADV VANGOGH — v2.0.12: MESH_NOCULL confirmed active, but GPU still hangs and resets Hi everyone, Following up on my previous Steam Deck LCD reports and the "RX_VK_MESH_NOCULL" workaround discussed in PR #1300. System: Steam Deck LCD, SteamOS 3.9.5, AMD Custom GPU 0405 (RADV VANGOGH), Vulkan 1.4. Hookshot: v2.0.12, source "cfa1aebf". Exact launch command: RX_VK_MESH_NOCULL=2c56dc1006942f74 ./hookshot Result Unfortunately, the GPU still hung and reset. Importantly, the workaround was successfully applied. The application log contains this message eight times: vk: task code 2c56dc1006942f74: culling off, every meshlet drawn (RX_VK_MESH_NOCULL) Application log vk: texture 0x1147bf6000 12288x12288x1 x1 levels 1 NVN 0x32 -> vk 124 vk: slow upload 188.5 ms: #257 ... 12288x12288x1 ... 294912 of 294912 KB vi: 5373 frames presented (20.6 fps over the last 6.9 s) vk: slow submit: 5117.1 ms: slot wait 5116.4 vk: batched submit 5584 failed (-4) vk: device lost: reading the fault info vk: FATAL: the GPU device was lost (VK_ERROR_DEVICE_LOST) SteamOS kernel journal At 10:17:56 on November 10: amdgpu: ring gfx_0.0.0 timeout, signaled seq=172881, emitted seq=172885 amdgpu: Process hookshot pid 12047 thread sead::MainThrea pid 12052 amdgpu: Ring gfx_0.0.0 reset failed amdgpu: MODE2 reset amdgpu: GPU reset(1) succeeded! The 12288×12288 depth target is interesting because it appears in other Steam Deck reports, although its presence does not establish that it caused the crash. Comparison with previous tests Using "RX_VK_NO_MESH=1" together with other workarounds, I previously managed to explore Kokiri Forest at approximately 19–23 FPS. However, the rendering suffered from extreme overexposure, severe flickering and missing geometry. With "RX_VK_MESH_NOCULL" alone, the shader modification was confirmed active, but a GPU reset still occurred. Could there be another task/mesh shader hang path on RADV VANGOGH beyond the culling loop addressed by MESH_NOCULL? Is there a targeted patch or diagnostic test that could help investigate this without repeatedly triggering GPU resets? I have the complete application log and kernel journal available. Thanks for your continued work on Steam Deck compatibility!
DrFumanxu commented 2026-11-10 13:47:09 +00:00 (Migrated from github.com)

Steam Deck OLED: GPU hang in Hookshot v2.0.12

System

  • Steam Deck OLED (Galileo)
  • SteamOS, kernel 7.2.7-valve2-2-neptune-72-g31504582a073
  • RADV / Mesa 26.2.0-devel, AMD Custom GPU (VANGOGH)
  • Hookshot v2.0.12, source cfa1aebf

Test configuration

  • Handheld profile enabled
  • Tested at multiple output resolutions; the same crash occurs at each
  • Frame generation: 2x; frame pacing: On
  • hookshot_env.txt: RX_VK_MESH_NOCULL=2c56dc1006942f74

The log confirmed that MESH_NOCULL was active: it reported culling off, every meshlet drawn for task code 2c56dc1006942f74.

Failure
Hookshot slowed to 2.4 fps, then reported batched submit 52273 failed (-4) and VK_ERROR_DEVICE_LOST. At 14:23:37 CET, the kernel logged a gfx_0.0.0 timeout; the graphics-ring reset failed and SteamOS performed a MODE2 GPU reset. At 14:23:49, the kernel also logged a comp_1.1.0 timeout.

The same GPU hang reproduces at different resolutions despite the documented MESH_NOCULL workaround being active.

Always hangs in the same point of the intro, before the deku tree animation after the Link's dream.

### Steam Deck OLED: GPU hang in Hookshot v2.0.12 **System** - Steam Deck OLED (Galileo) - SteamOS, kernel `7.2.7-valve2-2-neptune-72-g31504582a073` - RADV / Mesa 26.2.0-devel, AMD Custom GPU (VANGOGH) - Hookshot v2.0.12, source `cfa1aebf` **Test configuration** - Handheld profile enabled - Tested at multiple output resolutions; the same crash occurs at each - Frame generation: 2x; frame pacing: On - `hookshot_env.txt`: `RX_VK_MESH_NOCULL=2c56dc1006942f74` The log confirmed that MESH_NOCULL was active: it reported `culling off, every meshlet drawn` for task code `2c56dc1006942f74`. **Failure** Hookshot slowed to 2.4 fps, then reported `batched submit 52273 failed (-4)` and `VK_ERROR_DEVICE_LOST`. At 14:23:37 CET, the kernel logged a `gfx_0.0.0 timeout`; the graphics-ring reset failed and SteamOS performed a MODE2 GPU reset. At 14:23:49, the kernel also logged a `comp_1.1.0 timeout`. The same GPU hang reproduces at different resolutions despite the documented MESH_NOCULL workaround being active. Always hangs in the same point of the intro, before the deku tree animation after the Link's dream.
eats7 commented 2026-11-10 14:30:02 +00:00 (Migrated from github.com)

Steam Deck OLED: GPU hang in Hookshot v2.0.12

System

  • Steam Deck OLED (Galileo)
  • SteamOS, kernel 7.2.7-valve2-2-neptune-72-g31504582a073
  • RADV / Mesa 26.2.0-devel, AMD Custom GPU (VANGOGH)
  • Hookshot v2.0.12, source cfa1aebf

Test configuration

  • Handheld profile enabled
  • Tested at multiple output resolutions; the same crash occurs at each
  • Frame generation: 2x; frame pacing: On
  • hookshot_env.txt: RX_VK_MESH_NOCULL=2c56dc1006942f74

The log confirmed that MESH_NOCULL was active: it reported culling off, every meshlet drawn for task code 2c56dc1006942f74.

Failure Hookshot slowed to 2.4 fps, then reported batched submit 52273 failed (-4) and VK_ERROR_DEVICE_LOST. At 14:23:37 CET, the kernel logged a gfx_0.0.0 timeout; the graphics-ring reset failed and SteamOS performed a MODE2 GPU reset. At 14:23:49, the kernel also logged a comp_1.1.0 timeout.

The same GPU hang reproduces at different resolutions despite the documented MESH_NOCULL workaround being active.

Always hangs in the same point of the intro, before the deku tree animation after the Link's dream.

Can confirm exact same issue here on my OLED

> ### Steam Deck OLED: GPU hang in Hookshot v2.0.12 > **System** > > * Steam Deck OLED (Galileo) > * SteamOS, kernel `7.2.7-valve2-2-neptune-72-g31504582a073` > * RADV / Mesa 26.2.0-devel, AMD Custom GPU (VANGOGH) > * Hookshot v2.0.12, source `cfa1aebf` > > **Test configuration** > > * Handheld profile enabled > * Tested at multiple output resolutions; the same crash occurs at each > * Frame generation: 2x; frame pacing: On > * `hookshot_env.txt`: `RX_VK_MESH_NOCULL=2c56dc1006942f74` > > The log confirmed that MESH_NOCULL was active: it reported `culling off, every meshlet drawn` for task code `2c56dc1006942f74`. > > **Failure** Hookshot slowed to 2.4 fps, then reported `batched submit 52273 failed (-4)` and `VK_ERROR_DEVICE_LOST`. At 14:23:37 CET, the kernel logged a `gfx_0.0.0 timeout`; the graphics-ring reset failed and SteamOS performed a MODE2 GPU reset. At 14:23:49, the kernel also logged a `comp_1.1.0 timeout`. > > The same GPU hang reproduces at different resolutions despite the documented MESH_NOCULL workaround being active. > > Always hangs in the same point of the intro, before the deku tree animation after the Link's dream. Can confirm exact same issue here on my OLED
DrFumanxu commented 2026-11-10 14:59:25 +00:00 (Migrated from github.com)

Tested 2.0.13 same problem

Tested 2.0.13 same problem
RrrrobertB1992 commented 2026-11-10 15:07:24 +00:00 (Migrated from github.com)

System Information

• OS: Fedora 44 KDE
• GPU: AMD Radeon RX 6650 XT (Mesa / RADV driver)
• RAM: 32 GB DDR4
• Hookshot Version: v2.0.12 Linux AppImage
• Game Dump: 0400486024DEC000 (v131072) with transferred save data from Lichii emulator

Bug Description

The game crashes to a black screen with brief pink visual artifacts right during the spinning Triforce loading screen. This happens regardless of the save location: loading a save file that is currently placed right inside the door of the village/death valley area crashes immediately, and older saves (such as one located in Hyrule Field) crash in the exact same manner. The issue triggers a hard Vulkan device reset on Linux via the open-source RADV driver.

Relevant Log Output

[hos host] vk: slow upload 108.1 ms: #377 0x10a5b02c00 1365x1365x1 x90 levels 11 NVN 0x80 ASTC (BC3), 57825 of 57825 KB
[hos host] vk: slow submit: 164.1 ms: draw 161.4 descriptors 153.6 texture lookups 150.2 uploads 149.8 programs 2.5 commands 4.4
[hos host] vk: texture #774 at 0x100019d2200 beside #632: 557x557x1 x1 levels 1 layout 0x4 class 0x1007e NVN 0x34 target 1, the other 559x559x1 x1 levels 1 layout 0x4 class 0x1007e NVN 0x34 target 1 (rendered)
[hos host] vk: in play: graphics 00b00daa74d50fb9 (025629ee7284ba12 775462a77f63dc55), inputs 0000000000000000, outputs 00 00 00 00 00 00 00 00, 1 other variants
[hos Presentation Thread] vk: a frame's uploads took 160 ms: ASTC on the GPU 46 (74.5 MB, 141 ms); on the CPU 25 (10.4 MB, 19 ms); [1365x1365 x90 NVN 0x80 ASTC on the GPU 56.5 MB 108 ms] [1536x1536 x1 NVN 0x7b ASTC on the GPU 2.0 MB 4 ms] [512x512 x1 NVN 0x29 on the CPU 2.0 MB 4 ms]
[hos Presentation Thread] vk: 97 new ASTC textures left for a later frame (this frame's uploads took their budget; 258 so far)
[hos sead::MainThread] vk: a capture's wait for write-back 8429 timed out (done 8418)
[hos sead::MainThread] vk: slow submit: 252.8 ms: memory sync 252.6
[hos host] vk: slow submit: 1013.5 ms: slot wait 1012.8
[hos host] vk: upload over a drawn image: #628 0x10000829c00 1000x1000x1 x3 NVN 0x32 at present 1204 (texture frame 1205), finalized, 6144 KB dirty in 1 ranges
[hos host] vk: texture 0x10000829c00 1000x1000x1 x3 levels 1 NVN 0x32 (6144 KB of storage) re-uploaded (its memory was written; flags 0x8): whole, 6144 KB of it, over what the GPU wrote (finalized since)
[hos host] vk: upload over a drawn image: #627 0x100007c9a00 192x108x1 x1 NVN 0x2e at present 1204 (texture frame 1205), finalized, 384 KB dirty in 1 ranges
[hos host] vk: texture 0x100007c9a00 192x108x1 x1 levels 1 NVN 0x2e (384 KB of storage) re-uploaded (its memory was written; flags 0x8): whole, 384 KB of it, over what the GPU wrote (finalized since)
[hos host] vk: slow upload 45.8 ms: #580 0x10d80c2200 683x683x1 x1 levels 10 NVN 0x8c ASTC (BC3), 271 of 271 KB
[hos sead::MainThread] nvn: GPU waits in 5 s: 1 sync waits (2415 ms), 0 polls timed out (0 ms), 0 queue finishes (0 ms)
radv/amdgpu: The CS has been cancelled because the context is lost. This context is innocent.
[hos ModuleSystemWorker3] vk: batched submit 1515 failed (-4)
[hos ModuleSystemWorker3] vk: device lost: reading the fault info (RX_VK_CHECKPOINTS=1 for markers)
[hos ModuleSystemWorker3] vk: FATAL: the GPU device was lost (VK_ERROR_DEVICE_LOST): the driver stopped or reset the GPU, and
nothing sent to it runs any more (on Linux, dmesg or journalctl -k around this time names the reset)
vk: FATAL: the GPU device was lost (VK_ERROR_DEVICE_LOST): the driver stopped or reset the GPU, and nothing sent to it runs any more (on Linux, dmesg or journalctl -k around this time names the reset)

Notes

• Confirmed that deleting the emulator-side options.sav to force a local geometry reset did not resolve the crash.
• Adjusting rendering configurations down to native 1080p inside the F1 settings menu did not bypass the loop.
• The driver explicitly reports This context is innocent, confirming an engine-side texture feedback loop/allocation allocation panic on boot rather than a physical hardware fault or system error.

### System Information • OS: Fedora 44 KDE • GPU: AMD Radeon RX 6650 XT (Mesa / RADV driver) • RAM: 32 GB DDR4 • Hookshot Version: v2.0.12 Linux AppImage • Game Dump: 0400486024DEC000 (v131072) with transferred save data from Lichii emulator ### Bug Description The game crashes to a black screen with brief pink visual artifacts right during the spinning Triforce loading screen. This happens regardless of the save location: loading a save file that is currently placed right inside the door of the village/death valley area crashes immediately, and older saves (such as one located in Hyrule Field) crash in the exact same manner. The issue triggers a hard Vulkan device reset on Linux via the open-source RADV driver. **Relevant Log Output** ``` [hos host] vk: slow upload 108.1 ms: #377 0x10a5b02c00 1365x1365x1 x90 levels 11 NVN 0x80 ASTC (BC3), 57825 of 57825 KB [hos host] vk: slow submit: 164.1 ms: draw 161.4 descriptors 153.6 texture lookups 150.2 uploads 149.8 programs 2.5 commands 4.4 [hos host] vk: texture #774 at 0x100019d2200 beside #632: 557x557x1 x1 levels 1 layout 0x4 class 0x1007e NVN 0x34 target 1, the other 559x559x1 x1 levels 1 layout 0x4 class 0x1007e NVN 0x34 target 1 (rendered) [hos host] vk: in play: graphics 00b00daa74d50fb9 (025629ee7284ba12 775462a77f63dc55), inputs 0000000000000000, outputs 00 00 00 00 00 00 00 00, 1 other variants [hos Presentation Thread] vk: a frame's uploads took 160 ms: ASTC on the GPU 46 (74.5 MB, 141 ms); on the CPU 25 (10.4 MB, 19 ms); [1365x1365 x90 NVN 0x80 ASTC on the GPU 56.5 MB 108 ms] [1536x1536 x1 NVN 0x7b ASTC on the GPU 2.0 MB 4 ms] [512x512 x1 NVN 0x29 on the CPU 2.0 MB 4 ms] [hos Presentation Thread] vk: 97 new ASTC textures left for a later frame (this frame's uploads took their budget; 258 so far) [hos sead::MainThread] vk: a capture's wait for write-back 8429 timed out (done 8418) [hos sead::MainThread] vk: slow submit: 252.8 ms: memory sync 252.6 [hos host] vk: slow submit: 1013.5 ms: slot wait 1012.8 [hos host] vk: upload over a drawn image: #628 0x10000829c00 1000x1000x1 x3 NVN 0x32 at present 1204 (texture frame 1205), finalized, 6144 KB dirty in 1 ranges [hos host] vk: texture 0x10000829c00 1000x1000x1 x3 levels 1 NVN 0x32 (6144 KB of storage) re-uploaded (its memory was written; flags 0x8): whole, 6144 KB of it, over what the GPU wrote (finalized since) [hos host] vk: upload over a drawn image: #627 0x100007c9a00 192x108x1 x1 NVN 0x2e at present 1204 (texture frame 1205), finalized, 384 KB dirty in 1 ranges [hos host] vk: texture 0x100007c9a00 192x108x1 x1 levels 1 NVN 0x2e (384 KB of storage) re-uploaded (its memory was written; flags 0x8): whole, 384 KB of it, over what the GPU wrote (finalized since) [hos host] vk: slow upload 45.8 ms: #580 0x10d80c2200 683x683x1 x1 levels 10 NVN 0x8c ASTC (BC3), 271 of 271 KB [hos sead::MainThread] nvn: GPU waits in 5 s: 1 sync waits (2415 ms), 0 polls timed out (0 ms), 0 queue finishes (0 ms) radv/amdgpu: The CS has been cancelled because the context is lost. This context is innocent. [hos ModuleSystemWorker3] vk: batched submit 1515 failed (-4) [hos ModuleSystemWorker3] vk: device lost: reading the fault info (RX_VK_CHECKPOINTS=1 for markers) [hos ModuleSystemWorker3] vk: FATAL: the GPU device was lost (VK_ERROR_DEVICE_LOST): the driver stopped or reset the GPU, and nothing sent to it runs any more (on Linux, dmesg or journalctl -k around this time names the reset) vk: FATAL: the GPU device was lost (VK_ERROR_DEVICE_LOST): the driver stopped or reset the GPU, and nothing sent to it runs any more (on Linux, dmesg or journalctl -k around this time names the reset) ``` ### Notes • Confirmed that deleting the emulator-side options.sav to force a local geometry reset did not resolve the crash. • Adjusting rendering configurations down to native 1080p inside the F1 settings menu did not bypass the loop. • The driver explicitly reports This context is innocent, confirming an engine-side texture feedback loop/allocation allocation panic on boot rather than a physical hardware fault or system error.
Alexatre commented 2026-11-10 15:08:55 +00:00 (Migrated from github.com)

Same card here: RX 6800 XT (RDNA 2), Linux, RADV (Mesa 26.2.6), Hookshot v2.0.13.

Device lost entering gameplay; always reproducible from the same save, at the same point (frame ~913–953, same marker sequence ending at an upload of texture 109f1bbc00).

What I tried, all with RX_VK_CHECKPOINTS=1:

  • RX_VK_MESH_NOCULL=2c56dc1006942f74 with RX_VK_NO_PROGRAM_CACHE=1: the log confirms task code 2c56dc1006942f74: culling off, every meshlet drawn (8 times), still hangs at the same point. So on this card it is not the culling loop from #817.
  • Kernel 7.3.1-cachyos and 6.18.60 LTS: both hang.
  • GPU at stock clocks (CoreCtrl/LACT off): hangs.
  • Earlier: RX_VK_WB_DIFF=0, RX_VK_BATCH=0, RX_VK_ASTC_CPU=1, RX_VK_SKIP_CODE=2c56dc1006942f74: all hang (the marker position moves).
  • RX_VK_FORCE_MESH_FALLBACK=1: no hang, but missing/broken geometry.

journalctl shows some of the hangs on the compute ring (ring comp_1.2.0 timeout), which is where RADV runs task shaders, so the gfx-ring markers may only show what the gfx ring was waiting on.
The same game hangs the same way in CheezyEmu and Fritchii (fixed by EDEN_NX2_NO_MESH=1 there), while Windows with the AMD driver works.
So this looks like task/mesh execution on RDNA 2 + RADV rather than one specific program.

Logs attached (NOCULL run and the run without it).

hookshot_env.txt
hookshot_log.4.txt

Same card here: RX 6800 XT (RDNA 2), Linux, RADV (Mesa 26.2.6), Hookshot v2.0.13. Device lost entering gameplay; always reproducible from the same save, at the same point (frame ~913–953, same marker sequence ending at an upload of texture 109f1bbc00). What I tried, all with RX_VK_CHECKPOINTS=1: - RX_VK_MESH_NOCULL=2c56dc1006942f74 with RX_VK_NO_PROGRAM_CACHE=1: the log confirms `task code 2c56dc1006942f74: culling off, every meshlet drawn` (8 times), still hangs at the same point. So on this card it is not the culling loop from #817. - Kernel 7.3.1-cachyos and 6.18.60 LTS: both hang. - GPU at stock clocks (CoreCtrl/LACT off): hangs. - Earlier: RX_VK_WB_DIFF=0, RX_VK_BATCH=0, RX_VK_ASTC_CPU=1, RX_VK_SKIP_CODE=2c56dc1006942f74: all hang (the marker position moves). - RX_VK_FORCE_MESH_FALLBACK=1: no hang, but missing/broken geometry. journalctl shows some of the hangs on the compute ring (`ring comp_1.2.0 timeout`), which is where RADV runs task shaders, so the gfx-ring markers may only show what the gfx ring was waiting on. The same game hangs the same way in CheezyEmu and Fritchii (fixed by EDEN_NX2_NO_MESH=1 there), while Windows with the AMD driver works. So this looks like task/mesh execution on RDNA 2 + RADV rather than one specific program. Logs attached (NOCULL run and the run without it). [hookshot_env.txt](https://github.com/user-attachments/files/34636250/hookshot_env.txt) [hookshot_log.4.txt](https://github.com/user-attachments/files/34636249/hookshot_log.4.txt)
addisonbair commented 2026-11-10 15:14:34 +00:00 (Migrated from github.com)

Steam Deck OLED, stock SteamOS: neither Deck workaround stops the hang on v2.0.11; RX_VK_NO_MESH=1 gets through

  • Steam Deck OLED (Galileo), SteamOS 3.9.5 (20261023.100), kernel 7.2.7-valve2-2-neptune, Mesa 26.2.0-devel (git-5c65d4fc31)
  • v2.0.11, official Linux AppImage, started from Steam in Game Mode, HOS_HANDHELD=1, shaders prepared with --prepare-shaders first
Setting Result
RX_VK_MESH_NOCULL=2c56dc1006942f74 Hang as the intro cinematic ends
RX_VK_SKIP_CODE=2c56dc1006942f74 The skip engages (10 programs left out), then the same hang at the same point
RX_VK_SKIP_CODE + RX_VK_LOW_SPEC=1 Hang within seconds of loading a save made outside Link's house
RX_VK_NO_MESH=1 No hang: through the house, the door and the village for several minutes

Each hang has the same kernel signature:

ring gfx_0.0.0 timeout, signaled seq=N, emitted seq=N+2..4
Process hookshot ... thread sead::MainThrea   (LOW_SPEC run: thread OptimizeChangeB)
Ring gfx_0.0.0 reset failed
MODE2 reset

The LOW_SPEC run also had ring comp_1.1.0 timeout 12 s later.

One possible reason for the difference between SteamOS and CachyOS Decks: SteamOS boots with amdgpu.lockup_timeout=5000,10000,10000,5000. That gives the gfx ring 5 s, against the kernel default of 10 s. hardicd's trace in #817 has the task shader still running at 3, 6 and 9 s. A pass that finishes within 10 s would show as a long stall under the default and as a reset here. I haven't tested this with a raised timeout. For reference, this Deck has 1 GiB of VRAM and 8 GiB of GTT.

NO_MESH frame rates (vk: ... presents lines):

Where Draws per frame fps GPU-bound wait
Link's house ~650 25-26 0.3 ms
Porch, overlooking the village ~2,100 18-19 4 ms
The village pan ~2,500 14-17 8-9 ms

In play there is heavy flicker and specks on the fallback path. #1509 and #1513 look like they cover this.

A note on testing cost: here the program cache survived the resets (46517 program keys kept on the next start). It was rebuilt only when a RX_VK_* switch changed the programs.

As a workaround for the intro, a save made on another PC (where the game runs) loads on the Deck without changes. So each retest takes about a minute instead of the whole intro.

Happy to test a build or a switch on this Deck.

**Steam Deck OLED, stock SteamOS: neither Deck workaround stops the hang on v2.0.11; `RX_VK_NO_MESH=1` gets through** - Steam Deck OLED (Galileo), SteamOS 3.9.5 (20261023.100), kernel `7.2.7-valve2-2-neptune`, Mesa `26.2.0-devel (git-5c65d4fc31)` - v2.0.11, official Linux AppImage, started from Steam in Game Mode, `HOS_HANDHELD=1`, shaders prepared with `--prepare-shaders` first | Setting | Result | |---|---| | `RX_VK_MESH_NOCULL=2c56dc1006942f74` | Hang as the intro cinematic ends | | `RX_VK_SKIP_CODE=2c56dc1006942f74` | The skip engages (10 programs left out), then the same hang at the same point | | `RX_VK_SKIP_CODE` + `RX_VK_LOW_SPEC=1` | Hang within seconds of loading a save made outside Link's house | | `RX_VK_NO_MESH=1` | No hang: through the house, the door and the village for several minutes | Each hang has the same kernel signature: ``` ring gfx_0.0.0 timeout, signaled seq=N, emitted seq=N+2..4 Process hookshot ... thread sead::MainThrea (LOW_SPEC run: thread OptimizeChangeB) Ring gfx_0.0.0 reset failed MODE2 reset ``` The `LOW_SPEC` run also had `ring comp_1.1.0 timeout` 12 s later. One possible reason for the difference between SteamOS and CachyOS Decks: SteamOS boots with `amdgpu.lockup_timeout=5000,10000,10000,5000`. That gives the gfx ring 5 s, against the kernel default of 10 s. hardicd's trace in #817 has the task shader still running at 3, 6 and 9 s. A pass that finishes within 10 s would show as a long stall under the default and as a reset here. I haven't tested this with a raised timeout. For reference, this Deck has 1 GiB of VRAM and 8 GiB of GTT. `NO_MESH` frame rates (`vk: ... presents` lines): | Where | Draws per frame | fps | GPU-bound wait | |---|---|---|---| | Link's house | ~650 | 25-26 | 0.3 ms | | Porch, overlooking the village | ~2,100 | 18-19 | 4 ms | | The village pan | ~2,500 | 14-17 | 8-9 ms | In play there is heavy flicker and specks on the fallback path. #1509 and #1513 look like they cover this. A note on testing cost: here the program cache survived the resets (`46517 program keys kept` on the next start). It was rebuilt only when a `RX_VK_*` switch changed the programs. As a workaround for the intro, a save made on another PC (where the game runs) loads on the Deck without changes. So each retest takes about a minute instead of the whole intro. Happy to test a build or a switch on this Deck.
Alexatre commented 2026-11-10 16:03:13 +00:00 (Migrated from github.com)

hookshot_log.txt

✅ WORKAROUND FOUND: RX 6800 XT (RDNA 2) on Linux, no more device lost, native mesh shaders, everything drawn

TL;DR: On RDNA 2 + Linux the hang is RADV-specific. Running Hookshot with AMDVLK instead of RADV fixes it, for this game only, while the rest of the system stays on Mesa/RADV. No mesh fallback, no missing geometry.

My setup

  • GPU: AMD Radeon RX 6800 XT (RDNA 2, Navi 21), 16 GB
  • Hookshot v2.0.13, Arch Linux (CachyOS kernel), KDE Plasma
  • Works with AMDVLK 2025.Q2.1 on kernel 6.18 LTS. Same save, same spot, played into later areas: no hang.
  • With RADV (Mesa 26.2.6) it always hangs at the same spot from the same save, on both 7.3 and 6.18 LTS kernels.

What did NOT help on RADV (all with RX_VK_CHECKPOINTS=1)

  • RX_VK_MESH_NOCULL=2c56dc1006942f74 + RX_VK_NO_PROGRAM_CACHE=1: the log confirms culling off, every meshlet drawn, still hangs. So on desktop RDNA 2 it is not the #817 culling loop.
  • RX_VK_WB_DIFF=0, RX_VK_BATCH=0, RX_VK_ASTC_CPU=1, RX_VK_SKIP_CODE=..., GPU at stock clocks, LTS kernel: all still hang.
  • RX_VK_FORCE_MESH_FALLBACK=1: no hang, but broken/missing geometry.
  • The marker position moves between runs (write-backs, texture uploads, draws), and some kernel resets are on the compute ring (ring comp_1.2.0 timeout), which is where RADV runs task shaders. The same game hangs the same way in CheezyEmu/Fritchii (avoided there by skipping mesh draws), while Windows with AMD's driver works.

🛠️ How to use AMDVLK only for Hookshot (nothing installed system-wide)

AMDVLK is discontinued and no longer in the Arch repos, but its last release still works for this.

1. Download amdvlk_2025.Q2.1_amd64.deb from https://github.com/GPUOpen-Drivers/AMDVLK/releases

2. Extract it to a folder of your own:

mkdir -p ~/amdvlk && cd ~/amdvlk
ar x ~/Downloads/amdvlk_*_amd64.deb
tar xf data.tar.*

3. Point its ICD file at the extracted library:

ICD=$(find ~/amdvlk -name "*.json" -path "*icd*" | head -1)
LIB=$(find ~/amdvlk -name "amdvlk64.so" | head -1)
sed -i "s|\"library_path\": *\"[^\"]*\"|\"library_path\": \"$LIB\"|" "$ICD"

4. Check that it sees the card and has mesh shaders:

VK_DRIVER_FILES="$ICD" vulkaninfo --summary | grep -E "deviceName|driverName"
VK_DRIVER_FILES="$ICD" vulkaninfo | grep -i VK_EXT_mesh_shader

5. Start the game with it (adjust the game folder):

cd ~/Games/Hookshot
VK_DRIVER_FILES="$ICD" ./bin/hookshot

The first start recompiles the shaders and takes a while (AMDVLK's compiler is slower, like on Windows). Let it finish.

To make it permanent, put those two lines in a small script and add it to your menu or Steam as a non-Steam game, with no Proton. VK_DRIVER_FILES only affects that process: the desktop and other games keep using RADV.

Tips: RX_VK_VRAM_MB=12288 (16 GB card), Upscaler AMD FSR 3.1 in the Insert menu for less aliasing, and RX_VK_UPLOAD_BUDGET_MS=0 if textures pop in late in towns.


For the developer

This points to how RADV executes OoT's task/mesh shaders on RDNA 2, likely the task stage, which RADV runs on a separate compute queue. Ideas that might avoid it without AMDVLK:

  • run the mesh fallback only for programs with a task stage (on RADV + RDNA 2), keeping native mesh shaders elsewhere;
  • or run the task stage as a compute dispatch on the graphics queue and draw the mesh stage with vkCmdDrawMeshTasksIndirectEXT, so RADV never uses its task-shader path. The fallback already translates task shaders to compute.

Happy to test builds or switches on this card. Logs from the RADV runs (with markers) are attached.

[hookshot_log.txt](https://github.com/user-attachments/files/34638832/hookshot_log.txt) ## ✅ WORKAROUND FOUND: RX 6800 XT (RDNA 2) on Linux, no more device lost, native mesh shaders, everything drawn **TL;DR:** On RDNA 2 + Linux the hang is **RADV-specific**. Running Hookshot with **AMDVLK** instead of RADV fixes it, for this game only, while the rest of the system stays on Mesa/RADV. No mesh fallback, no missing geometry. ### My setup - GPU: AMD Radeon RX 6800 XT (RDNA 2, Navi 21), 16 GB - Hookshot v2.0.13, Arch Linux (CachyOS kernel), KDE Plasma - Works with **AMDVLK 2025.Q2.1** on kernel **6.18 LTS**. Same save, same spot, played into later areas: no hang. - With **RADV (Mesa 26.2.6)** it always hangs at the same spot from the same save, on both 7.3 and 6.18 LTS kernels. ### What did NOT help on RADV (all with RX_VK_CHECKPOINTS=1) - `RX_VK_MESH_NOCULL=2c56dc1006942f74` + `RX_VK_NO_PROGRAM_CACHE=1`: the log confirms `culling off, every meshlet drawn`, still hangs. So on desktop RDNA 2 it is **not** the #817 culling loop. - `RX_VK_WB_DIFF=0`, `RX_VK_BATCH=0`, `RX_VK_ASTC_CPU=1`, `RX_VK_SKIP_CODE=...`, GPU at stock clocks, LTS kernel: all still hang. - `RX_VK_FORCE_MESH_FALLBACK=1`: no hang, but broken/missing geometry. - The marker position moves between runs (write-backs, texture uploads, draws), and some kernel resets are on the **compute ring** (`ring comp_1.2.0 timeout`), which is where RADV runs **task shaders**. The same game hangs the same way in CheezyEmu/Fritchii (avoided there by skipping mesh draws), while Windows with AMD's driver works. --- ### 🛠️ How to use AMDVLK only for Hookshot (nothing installed system-wide) AMDVLK is discontinued and no longer in the Arch repos, but its last release still works for this. **1.** Download `amdvlk_2025.Q2.1_amd64.deb` from https://github.com/GPUOpen-Drivers/AMDVLK/releases **2.** Extract it to a folder of your own: ```sh mkdir -p ~/amdvlk && cd ~/amdvlk ar x ~/Downloads/amdvlk_*_amd64.deb tar xf data.tar.* ``` **3.** Point its ICD file at the extracted library: ```sh ICD=$(find ~/amdvlk -name "*.json" -path "*icd*" | head -1) LIB=$(find ~/amdvlk -name "amdvlk64.so" | head -1) sed -i "s|\"library_path\": *\"[^\"]*\"|\"library_path\": \"$LIB\"|" "$ICD" ``` **4.** Check that it sees the card and has mesh shaders: ```sh VK_DRIVER_FILES="$ICD" vulkaninfo --summary | grep -E "deviceName|driverName" VK_DRIVER_FILES="$ICD" vulkaninfo | grep -i VK_EXT_mesh_shader ``` **5.** Start the game with it (adjust the game folder): ```sh cd ~/Games/Hookshot VK_DRIVER_FILES="$ICD" ./bin/hookshot ``` The first start recompiles the shaders and takes a while (AMDVLK's compiler is slower, like on Windows). Let it finish. To make it permanent, put those two lines in a small script and add it to your menu or Steam as a non-Steam game, with no Proton. `VK_DRIVER_FILES` only affects that process: the desktop and other games keep using RADV. **Tips:** `RX_VK_VRAM_MB=12288` (16 GB card), Upscaler **AMD FSR 3.1** in the Insert menu for less aliasing, and `RX_VK_UPLOAD_BUDGET_MS=0` if textures pop in late in towns. --- ### For the developer This points to how **RADV executes OoT's task/mesh shaders on RDNA 2**, likely the task stage, which RADV runs on a separate compute queue. Ideas that might avoid it without AMDVLK: - run the **mesh fallback only for programs with a task stage** (on RADV + RDNA 2), keeping native mesh shaders elsewhere; - or run the **task stage as a compute dispatch** on the graphics queue and draw the mesh stage with `vkCmdDrawMeshTasksIndirectEXT`, so RADV never uses its task-shader path. The fallback already translates task shaders to compute. Happy to test builds or switches on this card. Logs from the RADV runs (with markers) are attached.
manianac commented 2026-11-10 16:05:12 +00:00 (Migrated from github.com)

RX 6800 XT (RADV, Mesa 26.2.6), Gentoo, v2.0.13: GPU hang during the Deku Tree's speech on every attempt; RX_VK_NO_MESH=1 avoids it

Hookshot v2.0.13 hangs the GPU on my RX 6800 XT while the Deku Tree speaks, right after the intro cinematic. It happens on every attempt: the picture freezes, the kernel resets the GPU, and the game closes with VK_ERROR_DEVICE_LOST. Setting RX_VK_NO_MESH=1 seems to fix it. In my latest run the checkpoint markers stop at the same two programs as #620.

System

Hookshot v2.0.13 (source cfc565a2), built with the v2.0.13 Linux AppImage
GPU AMD Radeon RX 6800 XT 16 GB (Navi 21, RDNA 2): RADV NAVI21, driver 0x6802006
Mesa 26.2.6 (libdrm 2.4.134, Vulkan loader 1.4.357)
Kernel 6.18.62-gentoo-dist, linux-firmware 20261019, amdgpu parameters at their defaults
OS Gentoo Linux, KDE Plasma 6.7.6 on Wayland
CPU and RAM Ryzen 9 5900X (12 cores), 32 GB RAM, 16 GB swap
Display 2560x1440 monitor

Settings: default options. hookshot_env.txt has RX_VK_CHECKPOINTS=1 and RX_VK_FAULT_INFO=1; the runs that hung had no RX_VK_NO_MESH, RX_VK_SKIP_CODE or RX_VK_MESH_NOCULL.

What happens

  • Where: the Deku Tree's speech, right after the intro cinematic.
  • How often: every attempt.
  • Workaround: with RX_VK_MESH_OPT=1 the hang seems to be gone.
  • The title screen and the intro cinematic run at 60 fps. The speech scene runs at 32-41 fps (GPU time about 9.5 ms a frame), with a few slow submits while it loads (up to 253 ms) and none after.
  • The latest run hung about 10 s into the scene; an earlier one lasted about a minute. Either way the picture freezes for about 16 s (hid: the game read no controller for 15.9 s): the kernel's 10 s timeout plus the reset. Then the game closes.
  • Each reset takes other programs down with it: Xwayland and my browser crashed after the latest one, plasmashell after the earlier one.

Checkpoint markers, latest run

radv/amdgpu: The CS has been cancelled because the context is lost. This context is innocent.
vk: batched submit 11554 failed (-4)
vk: device fault: 
vk: device lost: reading the buffer markers
vk: device lost: 437905 markers set, 64070 reached; the last whose earlier work all finished: 436415
vk:   finished before: marker 436409 (draw of program 43ec86f35fd937b9, frame 11294)
vk:   finished before: marker 436410 (draw of program d4abbcb4c2140609, frame 11294)
vk:   finished before: marker 436411 (draw of program d8e59341cf4f629c, frame 11294)
vk:   finished before: marker 436412 (draw of program d905f52b7517c681, frame 11294)
vk:   finished before: marker 436413 (draw of program c36a4f3f667c886a, frame 11294)
vk:   finished before: marker 436414 (draw of program 739acd678ae08655, frame 11294)
vk:   RUNNING after: marker 436415 (draw of program 89ca750f9852b7ca, frame 11294)
vk:   running: marker 436416 (draw of program 695ed228eb27e703, frame 11294)
vk:   reached, earlier work unfinished: marker 436416 (draw of program 695ed228eb27e703, frame 11294)
(markers 436417 to 436427: the same line for the same program)
vk: device fault: 
vk: FATAL: the GPU device was lost (VK_ERROR_DEVICE_LOST): the driver stopped or reset the GPU, and nothing sent to it runs any more (on Linux, dmesg or journalctl -k around this time names the reset)
  • The draw running at the hang is program 89ca750f9852b7ca, two draws after c36a4f3f667c886a. #620's v2.0.5 checkpoints (RX 6600) stop at the same pair: last finished c36a4f3f667c886a, first unfinished 89ca750f9852b7ca (the foliage colour pass, per the summary above).
  • The earlier run stopped somewhere else: 636eed4d5000d1c0 was running, after six finished draws of c70332b4adb4aa9f. In omgitsgela's v2.0.11 log above, c70332b4adb4aa9f is listed with task code 2c56dc1006942f74. So the program running at the hang changes from run to run, as omgitsgela saw on the Deck.
  • RX_VK_FAULT_INFO=1 gives nothing on RADV: the device fault: lines are empty.

Kernel log

Latest run, local time (UTC-5):

10:54:28 amdgpu: ring gfx_0.1.0 timeout, signaled seq=386556, emitted seq=386558
10:54:28 amdgpu:  Process kwin_wayland pid 1683 thread kwin_wayla:cs0 pid 1716
10:54:28 amdgpu: Starting gfx_0.1.0 ring reset
10:54:28 amdgpu: Ring gfx_0.1.0 reset failed
10:54:28 amdgpu: GPU reset begin!. Source:  1
10:54:33 amdgpu: MODE1 reset
10:54:33 amdgpu: GPU reset succeeded, trying to resume
10:54:33 amdgpu: VRAM is lost due to GPU reset!
10:54:34 amdgpu: GPU reset(2) succeeded!
10:54:34 [drm] device wedged, but recovered through reset
10:54:34 amdgpu: [drm] *ERROR* Failed to initialize parser -125!
  • This time the kernel names KWin's job on the second gfx ring. The game had already been frozen for about 10 s when that timeout fired, and Hookshot's markers show its own draws stalled, so KWin's job was most likely stuck behind the hang.
  • The earlier run named Hookshot itself: ring gfx_0.0.0 timeout, Process hookshot pid 93359 thread Presentation Th, then the same failed ring reset and MODE1 reset.
  • No compute ring timeout, page fault or kernel warning before either reset. The kernel wrote a devcoredump both times, but they expired before I saved them.

Attached

  • hookshot_log_v2.0.13_10-54.txt: the latest run (the markers above).
  • hookshot_log_v2.0.13_10-37.txt: the earlier run.
  • hookshot-v2.0.13-kernel-resets.log: journalctl -k around both resets.

hookshot-v2.0.13-kernel-resets.log
hookshot_log_v2.0.13_10-37.txt
hookshot_log_v2.0.13_10-54.txt

**RX 6800 XT (RADV, Mesa 26.2.6), Gentoo, v2.0.13: GPU hang during the Deku Tree's speech on every attempt; `RX_VK_NO_MESH=1` avoids it** Hookshot v2.0.13 hangs the GPU on my RX 6800 XT while the Deku Tree speaks, right after the intro cinematic. It happens on every attempt: the picture freezes, the kernel resets the GPU, and the game closes with `VK_ERROR_DEVICE_LOST`. Setting `RX_VK_NO_MESH=1` seems to fix it. In my latest run the checkpoint markers stop at the same two programs as #620. ### System | | | |---|---| | Hookshot | v2.0.13 (`source cfc565a2`), built with the v2.0.13 Linux AppImage | | GPU | AMD Radeon RX 6800 XT 16 GB (Navi 21, RDNA 2): `RADV NAVI21`, driver `0x6802006` | | Mesa | 26.2.6 (libdrm 2.4.134, Vulkan loader 1.4.357) | | Kernel | 6.18.62-gentoo-dist, linux-firmware 20261019, amdgpu parameters at their defaults | | OS | Gentoo Linux, KDE Plasma 6.7.6 on Wayland | | CPU and RAM | Ryzen 9 5900X (12 cores), 32 GB RAM, 16 GB swap | | Display | 2560x1440 monitor | **Settings:** default options. `hookshot_env.txt` has `RX_VK_CHECKPOINTS=1` and `RX_VK_FAULT_INFO=1`; the runs that hung had no `RX_VK_NO_MESH`, `RX_VK_SKIP_CODE` or `RX_VK_MESH_NOCULL`. ### What happens - **Where:** the Deku Tree's speech, right after the intro cinematic. - **How often:** every attempt. - **Workaround:** with `RX_VK_MESH_OPT=1` the hang seems to be gone. - The title screen and the intro cinematic run at 60 fps. The speech scene runs at 32-41 fps (GPU time about 9.5 ms a frame), with a few slow submits while it loads (up to 253 ms) and none after. - The latest run hung about 10 s into the scene; an earlier one lasted about a minute. Either way the picture freezes for about 16 s (`hid: the game read no controller for 15.9 s`): the kernel's 10 s timeout plus the reset. Then the game closes. - Each reset takes other programs down with it: Xwayland and my browser crashed after the latest one, plasmashell after the earlier one. ### Checkpoint markers, latest run ``` radv/amdgpu: The CS has been cancelled because the context is lost. This context is innocent. vk: batched submit 11554 failed (-4) vk: device fault: vk: device lost: reading the buffer markers vk: device lost: 437905 markers set, 64070 reached; the last whose earlier work all finished: 436415 vk: finished before: marker 436409 (draw of program 43ec86f35fd937b9, frame 11294) vk: finished before: marker 436410 (draw of program d4abbcb4c2140609, frame 11294) vk: finished before: marker 436411 (draw of program d8e59341cf4f629c, frame 11294) vk: finished before: marker 436412 (draw of program d905f52b7517c681, frame 11294) vk: finished before: marker 436413 (draw of program c36a4f3f667c886a, frame 11294) vk: finished before: marker 436414 (draw of program 739acd678ae08655, frame 11294) vk: RUNNING after: marker 436415 (draw of program 89ca750f9852b7ca, frame 11294) vk: running: marker 436416 (draw of program 695ed228eb27e703, frame 11294) vk: reached, earlier work unfinished: marker 436416 (draw of program 695ed228eb27e703, frame 11294) (markers 436417 to 436427: the same line for the same program) vk: device fault: vk: FATAL: the GPU device was lost (VK_ERROR_DEVICE_LOST): the driver stopped or reset the GPU, and nothing sent to it runs any more (on Linux, dmesg or journalctl -k around this time names the reset) ``` - The draw running at the hang is program `89ca750f9852b7ca`, two draws after `c36a4f3f667c886a`. #620's v2.0.5 checkpoints (RX 6600) stop at the same pair: last finished `c36a4f3f667c886a`, first unfinished `89ca750f9852b7ca` (the foliage colour pass, per the summary above). - The earlier run stopped somewhere else: `636eed4d5000d1c0` was running, after six finished draws of `c70332b4adb4aa9f`. In omgitsgela's v2.0.11 log above, `c70332b4adb4aa9f` is listed with task code `2c56dc1006942f74`. So the program running at the hang changes from run to run, as omgitsgela saw on the Deck. - `RX_VK_FAULT_INFO=1` gives nothing on RADV: the `device fault:` lines are empty. ### Kernel log Latest run, local time (UTC-5): ``` 10:54:28 amdgpu: ring gfx_0.1.0 timeout, signaled seq=386556, emitted seq=386558 10:54:28 amdgpu: Process kwin_wayland pid 1683 thread kwin_wayla:cs0 pid 1716 10:54:28 amdgpu: Starting gfx_0.1.0 ring reset 10:54:28 amdgpu: Ring gfx_0.1.0 reset failed 10:54:28 amdgpu: GPU reset begin!. Source: 1 10:54:33 amdgpu: MODE1 reset 10:54:33 amdgpu: GPU reset succeeded, trying to resume 10:54:33 amdgpu: VRAM is lost due to GPU reset! 10:54:34 amdgpu: GPU reset(2) succeeded! 10:54:34 [drm] device wedged, but recovered through reset 10:54:34 amdgpu: [drm] *ERROR* Failed to initialize parser -125! ``` - This time the kernel names KWin's job on the second gfx ring. The game had already been frozen for about 10 s when that timeout fired, and Hookshot's markers show its own draws stalled, so KWin's job was most likely stuck behind the hang. - The earlier run named Hookshot itself: `ring gfx_0.0.0 timeout`, `Process hookshot pid 93359 thread Presentation Th`, then the same failed ring reset and MODE1 reset. - No compute ring timeout, page fault or kernel warning before either reset. The kernel wrote a devcoredump both times, but they expired before I saved them. ### Attached - `hookshot_log_v2.0.13_10-54.txt`: the latest run (the markers above). - `hookshot_log_v2.0.13_10-37.txt`: the earlier run. - `hookshot-v2.0.13-kernel-resets.log`: `journalctl -k` around both resets. [hookshot-v2.0.13-kernel-resets.log](https://github.com/user-attachments/files/34638771/hookshot-v2.0.13-kernel-resets.log) [hookshot_log_v2.0.13_10-37.txt](https://github.com/user-attachments/files/34638773/hookshot_log_v2.0.13_10-37.txt) [hookshot_log_v2.0.13_10-54.txt](https://github.com/user-attachments/files/34638772/hookshot_log_v2.0.13_10-54.txt)
NotRexed commented 2026-11-10 16:16:13 +00:00 (Migrated from github.com)

Summary of a community-found work-around (thanks @Alexatre), not an official recommendation: on Linux, the RDNA2 hang looks specific to RADV (Mesa's AMD driver). Running Hookshot with AMD's AMDVLK driver instead avoided the hang on an RX 6800 XT: native mesh shaders, no device lost, everything drawn.

How: install AMDVLK alongside Mesa and start only Hookshot with it, for example with AMD_VULKAN_ICD=AMDVLK in front of the game's command (or the way your distro offers to choose the Vulkan driver per program). The rest of the system stays on RADV. If you try it on another card, please post the result here.

Summary of a community-found work-around (thanks @Alexatre), not an official recommendation: on Linux, the RDNA2 hang looks specific to RADV (Mesa's AMD driver). Running Hookshot with AMD's AMDVLK driver instead avoided the hang on an RX 6800 XT: native mesh shaders, no device lost, everything drawn. How: install AMDVLK alongside Mesa and start only Hookshot with it, for example with `AMD_VULKAN_ICD=AMDVLK` in front of the game's command (or the way your distro offers to choose the Vulkan driver per program). The rest of the system stays on RADV. If you try it on another card, please post the result here.
manianac commented 2026-11-10 17:07:58 +00:00 (Migrated from github.com)

My only concern is AMDVLK was discontinued in September 2025. I will attempt it, but I have noticed RX_VK_MESH_OPT=1 seems like an acceptable workaround so far. If found sufficient after testing, maybe this could be baked in for this driver?

My only concern is AMDVLK was discontinued in September 2025. I will attempt it, but I have noticed `RX_VK_MESH_OPT=1` seems like an acceptable workaround so far. If found sufficient after testing, maybe this could be baked in for this driver?
davjack commented 2026-11-10 17:29:47 +00:00 (Migrated from github.com)

A Linux NVIDIA report with nothing broken, for comparison: RTX 4090, driver 595.99.02, Ubuntu 26.04 (kernel 7.0, KDE Wayland), Ryzen 9 3950X. The v2.0.12 AppImage built the game from a two-title .nup in 14 min (CLI, 16 jobs) and prepared the shaders in 3.5 min. A 43-minute headless run with teleports between Kokiri, Kakariko, Castle Town Market and Lake Hylia had no crash and no device lost; process memory settled at 16.2 GB and stayed flat for the last 30 minutes. A windowed run with an Xbox Series X controller also worked.

A Linux NVIDIA report with nothing broken, for comparison: RTX 4090, driver 595.99.02, Ubuntu 26.04 (kernel 7.0, KDE Wayland), Ryzen 9 3950X. The v2.0.12 AppImage built the game from a two-title `.nup` in 14 min (CLI, 16 jobs) and prepared the shaders in 3.5 min. A 43-minute headless run with teleports between Kokiri, Kakariko, Castle Town Market and Lake Hylia had no crash and no device lost; process memory settled at 16.2 GB and stayed flat for the last 30 minutes. A windowed run with an Xbox Series X controller also worked.
hugouchoasborges commented 2026-11-10 18:51:26 +00:00 (Migrated from github.com)

Hi, I’d like to share my experience with a GPU reset on Steam Deck that still happens after applying the workaround from #1300.

I’m running Hookshot v2.0.12 (source cfa1aebf, Linux AppImage build) on SteamOS in Game Mode. The game reports AMD Custom GPU 0932 (RADV VANGOGH) with Vulkan 1.3.

Steps to reproduce: Open Hookshot and load an existing save from after the opening cutscene. The save loads, then the game freezes and exits.

I set RX_VK_MESH_NOCULL=2c56dc1006942f74 in hookshot_env.txt, and the game log confirms that the workaround was applied:

vk: task code 2c56dc1006942f74: culling off, every meshlet drawn (RX_VK_MESH_NOCULL)

The kernel logged a graphics ring timeout followed by a GPU reset:

Nov 10 08:47:22 steamdeck kernel: amdgpu 0000:04:00.0: amdgpu: ring gfx_0.0.0 timeout, signaled seq=3428200, emitted seq=3428203
Nov 10 08:47:22 steamdeck kernel: amdgpu 0000:04:00.0: amdgpu: Process information: process hookshot pid 17773 thread OptimizeChangeB pid 18119
Nov 10 08:47:23 steamdeck kernel: amdgpu 0000:04:00.0: amdgpu: MODE2 reset

In an earlier test, RX_VK_NO_MESH=1 let me get past the crash, but I saw severe flickering and missing geometry during gameplay.

The kernel messages look similar to those in #817. Is there a diagnostic flag or a specific build I could try to help identify what is still causing the reset?

Hi, I’d like to share my experience with a GPU reset on Steam Deck that still happens after applying the workaround from #1300. I’m running Hookshot v2.0.12 (source `cfa1aebf`, Linux AppImage build) on SteamOS in Game Mode. The game reports `AMD Custom GPU 0932 (RADV VANGOGH)` with Vulkan 1.3. **Steps to reproduce:** Open Hookshot and load an existing save from after the opening cutscene. The save loads, then the game freezes and exits. I set `RX_VK_MESH_NOCULL=2c56dc1006942f74` in `hookshot_env.txt`, and the game log confirms that the workaround was applied: vk: task code 2c56dc1006942f74: culling off, every meshlet drawn (RX_VK_MESH_NOCULL) The kernel logged a graphics ring timeout followed by a GPU reset: Nov 10 08:47:22 steamdeck kernel: amdgpu 0000:04:00.0: amdgpu: ring gfx_0.0.0 timeout, signaled seq=3428200, emitted seq=3428203 Nov 10 08:47:22 steamdeck kernel: amdgpu 0000:04:00.0: amdgpu: Process information: process hookshot pid 17773 thread OptimizeChangeB pid 18119 Nov 10 08:47:23 steamdeck kernel: amdgpu 0000:04:00.0: amdgpu: MODE2 reset In an earlier test, `RX_VK_NO_MESH=1` let me get past the crash, but I saw severe flickering and missing geometry during gameplay. The kernel messages look similar to those in #817. Is there a diagnostic flag or a specific build I could try to help identify what is still causing the reset?
naxil commented 2026-11-10 19:45:24 +00:00 (Migrated from github.com)

My only concern is AMDVLK was discontinued in September 2025. I will attempt it, but I have noticed RX_VK_MESH_OPT=1 seems like an acceptable workaround so far. If found sufficient after testing, maybe this could be baked in for this driver?

i have amd6600 why every start it read the pipeline? in radv it load superfast

Image
> My only concern is AMDVLK was discontinued in September 2025. I will attempt it, but I have noticed `RX_VK_MESH_OPT=1` seems like an acceptable workaround so far. If found sufficient after testing, maybe this could be baked in for this driver? i have amd6600 why every start it read the pipeline? in radv it load superfast <img width="1920" height="1080" alt="Image" src="https://github.com/user-attachments/assets/2fdcb8dc-1b82-43b1-a050-1dcb82851163" />
addisonbair commented 2026-11-10 19:57:29 +00:00 (Migrated from github.com)

Follow-up (Steam Deck OLED, stock SteamOS 3.9.5): RX_VK_MESH_OPT=1 avoids the hang on v2.0.14

  • With RX_VK_MESH_OPT=1, HOS_HANDHELD=1 and no other mesh switches, mesh shaders run on this Deck with no GPU hang. I loaded straight into a Kokiri Forest save, which hung within seconds with RX_VK_SKIP_CODE + RX_VK_LOW_SPEC=1. Then I played about 30 minutes across five launches, with no gfx_0.0.0 timeout in the kernel log. This confirms @manianac's RX 6800 XT result on the Deck.
  • In the village the frame rate is CPU-bound: about 19 fps base at about 2,850 draws per frame, with GPU-bound wait at 3-4 ms of a ~52 ms frame. The resolution and upscaler choices don't change it. Descriptor reuse and Sampler cache are on.

Correction to my earlier comment: the SteamOS 5 s gfx lockup_timeout doesn't explain the difference. @manianac's 6800 XT hangs with the default 10 s timeout, and its freeze lasts about 16 s. Sorry for the noise.

If it helps to bake MESH_OPT in for VANGOGH / RADV RDNA2, I can test a build on this Deck.

**Follow-up (Steam Deck OLED, stock SteamOS 3.9.5): `RX_VK_MESH_OPT=1` avoids the hang on v2.0.14** - With `RX_VK_MESH_OPT=1`, `HOS_HANDHELD=1` and no other mesh switches, mesh shaders run on this Deck with no GPU hang. I loaded straight into a Kokiri Forest save, which hung within seconds with `RX_VK_SKIP_CODE` + `RX_VK_LOW_SPEC=1`. Then I played about 30 minutes across five launches, with no `gfx_0.0.0` timeout in the kernel log. This confirms @manianac's RX 6800 XT result on the Deck. - In the village the frame rate is CPU-bound: about 19 fps base at about 2,850 draws per frame, with `GPU-bound wait` at 3-4 ms of a ~52 ms frame. The resolution and upscaler choices don't change it. Descriptor reuse and Sampler cache are on. **Correction to my earlier comment:** the SteamOS 5 s gfx `lockup_timeout` doesn't explain the difference. @manianac's 6800 XT hangs with the default 10 s timeout, and its freeze lasts about 16 s. Sorry for the noise. If it helps to bake `MESH_OPT` in for VANGOGH / RADV RDNA2, I can test a build on this Deck.
zackfairccff-bot commented 2026-11-10 20:08:01 +00:00 (Migrated from github.com)

Steam Deck LCD / RADV VANGOGH — Combined workarounds: 14–15 FPS, 121 failed shader programs

Following up on my previous Steam Deck LCD reports, I tested a combination of workarounds, including settings investigated by @KewinBR and the experimental fixes from PR #1795.

System

  • Steam Deck LCD — AMD Van Gogh / RADV
  • SteamOS 3.9.5
  • Experimental Linux fork: v2.0.11-372-gef66f55
  • Separate installation, not the official v2.0.14

Launch configuration

RX_VK_DECK_DEFAULTS=0
RX_VK_FORCE_MESH_FALLBACK=1
RX_VK_MESH_NOCULL=2c56dc1006942f74
RX_VK_MESH_OPT=1
RX_VK_WAIT_GPU=1
RX_VK_UB_SNAPSHOT=1
RX_VK_EVENT_WAITS=0
RX_VK_VRAM_MB=2048
RX_VK_TEX_MAX_MB=128
RX_VK_TEX_MAX_DIM=1024
RX_VK_MIRROR_MB=256
RX_VK_LOW_SPEC=1
RX_VK_CHECKPOINTS=1
HOS_HANDHELD=1
HOS_ASPECT=1.6
HOS_GRAPHICS_SCALE=0.75

Results from the captured gameplay log

  • Approximately 14.1–14.9 FPS.
  • 57.3 ms GPU time per frame.
  • Around 1,620 draws per frame, with zero skipped in the measured sample.
  • 53,339 shader programs, 121 failed.
  • Texture usage approximately 1.9–2.0 GB, against a 2,048 MB budget.
  • Vulkan memory usage: 4,316 MB of 5,438 MB allowed.
  • Uniform-buffer snapshots confirmed active through repeated "copied into the stream" log messages.
  • No "VK_ERROR_DEVICE_LOST" in the captured log; the session ended with "display: window closed, exiting".

Frame interpolation was active. These figures are not a controlled benchmark with frame generation disabled.

Important limitations

This was a combined test, so it is not possible to identify which individual setting contributed to stability.

The compute mesh fallback was enabled. Therefore, the benefits of "RX_VK_MESH_NOCULL" on native mesh rendering were not established.

"RX_VK_WAIT_GPU=1" was used because this fork does not reproduce @KewinBR's modified "RX_VK_WAIT_GPU=-1" behavior.

I cannot confirm that overexposure, flickering or missing geometry were fixed, since no controlled visual comparison was recorded.

Next test

I am rebuilding a separate official v2.0.14 installation. The recent Steam Deck OLED report showing approximately 30 minutes without GPU hangs using native mesh shaders and "RX_VK_MESH_OPT=1" is particularly promising.

I intend to test that configuration on the Steam Deck LCD and compare stability, rendering correctness and performance.

The full local log is available for further investigation.

Steam Deck LCD / RADV VANGOGH — Combined workarounds: 14–15 FPS, 121 failed shader programs Following up on my previous Steam Deck LCD reports, I tested a combination of workarounds, including settings investigated by @KewinBR and the experimental fixes from PR #1795. System - Steam Deck LCD — AMD Van Gogh / RADV - SteamOS 3.9.5 - Experimental Linux fork: v2.0.11-372-gef66f55 - Separate installation, not the official v2.0.14 Launch configuration RX_VK_DECK_DEFAULTS=0 RX_VK_FORCE_MESH_FALLBACK=1 RX_VK_MESH_NOCULL=2c56dc1006942f74 RX_VK_MESH_OPT=1 RX_VK_WAIT_GPU=1 RX_VK_UB_SNAPSHOT=1 RX_VK_EVENT_WAITS=0 RX_VK_VRAM_MB=2048 RX_VK_TEX_MAX_MB=128 RX_VK_TEX_MAX_DIM=1024 RX_VK_MIRROR_MB=256 RX_VK_LOW_SPEC=1 RX_VK_CHECKPOINTS=1 HOS_HANDHELD=1 HOS_ASPECT=1.6 HOS_GRAPHICS_SCALE=0.75 Results from the captured gameplay log - Approximately 14.1–14.9 FPS. - 57.3 ms GPU time per frame. - Around 1,620 draws per frame, with zero skipped in the measured sample. - 53,339 shader programs, 121 failed. - Texture usage approximately 1.9–2.0 GB, against a 2,048 MB budget. - Vulkan memory usage: 4,316 MB of 5,438 MB allowed. - Uniform-buffer snapshots confirmed active through repeated "copied into the stream" log messages. - No "VK_ERROR_DEVICE_LOST" in the captured log; the session ended with "display: window closed, exiting". Frame interpolation was active. These figures are not a controlled benchmark with frame generation disabled. Important limitations This was a combined test, so it is not possible to identify which individual setting contributed to stability. The compute mesh fallback was enabled. Therefore, the benefits of "RX_VK_MESH_NOCULL" on native mesh rendering were not established. "RX_VK_WAIT_GPU=1" was used because this fork does not reproduce @KewinBR's modified "RX_VK_WAIT_GPU=-1" behavior. I cannot confirm that overexposure, flickering or missing geometry were fixed, since no controlled visual comparison was recorded. Next test I am rebuilding a separate official v2.0.14 installation. The recent Steam Deck OLED report showing approximately 30 minutes without GPU hangs using native mesh shaders and "RX_VK_MESH_OPT=1" is particularly promising. I intend to test that configuration on the Steam Deck LCD and compare stability, rendering correctness and performance. The full local log is available for further investigation.
NutterButterCake commented 2026-11-10 20:38:50 +00:00 (Migrated from github.com)

I can report that I've tried the fix proposed by addisonbair and it yields some very good results (with a lot of room for improvement but still!).
RX_VK_MESH_OPT=1, HOS_HANDHELD=1
These launch options stopped the hanging and crashing on the opening cutscene ending and the game now boots and renders gameplay. The fps varies wildly between 14fps low 1% stutters and close to 60fps. This is likely caused by heavy RAM usage. As it uses 12GB of RAM and 6GB of VRAM (2GB of Swap RAM is probably causing the stuttering). The CPU usage is quite low, lower than I expected and the GPU usage is around 80%, higher than I expected for using FSR3. 1 in quality mode with the handheld low preset.

However, the visuals are all over the place in stability, there is random white flashes constantly when moving Link and the camera, textures frequently load and unload, and UI elements flash and stretch across the screen.

I can report that I've tried the fix proposed by addisonbair and it yields some very good results (with a lot of room for improvement but still!). RX_VK_MESH_OPT=1, HOS_HANDHELD=1 These launch options stopped the hanging and crashing on the opening cutscene ending and the game now boots and renders gameplay. The fps varies wildly between 14fps low 1% stutters and close to 60fps. This is likely caused by heavy RAM usage. As it uses 12GB of RAM and 6GB of VRAM (2GB of Swap RAM is probably causing the stuttering). The CPU usage is quite low, lower than I expected and the GPU usage is around 80%, higher than I expected for using FSR3. 1 in quality mode with the handheld low preset. However, the visuals are all over the place in stability, there is random white flashes constantly when moving Link and the camera, textures frequently load and unload, and UI elements flash and stretch across the screen.
addisonbair commented 2026-11-10 20:49:45 +00:00 (Migrated from github.com)

Steam Deck (RDNA2, no matrix cores), v2.0.14: the gameplay upscale network costs ~12 ms of GPU time a frame. AMD FSR 3.1 removes it

Kokiri Forest, the same spot each run, Link standing still, ~2,330 draws a frame. Env: RX_VK_MESH_OPT=1, RX_VK_PER_QUEUE_FENCES=0, RX_VK_WAIT_GPU=0. Profiled with RX_VK_GPU_PROFILE=1 RX_VK_PASS_TIMING=2.

Setup fps GPU time a frame
Docked, Upscaler: game's own 11.9 56 ms (unprofiled GPU time line)
Docked, AMD FSR 3.1 (Quality) 13.9 45 ms (profiled)
Handheld profile, AMD FSR 3.1 15-17 37-40 ms (unprofiled)
  • With the game's own upscaler, the most expensive single GPU item is dispatch prog 9dc98871eb7fc101, at 11.5-12.6 ms a run. That's more than 8x the next span.
  • Per the comment in vk_shader.cpp, it is the gameplay TAAU network, kept by the default RX_VK_NETWORK_KEEP ("amd-fix"). On a GPU without cooperative-matrix hardware, its matrix multiplies run as ordinary shader code, which is why it is so slow here.
  • With FSR 3.1 the dispatch is gone (0 occurrences in the next 600-present report). The frame rate went up even though FSR's own passes now run.

Suggestion: on GPUs without cooperative-matrix support (RDNA2 such as the Deck's VANGOGH, likely also RDNA2 handhelds and desktop cards), default the Upscaler to FSR 3.1. The movie networks already get a linear stand-in on such GPUs. Players on those cards are unlikely to find this themselves: the resolution and quality rows barely move the frame rate there.

What remains after that, from the FSR profile:

  • Draw passes are ~60% of GPU time and dispatches ~33%.
  • The largest single pass is the full-screen 43ec86f35fd937b9 (~4.5 ms at 922x576).
  • On the CPU, the replay costs ~33 ms a frame (draw 21.5, of which descriptors 7.9).

Happy to re-profile a build on this Deck.

**Steam Deck (RDNA2, no matrix cores), v2.0.14: the gameplay upscale network costs ~12 ms of GPU time a frame. AMD FSR 3.1 removes it** Kokiri Forest, the same spot each run, Link standing still, ~2,330 draws a frame. Env: `RX_VK_MESH_OPT=1`, `RX_VK_PER_QUEUE_FENCES=0`, `RX_VK_WAIT_GPU=0`. Profiled with `RX_VK_GPU_PROFILE=1 RX_VK_PASS_TIMING=2`. | Setup | fps | GPU time a frame | |---|---|---| | Docked, Upscaler: game's own | 11.9 | 56 ms (unprofiled `GPU time` line) | | Docked, AMD FSR 3.1 (Quality) | 13.9 | 45 ms (profiled) | | Handheld profile, AMD FSR 3.1 | 15-17 | 37-40 ms (unprofiled) | - **With the game's own upscaler,** the most expensive single GPU item is `dispatch prog 9dc98871eb7fc101`, at 11.5-12.6 ms a run. That's more than 8x the next span. - Per the comment in `vk_shader.cpp`, it is the gameplay TAAU network, kept by the default `RX_VK_NETWORK_KEEP` ("amd-fix"). On a GPU without cooperative-matrix hardware, its matrix multiplies run as ordinary shader code, which is why it is so slow here. - **With FSR 3.1 the dispatch is gone** (0 occurrences in the next 600-present report). The frame rate went up even though FSR's own passes now run. **Suggestion:** on GPUs without cooperative-matrix support (RDNA2 such as the Deck's VANGOGH, likely also RDNA2 handhelds and desktop cards), default the Upscaler to FSR 3.1. The movie networks already get a linear stand-in on such GPUs. Players on those cards are unlikely to find this themselves: the resolution and quality rows barely move the frame rate there. What remains after that, from the FSR profile: - Draw passes are ~60% of GPU time and dispatches ~33%. - The largest single pass is the full-screen `43ec86f35fd937b9` (~4.5 ms at 922x576). - On the CPU, the replay costs ~33 ms a frame (`draw` 21.5, of which `descriptors` 7.9). Happy to re-profile a build on this Deck.
zackfairccff-bot commented 2026-11-10 21:11:21 +00:00 (Migrated from github.com)

Steam Deck LCD / RADV VANGOGH — v2.0.14: Best result so far, Kokiri gameplay renders, but severe flickering and ~19 FPS

Hi @NotRexed and everyone!

I'm following up on my previous Steam Deck LCD tests. On November 10, 2026, I achieved my best result so far using Hookshot v2.0.14.

The good news: Kokiri Forest is now visibly rendered, Link is controllable, and I can move around the environment.

The bad news: The whole image shakes, shimmers and flickers badly during movement and camera rotation. Performance is still around 19 FPS. It is far from playable.

System

  • Steam Deck LCD
  • SteamOS / Linux
  • AMD Custom GPU 0405 — RADV VANGOGH
  • Vulkan 1.4, driver 0x6801063
  • Hookshot v2.0.14, source f2796384
  • Native Linux executable
  • Game stored on external storage

Latest launch command

This is the launch configuration from my most recent testing sequence:

cd "/run/media/deck/f9b867d3-571f-493b-a22e-91206d74cdbc/GAMES/Hookshot-VanGogh-Jogo" &&
env
RX_VK_DECK_DEFAULTS=0
RX_VK_MESH_OPT=1
RX_VK_MESH_NOCULL=2c56dc1006942f74
RX_VK_WAIT_GPU=1
RX_VK_UB_SNAPSHOT=1
RX_VK_EVENT_WAITS=0
RX_VK_VRAM_MB=2048
RX_VK_TEX_MAX_MB=128
RX_VK_TEX_MAX_DIM=1024
RX_VK_MIRROR_MB=256
RX_VK_LOW_SPEC=1
RX_VK_CHECKPOINTS=1
HOS_HANDHELD=1
HOS_ASPECT=1.6
HOS_GRAPHICS_SCALE=0.75
./bin/hookshot

Unlike my previous experimental fork test, this command does not include "RX_VK_FORCE_MESH_FALLBACK=1" or "RX_VK_NO_MESH=1".

The latest log excerpt starts mid-execution, so it does not independently confirm which environment overrides were applied.

Measured results

Metric| Result
Presented frames| At least 5,846
Reported FPS| 18.9–19.1
Draws per frame| 2,771
Compute dispatches| 142
Shader programs| 52,305
Failed programs| 122
Textures| 1,261 / 2,032 MB
GPU time| 30.8 ms per frame
Replay submit time| 43.51 ms

Relevant log output:

vk: 5760 presents, 18.9 fps
a frame: 2771 draws (0 skipped)
142 dispatches, 167 passes
52305 programs (122 failed)
1261 textures (2032 MB)
vk: GPU time 30.8 ms a frame
vi: 5846 frames presented (19.1 fps)
display: window closed, exiting

No "VK_ERROR_DEVICE_LOST" appeared in the latest captured excerpt. The window was closed normally.

In a previous v2.0.14 run, the GPU failed with:

vk: batched submit 4006 failed (-4)
VK_ERROR_DEVICE_LOST

An earlier experimental build, v2.0.11-372-gef66f55, was tested with "RX_VK_FORCE_MESH_FALLBACK=1", "RX_VK_MESH_OPT=1", "RX_VK_MESH_NOCULL=2c56dc1006942f74" and the handheld/memory limits. That configuration reached roughly 14–15 FPS, with 121 failed programs.

Remaining issues

  1. Severe image shaking and shimmering when Link or the camera moves.
  2. Flickering and visually unstable environmental elements.
  3. Very low frame rate, approximately 19 FPS.
  4. 122 graphics programs still failing.
  5. Significant frame-time overhead.

I recorded an approximately 11-second video showing Link moving around Kokiri Forest, with the scenery and UI visible but unstable.

Questions

Could the remaining visual instability be related to the failed shader programs, mesh rendering, or synchronization?

Is there a recommended minimal configuration specifically for Steam Deck LCD with RADV VANGOGH?

Which diagnostic options or development branch would be most useful to test next?

I'm happy to continue testing and provide additional logs or video evidence.

Thanks for all the work on Linux and AMD compatibility. We've made progress from black screens and GPU resets to actual rendered gameplay, but the rendering and performance still need substantial improvements.

Steam Deck LCD / RADV VANGOGH — v2.0.14: Best result so far, Kokiri gameplay renders, but severe flickering and ~19 FPS Hi @NotRexed and everyone! I'm following up on my previous Steam Deck LCD tests. On November 10, 2026, I achieved my best result so far using Hookshot v2.0.14. The good news: Kokiri Forest is now visibly rendered, Link is controllable, and I can move around the environment. The bad news: The whole image shakes, shimmers and flickers badly during movement and camera rotation. Performance is still around 19 FPS. It is far from playable. System - Steam Deck LCD - SteamOS / Linux - AMD Custom GPU 0405 — RADV VANGOGH - Vulkan 1.4, driver 0x6801063 - Hookshot v2.0.14, source f2796384 - Native Linux executable - Game stored on external storage Latest launch command This is the launch configuration from my most recent testing sequence: cd "/run/media/deck/f9b867d3-571f-493b-a22e-91206d74cdbc/GAMES/Hookshot-VanGogh-Jogo" && \ env \ RX_VK_DECK_DEFAULTS=0 \ RX_VK_MESH_OPT=1 \ RX_VK_MESH_NOCULL=2c56dc1006942f74 \ RX_VK_WAIT_GPU=1 \ RX_VK_UB_SNAPSHOT=1 \ RX_VK_EVENT_WAITS=0 \ RX_VK_VRAM_MB=2048 \ RX_VK_TEX_MAX_MB=128 \ RX_VK_TEX_MAX_DIM=1024 \ RX_VK_MIRROR_MB=256 \ RX_VK_LOW_SPEC=1 \ RX_VK_CHECKPOINTS=1 \ HOS_HANDHELD=1 \ HOS_ASPECT=1.6 \ HOS_GRAPHICS_SCALE=0.75 \ ./bin/hookshot Unlike my previous experimental fork test, this command does not include "RX_VK_FORCE_MESH_FALLBACK=1" or "RX_VK_NO_MESH=1". The latest log excerpt starts mid-execution, so it does not independently confirm which environment overrides were applied. Measured results Metric| Result Presented frames| At least 5,846 Reported FPS| 18.9–19.1 Draws per frame| 2,771 Compute dispatches| 142 Shader programs| 52,305 Failed programs| 122 Textures| 1,261 / 2,032 MB GPU time| 30.8 ms per frame Replay submit time| 43.51 ms Relevant log output: vk: 5760 presents, 18.9 fps a frame: 2771 draws (0 skipped) 142 dispatches, 167 passes 52305 programs (122 failed) 1261 textures (2032 MB) vk: GPU time 30.8 ms a frame vi: 5846 frames presented (19.1 fps) display: window closed, exiting No "VK_ERROR_DEVICE_LOST" appeared in the latest captured excerpt. The window was closed normally. In a previous v2.0.14 run, the GPU failed with: vk: batched submit 4006 failed (-4) VK_ERROR_DEVICE_LOST An earlier experimental build, v2.0.11-372-gef66f55, was tested with "RX_VK_FORCE_MESH_FALLBACK=1", "RX_VK_MESH_OPT=1", "RX_VK_MESH_NOCULL=2c56dc1006942f74" and the handheld/memory limits. That configuration reached roughly 14–15 FPS, with 121 failed programs. Remaining issues 1. Severe image shaking and shimmering when Link or the camera moves. 2. Flickering and visually unstable environmental elements. 3. Very low frame rate, approximately 19 FPS. 4. 122 graphics programs still failing. 5. Significant frame-time overhead. I recorded an approximately 11-second video showing Link moving around Kokiri Forest, with the scenery and UI visible but unstable. Questions Could the remaining visual instability be related to the failed shader programs, mesh rendering, or synchronization? Is there a recommended minimal configuration specifically for Steam Deck LCD with RADV VANGOGH? Which diagnostic options or development branch would be most useful to test next? I'm happy to continue testing and provide additional logs or video evidence. Thanks for all the work on Linux and AMD compatibility. We've made progress from black screens and GPU resets to actual rendered gameplay, but the rendering and performance still need substantial improvements.
verrofy commented 2026-11-10 21:43:00 +00:00 (Migrated from github.com)

Told to post here from the discord
Archlinux with KDE plasma v6.8.1
Nvidia 2060 Super FE
Intel i7-10700k
NVIDIA-SMI 615.78.08
KMD Version: 615.78.08
CUDA UMD Version: 13.4
hookshot v2.0.14

Ground textures became broken after loading the Lon Lon Ranch title card mini-cutscene. Log attached.
hookshot_log.4.txt
Image

Image
Told to post here from the discord Archlinux with KDE plasma v6.8.1 Nvidia 2060 Super FE Intel i7-10700k NVIDIA-SMI 615.78.08 KMD Version: 615.78.08 CUDA UMD Version: 13.4 hookshot v2.0.14 Ground textures became broken after loading the Lon Lon Ranch title card mini-cutscene. Log attached. [hookshot_log.4.txt](https://github.com/user-attachments/files/34652406/hookshot_log.4.txt) <img width="1920" height="1080" alt="Image" src="https://github.com/user-attachments/assets/ce17bdc7-a758-457c-81ee-61b098bc7e7a" /> <img width="1920" height="1080" alt="Image" src="https://github.com/user-attachments/assets/862bbd4d-8697-4791-9965-aa60d61edfa6" />
NotRexed commented 2026-11-10 21:45:45 +00:00 (Migrated from github.com)

From Discord: Linux, NVIDIA RTX 2060 Super: the ground textures break after the Lon Lon Ranch cutscene. Same pattern as the ground textures going wrong after a while in #993; on NVIDIA Linux too, so not only AMD.

From Discord: Linux, NVIDIA RTX 2060 Super: the ground textures break after the Lon Lon Ranch cutscene. Same pattern as the ground textures going wrong after a while in #993; on NVIDIA Linux too, so not only AMD.
addisonbair commented 2026-11-10 22:45:41 +00:00 (Migrated from github.com)

Steam Deck OLED (stock SteamOS 3.9.5), v2.0.14: the config that plays best here, ~24 fps base in Kokiri village (~48 with 2x frame generation)

These are working settings for other Deck owners, not a fix. Each one was measured on this Deck.

hookshot_env.txt:

HOS_HANDHELD=1
RX_VK_MESH_OPT=1            # no GPU hang at the Deku Tree (#1965 makes this the RADV default)
RX_VK_PER_QUEUE_FENCES=0    # with the next line: no one-frame white flashes (#1005)
RX_VK_WAIT_GPU=0
RX_VK_BATCH_MAX=4           # held submits sent sooner: ~+10% draws/s, smoother
RADV_PERFTEST=cswave32      # compute in wave32: ~+8-17% here

In-game menu: Handheld profile On, Upscaler AMD FSR 3.1 at Performance, Frame generation 2x, Descriptor reuse On, Sampler cache Off.

Steam > Performance, per-game profile: Manual GPU Clock 1200 MHz. This was the surprise. The Deck shares 15 W between CPU and GPU. On the automatic clock, in a busy view, the CPU ran at 3.5 GHz and the GPU was starved: GPU time 42.7 ms, 18.0 fps. Pinning the GPU at 1000 MHz in the same scene gave 31.3 ms and 21.7 fps, with CPU and GPU about even (~31 ms each). 1200 MHz played best.

Why FSR Performance: on RDNA2 the game's own TAAU network costs ~12 ms a frame (my comment above). FSR 3.1 replaces it, and Performance halved GPU time here (38 to 21 ms). That leaves the Deck CPU-bound on the replay (~25-35 ms a frame at ~1,800-2,300 draws).

**Steam Deck OLED (stock SteamOS 3.9.5), v2.0.14: the config that plays best here, ~24 fps base in Kokiri village (~48 with 2x frame generation)** These are working settings for other Deck owners, not a fix. Each one was measured on this Deck. `hookshot_env.txt`: ``` HOS_HANDHELD=1 RX_VK_MESH_OPT=1 # no GPU hang at the Deku Tree (#1965 makes this the RADV default) RX_VK_PER_QUEUE_FENCES=0 # with the next line: no one-frame white flashes (#1005) RX_VK_WAIT_GPU=0 RX_VK_BATCH_MAX=4 # held submits sent sooner: ~+10% draws/s, smoother RADV_PERFTEST=cswave32 # compute in wave32: ~+8-17% here ``` In-game menu: Handheld profile On, Upscaler AMD FSR 3.1 at Performance, Frame generation 2x, Descriptor reuse On, Sampler cache Off. **Steam > Performance, per-game profile: Manual GPU Clock 1200 MHz.** This was the surprise. The Deck shares 15 W between CPU and GPU. On the automatic clock, in a busy view, the CPU ran at 3.5 GHz and the GPU was starved: GPU time 42.7 ms, 18.0 fps. Pinning the GPU at 1000 MHz in the same scene gave 31.3 ms and 21.7 fps, with CPU and GPU about even (~31 ms each). 1200 MHz played best. Why FSR Performance: on RDNA2 the game's own TAAU network costs ~12 ms a frame (my comment above). FSR 3.1 replaces it, and Performance halved GPU time here (38 to 21 ms). That leaves the Deck CPU-bound on the replay (~25-35 ms a frame at ~1,800-2,300 draws).
avaseward commented 2026-11-10 22:47:54 +00:00 (Migrated from github.com)

I made the issue about it crashing on steam deck after the cutscene, wanted to let you know that it did it again after updating to 2.0.14

I made the issue about it crashing on steam deck after the cutscene, wanted to let you know that it did it again after updating to 2.0.14
zackfairccff-bot commented 2026-11-10 23:18:32 +00:00 (Migrated from github.com)

https://github.com/user-attachments/assets/ea390974-a5cd-4f07-b7d9-0d7048ceffae
hookshot_test13_flashing_evidence(1).png

https://github.com/user-attachments/assets/69829125-85fc-44ce-95af-dc3e0532b931

Steam Deck LCD / RADV VANGOGH — Hookshot v2.0.14: Native mesh rendering works, but severe black flashing and judder persist

Hi @NotRexed and contributors,

I'm sharing a follow-up with reproducible results from five consecutive tests on my Steam Deck LCD.

System

  • Steam Deck LCD, SteamOS 3.9.5
  • AMD Custom GPU 0405 (RADV VANGOGH)
  • Vulkan 1.4, driver "0x6801063"
  • Hookshot v2.0.14, source "f2796384"
  • Native Linux executable

Progress

Kokiri Forest now loads, Link is controllable, and the environment renders with native mesh shaders enabled. I am no longer using "RX_VK_NO_MESH=1" or "RX_VK_FORCE_MESH_FALLBACK=1".

Test 11 confirms that "RX_VK_MESH_NOCULL=2c56dc1006942f74" was applied successfully.

However, severe graphical problems remain:

  • Sudden black/dark flashing, even while Link is almost stationary.
  • Link temporarily becomes a dark silhouette while the HUD remains visible.
  • Irregular black polygons and visibly corrupted scenery.
  • Severe judder and ghost-like image doubling during movement.
  • Performance generally remains around 15–23 FPS in demanding areas.

Test comparison

Test| Main change| Median FPS*
09| Base configuration, 75% scale| 17.9
10| Reduced scale to 50%| 15.8
11| Rebuilt installation, 75% scale| 15.4
12| Added "RX_VK_BATCH_POLL_US=2000"| 17.9
13| Also set "RX_VK_WAIT_GPU=0" and "RX_VK_PER_QUEUE_FENCES=0"| 18.1

These are medians from sampled scenes with at least 1,000 draws/frame, not controlled comparisons at identical locations.

Important findings

Reducing render resolution did not consistently improve performance.

Batch polling may have helped responsiveness, but the visual corruption appeared worse.

Test 13 used both synchronization workarounds reported in issue #1005. Unfortunately, the black flashing remained clearly visible in the attached video. Since two variables changed together, I cannot identify their individual effects yet.

All five captured sessions ended normally, without "VK_ERROR_DEVICE_LOST" in the application logs. However, earlier versions on this same device experienced GPU timeouts.

The later logs also report 11 failed shader programs.

Video evidence

  • Test 12: "VID_20261110_194253_MUTED.mp4"
  • Test 13: "VID_20261110_195529_MUTED.mp4"

Both videos have no audio. They demonstrate the persistent black flashes and visual instability.

The complete launch commands for tests 09–13 and the application logs are available.

Questions for developers

  1. What is the recommended minimal configuration for preserving native mesh geometry and correct lighting on Steam Deck LCD?
  2. Would testing "RX_VK_MESH_OPT=1" without "RX_VK_MESH_NOCULL" be useful?
  3. Could the remaining corruption be related to exposure buffers, shader translation or GPU synchronization?
  4. Is AMD FSR 3.1 Quality with frame generation disabled the recommended approach for maximizing image quality on VANGOGH?

My priority is a faithful and visually stable experience, rather than artificially increasing the displayed FPS.

Finally, I want to sincerely thank @NotRexed and everyone contributing to this project. It's impressive to see how much progress has already been made, especially on hardware as challenging as the Steam Deck.

I'm genuinely happy to contribute through testing, detailed logs, and gameplay footage. Even when a test doesn't produce the expected result, I hope the information can help move the project forward.

I'm not a developer, but I'm enthusiastic about helping make this experience as faithful, stable, and enjoyable as possible on the Steam Deck. I'm happy to keep testing new builds, workarounds, or specific configurations whenever useful.

Thank you again for your dedication and for making this project possible!

https://github.com/user-attachments/assets/ea390974-a5cd-4f07-b7d9-0d7048ceffae ![hookshot_test13_flashing_evidence(1).png](https://github.com/user-attachments/assets/f12d6e4d-d471-4e46-ab38-3b22cadc191c) https://github.com/user-attachments/assets/69829125-85fc-44ce-95af-dc3e0532b931 Steam Deck LCD / RADV VANGOGH — Hookshot v2.0.14: Native mesh rendering works, but severe black flashing and judder persist Hi @NotRexed and contributors, I'm sharing a follow-up with reproducible results from five consecutive tests on my Steam Deck LCD. System - Steam Deck LCD, SteamOS 3.9.5 - AMD Custom GPU 0405 (RADV VANGOGH) - Vulkan 1.4, driver "0x6801063" - Hookshot v2.0.14, source "f2796384" - Native Linux executable Progress Kokiri Forest now loads, Link is controllable, and the environment renders with native mesh shaders enabled. I am no longer using "RX_VK_NO_MESH=1" or "RX_VK_FORCE_MESH_FALLBACK=1". Test 11 confirms that "RX_VK_MESH_NOCULL=2c56dc1006942f74" was applied successfully. However, severe graphical problems remain: - Sudden black/dark flashing, even while Link is almost stationary. - Link temporarily becomes a dark silhouette while the HUD remains visible. - Irregular black polygons and visibly corrupted scenery. - Severe judder and ghost-like image doubling during movement. - Performance generally remains around 15–23 FPS in demanding areas. Test comparison Test| Main change| Median FPS* 09| Base configuration, 75% scale| 17.9 10| Reduced scale to 50%| 15.8 11| Rebuilt installation, 75% scale| 15.4 12| Added "RX_VK_BATCH_POLL_US=2000"| 17.9 13| Also set "RX_VK_WAIT_GPU=0" and "RX_VK_PER_QUEUE_FENCES=0"| 18.1 These are medians from sampled scenes with at least 1,000 draws/frame, not controlled comparisons at identical locations. Important findings Reducing render resolution did not consistently improve performance. Batch polling may have helped responsiveness, but the visual corruption appeared worse. Test 13 used both synchronization workarounds reported in issue #1005. Unfortunately, the black flashing remained clearly visible in the attached video. Since two variables changed together, I cannot identify their individual effects yet. All five captured sessions ended normally, without "VK_ERROR_DEVICE_LOST" in the application logs. However, earlier versions on this same device experienced GPU timeouts. The later logs also report 11 failed shader programs. Video evidence - Test 12: "VID_20261110_194253_MUTED.mp4" - Test 13: "VID_20261110_195529_MUTED.mp4" Both videos have no audio. They demonstrate the persistent black flashes and visual instability. The complete launch commands for tests 09–13 and the application logs are available. Questions for developers 1. What is the recommended minimal configuration for preserving native mesh geometry and correct lighting on Steam Deck LCD? 2. Would testing "RX_VK_MESH_OPT=1" without "RX_VK_MESH_NOCULL" be useful? 3. Could the remaining corruption be related to exposure buffers, shader translation or GPU synchronization? 4. Is AMD FSR 3.1 Quality with frame generation disabled the recommended approach for maximizing image quality on VANGOGH? My priority is a faithful and visually stable experience, rather than artificially increasing the displayed FPS. Finally, I want to sincerely thank @NotRexed and everyone contributing to this project. It's impressive to see how much progress has already been made, especially on hardware as challenging as the Steam Deck. I'm genuinely happy to contribute through testing, detailed logs, and gameplay footage. Even when a test doesn't produce the expected result, I hope the information can help move the project forward. I'm not a developer, but I'm enthusiastic about helping make this experience as faithful, stable, and enjoyable as possible on the Steam Deck. I'm happy to keep testing new builds, workarounds, or specific configurations whenever useful. Thank you again for your dedication and for making this project possible!
addisonbair commented 2026-11-10 23:33:20 +00:00 (Migrated from github.com)

Steam Deck: main (fc375e9) is ~28% slower than v2.0.14 at the same scene, and the vcore counters went up ~7x

Steam Deck OLED, SteamOS 3.9.5, RADV. Both builds are from source with the v2.0.14 AppImage toolchain, run with the same options file and env (RX_VK_MESH_OPT=1 RX_VK_PER_QUEUE_FENCES=0 RX_VK_WAIT_GPU=0 RX_VK_BATCH_MAX=4 RADV_PERFTEST=cswave32, FSR 3.1 Performance, handheld, frame generation off). Same save, Kokiri village, Link idle, ~1,770 draws a frame in both:

fps draws/s GPU time replay submit
v2.0.14 22.4 39,600 27.0 ms 31.2 ms
fc375e9 15.4-16.1 (three runs) 27,700-28,600 22.7-28.8 ms 31.3-32.7 ms

GPU time and replay cost are the same or better on main, but each frame is ~17 ms longer. The difference shows up in the vcores: line (per 5 s):

v2.0.14:  53649 takes,  12625 waits (mean 308 us), 7488 kicks,  7584 yields
fc375e9: 327573 takes,  88083 waits (mean 51 us),  59089 kicks, 59391 yields
fc375e9: 346916 takes,  92405 waits (mean 47 us),  61379 kicks, 61652 yields

On the Deck's 4 cores / 8 threads, I think that churn is what costs the frame time.

Ruled out on the Deck:

  • #1430 (process affinity): HOS_RESERVE_CORE=0 on main gives 15.7 fps, with the counters the same.
  • Anti-Lag 2: off by default, and never active here.
  • An options migration: the options file is identical in both runs.
  • RX_VK_TASK_MESH_FALLBACK=1: 16.1 fps, the same as native.

Between v2.0.14 and fc375e9, the only change to the vcore and wait code I can find is #1696 (WaitAny's scan without the checkpoint, event_peek in place of event_wait(e, 0, 1)). That's a guess from reading the code. I'll build main with only #1696 reverted and post the Deck result.

**Steam Deck: `main` (fc375e9) is ~28% slower than v2.0.14 at the same scene, and the vcore counters went up ~7x** Steam Deck OLED, SteamOS 3.9.5, RADV. Both builds are from source with the v2.0.14 AppImage toolchain, run with the same options file and env (`RX_VK_MESH_OPT=1 RX_VK_PER_QUEUE_FENCES=0 RX_VK_WAIT_GPU=0 RX_VK_BATCH_MAX=4 RADV_PERFTEST=cswave32`, FSR 3.1 Performance, handheld, frame generation off). Same save, Kokiri village, Link idle, ~1,770 draws a frame in both: | | fps | draws/s | `GPU time` | replay `submit` | |---|---|---|---|---| | v2.0.14 | 22.4 | 39,600 | 27.0 ms | 31.2 ms | | fc375e9 | 15.4-16.1 (three runs) | 27,700-28,600 | 22.7-28.8 ms | 31.3-32.7 ms | GPU time and replay cost are the same or better on `main`, but each frame is ~17 ms longer. The difference shows up in the `vcores:` line (per 5 s): ``` v2.0.14: 53649 takes, 12625 waits (mean 308 us), 7488 kicks, 7584 yields fc375e9: 327573 takes, 88083 waits (mean 51 us), 59089 kicks, 59391 yields fc375e9: 346916 takes, 92405 waits (mean 47 us), 61379 kicks, 61652 yields ``` On the Deck's 4 cores / 8 threads, I think that churn is what costs the frame time. Ruled out on the Deck: - **#1430** (process affinity): `HOS_RESERVE_CORE=0` on `main` gives 15.7 fps, with the counters the same. - **Anti-Lag 2:** off by default, and never active here. - **An options migration:** the options file is identical in both runs. - **`RX_VK_TASK_MESH_FALLBACK=1`:** 16.1 fps, the same as native. Between v2.0.14 and fc375e9, the only change to the vcore and wait code I can find is **#1696** (`WaitAny`'s scan without the checkpoint, `event_peek` in place of `event_wait(e, 0, 1)`). That's a guess from reading the code. I'll build `main` with only #1696 reverted and post the Deck result.
addisonbair commented 2026-11-10 23:52:33 +00:00 (Migrated from github.com)

Follow-up: #1696 is not it. fc375e9 with #1696 reverted (same Deck, same save and settings): 16.2 fps, 28,861 draws/s. That's no different from fc375e9 (15.4-16.1), against v2.0.14's 22.4.

The revert did cut the vcore churn (232834 takes, 35922 waits, 17925 kicks per 5 s, from ~337k / ~90k / ~60k), so the churn follows main without being what costs the frame.

What does line up: on main the GPU time and the replay add up to the frame, and on v2.0.14 they overlap.

GPU time replay submit frame
v2.0.14 27.0 ms 31.2 ms ~45 ms
fc375e9 - #1696 28.6 ms 30.4 ms ~62 ms

So something since v2.0.14 seems to make the replay wait for the GPU (or the reverse) once per frame, on RADV at least. Frame generation was off in every run, so the present-ahead path isn't involved.

**Follow-up: #1696 is not it.** fc375e9 with #1696 reverted (same Deck, same save and settings): **16.2 fps**, 28,861 draws/s. That's no different from fc375e9 (15.4-16.1), against v2.0.14's 22.4. The revert did cut the vcore churn (`232834 takes, 35922 waits, 17925 kicks` per 5 s, from ~337k / ~90k / ~60k), so the churn follows `main` without being what costs the frame. What does line up: on `main` the GPU time and the replay add up to the frame, and on v2.0.14 they overlap. | | `GPU time` | replay `submit` | frame | |---|---|---|---| | v2.0.14 | 27.0 ms | 31.2 ms | ~45 ms | | fc375e9 - #1696 | 28.6 ms | 30.4 ms | ~62 ms | So something since v2.0.14 seems to make the replay wait for the GPU (or the reverse) once per frame, on RADV at least. Frame generation was off in every run, so the present-ahead path isn't involved.
rere225 commented 2026-11-11 00:23:36 +00:00 (Migrated from github.com)

RX 6900 XT (RADV NAVI21, PCI 1002:73af), Fedora 44, v2.0.14: GPU hang entering the Great Deku Tree with MESH_OPT + MESH_NOCULL, and a kernel timeout finding

System: RX 6900 XT 16 GB, Mesa 26.2.6 (driver 0x6802006), kernel 7.2.15-200.fc44, KDE Plasma 6.8.2 Wayland, i7-13700K, 32 GB RAM, output 2560x1440, Upscaler: game's own, frame generation off, robust buffers on.

hookshot_env.txt:
RX_VK_MESH_OPT=1
RX_VK_MESH_NOCULL=2c56dc1006942f74
RX_VK_CHECKPOINTS=1

What happens: Kokiri Forest plays fine (GPU time 12-14 ms a frame). Entering the Great Deku Tree, or loading a save inside it, hangs the GPU every time. 6 hangs in one evening.

1. Kernels 7.x default amdgpu.lockup_timeout to 2000 ms (modinfo amdgpu: "default: 2000", on 7.1.8, 7.2.11 and 7.2.15), not the 10 s the comments in the code assume. With the default, every hang showed a submit blocked 2.5-3.0 s, then device lost.

2. It is a real hang, not a slow pass. With amdgpu.lockup_timeout=30000 the save loads and plays about 5,500 frames, then on entering the tree the GPU stays stuck for the full 30 s (hid: the game read no controller for 30.3 s) until the reset:

amdgpu: ring gfx_0.0.0 timeout, signaled seq=42343, emitted seq=42345
amdgpu: Process hookshot pid 10280 thread Presentation Th
amdgpu: Ring gfx_0.0.0 reset failed
amdgpu: GPU reset begin!. Source: 1
amdgpu: VRAM is lost due to GPU reset!

Markers of that hang (frame 5530):
RUNNING after: marker 3672141 (draw of program 636eed4d5000d1c0)
reached, earlier work unfinished: 55f9da6996166520 (x4), 87eab3665f2b872c, 918adef1afaa39d4, 0bbb4eef0b5122e9

Earlier hangs at the 2 s default pointed at mesh programs e3f341ac12c40e2c, 918adef1afaa39d4 and 31526778a6b5ade2. 918adef1afaa39d4 is in both. Some hangs time out on a compute ring (comp_1.x.0) and some on gfx_0.0.0.

Also: each MODE1 reset kills Xwayland and plasmashell, and once left one monitor frozen ([CRTC:494] flip_done timed out) until reboot.

Log attached. Happy to test RX_VK_TASK_MESH_FALLBACK=1 on RADV Navi 21 as soon as it is in a release.

hookshot_log.1.txt
hookshot_log.2.txt
hookshot_log.3.txt

**RX 6900 XT (RADV NAVI21, PCI 1002:73af), Fedora 44, v2.0.14: GPU hang entering the Great Deku Tree with MESH_OPT + MESH_NOCULL, and a kernel timeout finding** **System:** RX 6900 XT 16 GB, Mesa 26.2.6 (driver 0x6802006), kernel 7.2.15-200.fc44, KDE Plasma 6.8.2 Wayland, i7-13700K, 32 GB RAM, output 2560x1440, Upscaler: game's own, frame generation off, robust buffers on. **hookshot_env.txt:** RX_VK_MESH_OPT=1 RX_VK_MESH_NOCULL=2c56dc1006942f74 RX_VK_CHECKPOINTS=1 **What happens:** Kokiri Forest plays fine (GPU time 12-14 ms a frame). Entering the Great Deku Tree, or loading a save inside it, hangs the GPU every time. 6 hangs in one evening. **1. Kernels 7.x default `amdgpu.lockup_timeout` to 2000 ms** (`modinfo amdgpu`: "default: 2000", on 7.1.8, 7.2.11 and 7.2.15), not the 10 s the comments in the code assume. With the default, every hang showed a submit blocked 2.5-3.0 s, then device lost. **2. It is a real hang, not a slow pass.** With `amdgpu.lockup_timeout=30000` the save loads and plays about 5,500 frames, then on entering the tree the GPU stays stuck for the full 30 s (`hid: the game read no controller for 30.3 s`) until the reset: amdgpu: ring gfx_0.0.0 timeout, signaled seq=42343, emitted seq=42345 amdgpu: Process hookshot pid 10280 thread Presentation Th amdgpu: Ring gfx_0.0.0 reset failed amdgpu: GPU reset begin!. Source: 1 amdgpu: VRAM is lost due to GPU reset! **Markers of that hang (frame 5530):** RUNNING after: marker 3672141 (draw of program 636eed4d5000d1c0) reached, earlier work unfinished: 55f9da6996166520 (x4), 87eab3665f2b872c, 918adef1afaa39d4, 0bbb4eef0b5122e9 Earlier hangs at the 2 s default pointed at mesh programs e3f341ac12c40e2c, 918adef1afaa39d4 and 31526778a6b5ade2. 918adef1afaa39d4 is in both. Some hangs time out on a compute ring (comp_1.x.0) and some on gfx_0.0.0. **Also:** each MODE1 reset kills Xwayland and plasmashell, and once left one monitor frozen (`[CRTC:494] flip_done timed out`) until reboot. Log attached. Happy to test `RX_VK_TASK_MESH_FALLBACK=1` on RADV Navi 21 as soon as it is in a release. [hookshot_log.1.txt](https://github.com/user-attachments/files/34660578/hookshot_log.1.txt) [hookshot_log.2.txt](https://github.com/user-attachments/files/34660579/hookshot_log.2.txt) [hookshot_log.3.txt](https://github.com/user-attachments/files/34660577/hookshot_log.3.txt)
KewinBR commented 2026-11-11 00:45:44 +00:00 (Migrated from github.com)

Steam Deck LCD (RADV VANGOGH): the cull task 2c56dc1006942f74 still hangs the GPU with RX_VK_MESH_NOCULL, in open areas. The compute mesh fallback doesn't hang.

Build: v2.0.12 renderer with NOCULL on for 2c56dc1006942f74 (#1300), RX_VK_MESH_OPT=1, RX_VK_WAIT_GPU=1, handheld, 1280x800 output. Tested on SteamOS 3.8.28 and again after updating to 3.9.5 (kernel 7.2, vulkan-radeon 26.05.19): same result on both.

Repro: a save in Lon Lon Ranch, turning the camera towards the open landscape. In Game Mode the player gets a ring gfx_0.0.0 timeout and a MODE2 reset after 1 to 3 minutes. Headless (RX_VK_CHECKPOINTS=1, the camera turned through HOS_INPUT_LIVE), the same save hangs 5 out of 5 runs, always between frames 3,800 and 5,100 of the same camera script. With the camera still, it ran 13,200 frames without a hang.

What the markers say: every time, the draw left running is one whose task stage is 2c56dc1006942f74. It was de17bf97df88d1aa (mesh 201388b3ce37de7f) four times and 5e15283778a635bf once.

What I ruled out:

  • RX_VK_MESH_NOCULL=0 hangs right after the save loads: the original #817 hang.
  • Leaving out de17bf97df88d1aa (RX_VK_SKIP_PROG) only moves the hang to another program with the same task code.
  • It isn't the grid walk. I read the IR (RX_VK_IR, after mesh_nocull). The two pairs of loops stay in the program, because dead code elimination doesn't remove them, but both ends of each loop are clamped to [0, grid size - 1]. The grid size comes from GetCbufU32x2 #3, #3088. I also replaced that read with 1, which pins the loops to a single iteration (22 reads replaced). It still hung at the same point.
  • It isn't a huge draw. RX_VK_LOG_MESH_DRAWS reports 32 groups for the largest mesh draw of the session.
  • The kernel log shows no VM fault, only the ring timeout.

What works: RX_VK_FORCE_MESH_FALLBACK=1. It ran 15 minutes on the same save with the same camera script, with no hang and nothing missing in the screenshots, at 18 fps against 21 fps on the native path. We use it as the default for now.

My guess is that drawing every meshlet, including the ones the game would have culled, sends RADV something it can't finish when the view is that open. I haven't found what yet. I can run builds or switches on this Deck with this save if that helps.

**Steam Deck LCD (RADV VANGOGH): the cull task 2c56dc1006942f74 still hangs the GPU with RX_VK_MESH_NOCULL, in open areas. The compute mesh fallback doesn't hang.** Build: v2.0.12 renderer with NOCULL on for `2c56dc1006942f74` (#1300), `RX_VK_MESH_OPT=1`, `RX_VK_WAIT_GPU=1`, handheld, 1280x800 output. Tested on SteamOS 3.8.28 and again after updating to 3.9.5 (kernel 7.2, vulkan-radeon 26.05.19): same result on both. **Repro:** a save in Lon Lon Ranch, turning the camera towards the open landscape. In Game Mode the player gets a `ring gfx_0.0.0 timeout` and a MODE2 reset after 1 to 3 minutes. Headless (`RX_VK_CHECKPOINTS=1`, the camera turned through `HOS_INPUT_LIVE`), the same save hangs 5 out of 5 runs, always between frames 3,800 and 5,100 of the same camera script. With the camera still, it ran 13,200 frames without a hang. **What the markers say:** every time, the draw left running is one whose task stage is `2c56dc1006942f74`. It was `de17bf97df88d1aa` (mesh `201388b3ce37de7f`) four times and `5e15283778a635bf` once. **What I ruled out:** - `RX_VK_MESH_NOCULL=0` hangs right after the save loads: the original #817 hang. - Leaving out `de17bf97df88d1aa` (`RX_VK_SKIP_PROG`) only moves the hang to another program with the same task code. - It isn't the grid walk. I read the IR (`RX_VK_IR`, after `mesh_nocull`). The two pairs of loops stay in the program, because dead code elimination doesn't remove them, but both ends of each loop are clamped to `[0, grid size - 1]`. The grid size comes from `GetCbufU32x2 #3, #3088`. I also replaced that read with 1, which pins the loops to a single iteration (22 reads replaced). It still hung at the same point. - It isn't a huge draw. `RX_VK_LOG_MESH_DRAWS` reports 32 groups for the largest mesh draw of the session. - The kernel log shows no VM fault, only the ring timeout. **What works:** `RX_VK_FORCE_MESH_FALLBACK=1`. It ran 15 minutes on the same save with the same camera script, with no hang and nothing missing in the screenshots, at 18 fps against 21 fps on the native path. We use it as the default for now. My guess is that drawing every meshlet, including the ones the game would have culled, sends RADV something it can't finish when the view is that open. I haven't found what yet. I can run builds or switches on this Deck with this save if that helps.
sabogalc commented 2026-11-11 00:59:22 +00:00 (Migrated from github.com)

RX 6800 XT GPU hangs on CachyOS / RADV — Hookshot v2.0.14

I'm experiencing reproducible GPU hangs with an AMD Radeon RX 6800 XT when running Hookshot on CachyOS.

I've tested the available mesh-shader workarounds, and disabling mesh shaders entirely allows the game to run successfully.

System information

  • GPU: AMD Radeon RX 6800 XT (NAVI21 / RDNA2)
  • Integrated GPU: AMD Radeon 840M
  • OS: CachyOS
  • Display server: Wayland
  • Vulkan driver: RADV
  • Mesa: 26.2.6-arch3.1
  • Vulkan API: 1.4.354
  • Hookshot: v2.0.14
  • Kernel: 7.3.3-1-cachyos
==========
VULKANINFO
==========

Vulkan Instance Version: 1.4.363


Instance Extensions: count = 26
-------------------------------
VK_EXT_acquire_drm_display             : extension revision 1
VK_EXT_acquire_xlib_display            : extension revision 1
VK_EXT_debug_report                    : extension revision 10
VK_EXT_debug_utils                     : extension revision 2
VK_EXT_direct_mode_display             : extension revision 1
VK_EXT_display_surface_counter         : extension revision 1
VK_EXT_headless_surface                : extension revision 1
VK_EXT_layer_settings                  : extension revision 2
VK_EXT_surface_maintenance1            : extension revision 1
VK_EXT_swapchain_colorspace            : extension revision 5
VK_KHR_device_group_creation           : extension revision 1
VK_KHR_display                         : extension revision 23
VK_KHR_external_fence_capabilities     : extension revision 1
VK_KHR_external_memory_capabilities    : extension revision 1
VK_KHR_external_semaphore_capabilities : extension revision 1
VK_KHR_get_display_properties2         : extension revision 1
VK_KHR_get_physical_device_properties2 : extension revision 2
VK_KHR_get_surface_capabilities2       : extension revision 1
VK_KHR_portability_enumeration         : extension revision 1
VK_KHR_surface                         : extension revision 25
VK_KHR_surface_maintenance1            : extension revision 1
VK_KHR_surface_protected_capabilities  : extension revision 1
VK_KHR_wayland_surface                 : extension revision 6
VK_KHR_xcb_surface                     : extension revision 6
VK_KHR_xlib_surface                    : extension revision 6
VK_LUNARG_direct_driver_loading        : extension revision 1

Instance Layers: count = 7
--------------------------
VK_LAYER_KHRONOS_profiles   Khronos Profiles layer                                       1.4.363  version 1
VK_LAYER_KHRONOS_validation Khronos Validation Layer                                     1.4.363  version 1
VK_LAYER_LUNARG_api_dump    LunarG API dump layer                                        1.4.363  version 2
VK_LAYER_LUNARG_monitor     Execution Monitoring Layer                                   1.4.363  version 1
VK_LAYER_LUNARG_screenshot  LunarG image capture layer                                   1.4.363  version 1
VK_LAYER_MESA_anti_lag      Open-source implementation of the VK_AMD_anti_lag extension. 1.4.303  version 1
VK_LAYER_MESA_device_select Linux device selection layer                                 1.4.303  version 1

Devices:
========
GPU0:
        apiVersion         = 1.4.354
        driverVersion      = 26.2.6
        vendorID           = 0x1002
        deviceID           = 0x73bf
        deviceType         = PHYSICAL_DEVICE_TYPE_DISCRETE_GPU
        deviceName         = AMD Radeon RX 6800 XT (RADV NAVI21)
        driverID           = DRIVER_ID_MESA_RADV
        driverName         = radv
        driverInfo         = Mesa 26.2.6-arch3.1
        conformanceVersion = 1.4.5.3
        deviceUUID         = 00000000-6400-0000-0000-000000000000
        driverUUID         = 414d442d-4d45-5341-2d44-525600000000
GPU1:
        apiVersion         = 1.4.354
        driverVersion      = 26.2.6
        vendorID           = 0x1002
        deviceID           = 0x1114
        deviceType         = PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU
        deviceName         = AMD Radeon 840M Graphics (RADV KRACKAN1)
        driverID           = DRIVER_ID_MESA_RADV
        driverName         = radv
        driverInfo         = Mesa 26.2.6-arch3.1
        conformanceVersion = 1.4.5.3
        deviceUUID         = 00000000-c100-0000-0000-000000000000
        driverUUID         = 414d442d-4d45-5341-2d44-525600000000

Problem description

When launching Hookshot normally, the game triggers an AMDGPU GPU hang.

The display session disconnects, and the kernel reports repeated graphics and compute ring timeouts, eventually requiring a full GPU reset.

This has reproduced multiple times.

The kernel identifies Hookshot as the process responsible for the outstanding GPU work.

Kernel logs

The following errors consistently appear:

amdgpu: ring gfx_0.0.0 timeout
amdgpu: Process hookshot
amdgpu: Starting gfx_0.0.0 ring reset
amdgpu: Ring gfx_0.0.0 reset succeeded

amdgpu: ring comp_1.x.x timeout
amdgpu: Ring comp_1.x.x reset failed

amdgpu: GPU reset begin!
amdgpu: GPU mode1 reset
amdgpu: GPU reset succeeded, trying to resume
amdgpu: VRAM is lost due to GPU reset!

Different compute rings have timed out across different runs, including:

  • comp_1.3.1
  • comp_1.1.0
  • comp_1.1.1

The GPU reset itself succeeds, but the problem reproduces when launching the game again.

Testing and workarounds

1. Normal launch

./hookshot

Result: GPU hangs, AMDGPU ring timeouts, and full GPU reset.

2. AMD debugging enabled

AMD_DEBUG=hang RX_VK_CHECKPOINTS=1 ./hookshot

Result: Does not prevent the GPU hang.

3. Disable mesh shaders

RX_VK_NO_MESH=1 ./hookshot

Result: The launcher opens and the game runs successfully.

This is currently the only tested workaround that allows me to play.

4. Disable the specific mesh culling task

RX_VK_MESH_NOCULL=2c56dc1006942f74 ./hookshot

Result: Does not resolve the issue. The game still exhibits the original problem.

Observations

The fact that RX_VK_NO_MESH=1 allows the game to run successfully, while RX_VK_MESH_NOCULL=2c56dc1006942f74 does not, suggests the issue may involve something beyond the specific culling task.

It appears to be related to the mesh-shader rendering path on RDNA2/RADV, although I cannot determine whether the underlying problem is in Hookshot, RADV, or their interaction.

I'm running the latest Hookshot v2.0.14.

Questions

  1. Is this a known RADV/RDNA2 mesh-shader compatibility issue?
  2. Are there other mesh-shader-related workarounds worth testing?
  3. Could this be a separate issue from the specific task-shader culling problem already discussed in this tracker?
# RX 6800 XT GPU hangs on CachyOS / RADV — Hookshot v2.0.14 I'm experiencing reproducible GPU hangs with an AMD Radeon RX 6800 XT when running Hookshot on CachyOS. I've tested the available mesh-shader workarounds, and disabling mesh shaders entirely allows the game to run successfully. ## System information - **GPU:** AMD Radeon RX 6800 XT (NAVI21 / RDNA2) - **Integrated GPU:** AMD Radeon 840M - **OS:** CachyOS - **Display server:** Wayland - **Vulkan driver:** RADV - **Mesa:** 26.2.6-arch3.1 - **Vulkan API:** 1.4.354 - **Hookshot:** v2.0.14 - **Kernel:** 7.3.3-1-cachyos ``` ========== VULKANINFO ========== Vulkan Instance Version: 1.4.363 Instance Extensions: count = 26 ------------------------------- VK_EXT_acquire_drm_display : extension revision 1 VK_EXT_acquire_xlib_display : extension revision 1 VK_EXT_debug_report : extension revision 10 VK_EXT_debug_utils : extension revision 2 VK_EXT_direct_mode_display : extension revision 1 VK_EXT_display_surface_counter : extension revision 1 VK_EXT_headless_surface : extension revision 1 VK_EXT_layer_settings : extension revision 2 VK_EXT_surface_maintenance1 : extension revision 1 VK_EXT_swapchain_colorspace : extension revision 5 VK_KHR_device_group_creation : extension revision 1 VK_KHR_display : extension revision 23 VK_KHR_external_fence_capabilities : extension revision 1 VK_KHR_external_memory_capabilities : extension revision 1 VK_KHR_external_semaphore_capabilities : extension revision 1 VK_KHR_get_display_properties2 : extension revision 1 VK_KHR_get_physical_device_properties2 : extension revision 2 VK_KHR_get_surface_capabilities2 : extension revision 1 VK_KHR_portability_enumeration : extension revision 1 VK_KHR_surface : extension revision 25 VK_KHR_surface_maintenance1 : extension revision 1 VK_KHR_surface_protected_capabilities : extension revision 1 VK_KHR_wayland_surface : extension revision 6 VK_KHR_xcb_surface : extension revision 6 VK_KHR_xlib_surface : extension revision 6 VK_LUNARG_direct_driver_loading : extension revision 1 Instance Layers: count = 7 -------------------------- VK_LAYER_KHRONOS_profiles Khronos Profiles layer 1.4.363 version 1 VK_LAYER_KHRONOS_validation Khronos Validation Layer 1.4.363 version 1 VK_LAYER_LUNARG_api_dump LunarG API dump layer 1.4.363 version 2 VK_LAYER_LUNARG_monitor Execution Monitoring Layer 1.4.363 version 1 VK_LAYER_LUNARG_screenshot LunarG image capture layer 1.4.363 version 1 VK_LAYER_MESA_anti_lag Open-source implementation of the VK_AMD_anti_lag extension. 1.4.303 version 1 VK_LAYER_MESA_device_select Linux device selection layer 1.4.303 version 1 Devices: ======== GPU0: apiVersion = 1.4.354 driverVersion = 26.2.6 vendorID = 0x1002 deviceID = 0x73bf deviceType = PHYSICAL_DEVICE_TYPE_DISCRETE_GPU deviceName = AMD Radeon RX 6800 XT (RADV NAVI21) driverID = DRIVER_ID_MESA_RADV driverName = radv driverInfo = Mesa 26.2.6-arch3.1 conformanceVersion = 1.4.5.3 deviceUUID = 00000000-6400-0000-0000-000000000000 driverUUID = 414d442d-4d45-5341-2d44-525600000000 GPU1: apiVersion = 1.4.354 driverVersion = 26.2.6 vendorID = 0x1002 deviceID = 0x1114 deviceType = PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU deviceName = AMD Radeon 840M Graphics (RADV KRACKAN1) driverID = DRIVER_ID_MESA_RADV driverName = radv driverInfo = Mesa 26.2.6-arch3.1 conformanceVersion = 1.4.5.3 deviceUUID = 00000000-c100-0000-0000-000000000000 driverUUID = 414d442d-4d45-5341-2d44-525600000000 ``` ## Problem description When launching Hookshot normally, the game triggers an AMDGPU GPU hang. The display session disconnects, and the kernel reports repeated graphics and compute ring timeouts, eventually requiring a full GPU reset. This has reproduced multiple times. The kernel identifies Hookshot as the process responsible for the outstanding GPU work. ## Kernel logs The following errors consistently appear: ``` amdgpu: ring gfx_0.0.0 timeout amdgpu: Process hookshot amdgpu: Starting gfx_0.0.0 ring reset amdgpu: Ring gfx_0.0.0 reset succeeded amdgpu: ring comp_1.x.x timeout amdgpu: Ring comp_1.x.x reset failed amdgpu: GPU reset begin! amdgpu: GPU mode1 reset amdgpu: GPU reset succeeded, trying to resume amdgpu: VRAM is lost due to GPU reset! ``` Different compute rings have timed out across different runs, including: - comp_1.3.1 - comp_1.1.0 - comp_1.1.1 The GPU reset itself succeeds, but the problem reproduces when launching the game again. ## Testing and workarounds **1. Normal launch** ``` ./hookshot ``` Result: GPU hangs, AMDGPU ring timeouts, and full GPU reset. **2. AMD debugging enabled** ``` AMD_DEBUG=hang RX_VK_CHECKPOINTS=1 ./hookshot ``` Result: Does not prevent the GPU hang. **3. Disable mesh shaders** ``` RX_VK_NO_MESH=1 ./hookshot ``` Result: The launcher opens and the game runs successfully. This is currently the only tested workaround that allows me to play. **4. Disable the specific mesh culling task** ``` RX_VK_MESH_NOCULL=2c56dc1006942f74 ./hookshot ``` Result: Does not resolve the issue. The game still exhibits the original problem. ## Observations The fact that `RX_VK_NO_MESH=1` allows the game to run successfully, while `RX_VK_MESH_NOCULL=2c56dc1006942f74` does not, suggests the issue may involve something beyond the specific culling task. It appears to be related to the mesh-shader rendering path on RDNA2/RADV, although I cannot determine whether the underlying problem is in Hookshot, RADV, or their interaction. I'm running the latest Hookshot v2.0.14. ## Questions 1. Is this a known RADV/RDNA2 mesh-shader compatibility issue? 2. Are there other mesh-shader-related workarounds worth testing? 3. Could this be a separate issue from the specific task-shader culling problem already discussed in this tracker?
liomaroliveira commented 2026-11-11 01:00:20 +00:00 (Migrated from github.com)

Another RDNA2 / RADV data point with buffer markers, from main built locally.

System: Ryzen 7 3800X, RX 6700 XT 12 GB (RADV NAVI22), Mesa 26.2.6, kernel 7.3.3-1-cachyos, niri (Wayland). Hookshot main @ c09e0ac (Vulkan back end compiled from source), and v2.0.14.

Note on the kernel: on kernel 7.x the amdgpu default lockup_timeout is 2000 ms on every ring (it used to be 10 s gfx / 60 s compute). I raised it to amdgpu.lockup_timeout=10000 for these runs, so the hangs below are real hangs, not long jobs cut short (nvn: GPU waits in 5 s: 1 sync waits (11211 ms)).

Run 1 (RX_VK_MESH_NOCULL=2c56dc1006942f74, RX_VK_CHECKPOINTS=1), Kokiri Forest, ~3 min in:

vk: device lost: 1797265 markers set, 60933 reached; the last whose earlier work all finished: 1792662
vk:   finished before: marker 1792660 (draw of program d4abbcb4c2140609, frame 3151)
vk:   finished before: marker 1792661 (draw of program d8e59341cf4f629c, frame 3151)
vk:   RUNNING after: marker 1792662 (draw of program 89ca750f9852b7ca, frame 3151)

Same pair as #620 (RX 6600): last finished before 89ca750f9852b7ca (foliage colour pass).

Run 2 (same + RX_VK_SKIP_PROG=89ca750f9852b7ca), fresh boot:

vk: device lost: 376236 markers set, 61358 reached; the last whose earlier work all finished: 372053
vk:   finished before: marker 372051 (draw of program bd7da7a670ae8f68, frame 2673)
vk:   finished before: marker 372052 (draw of program bd7da7a670ae8f68, frame 2673)
vk:   RUNNING after: marker 372053 (draw of program 636eed4d5000d1c0, frame 2673)

With that program skipped it hangs after a different one (636eed4d5000d1c0), earlier in the route. So the stop point moves between runs, like the markers in #1275, which points to a wait that never completes rather than one slow shader. Both runs: ring gfx_0.0.0 timeout -> ring reset failed -> MODE1. Before each hang the log shows a capture's wait for write-back ... timed out and slow submit: ~250 ms: memory sync.

v2.0.14 without RX_VK_MESH_NOCULL hangs the same way (gfx ring, ~80 s into gameplay). Happy to run more switches or a debug build if useful.

Another RDNA2 / RADV data point with buffer markers, from `main` built locally. **System:** Ryzen 7 3800X, RX 6700 XT 12 GB (RADV NAVI22), Mesa 26.2.6, kernel 7.3.3-1-cachyos, niri (Wayland). Hookshot `main` @ `c09e0ac` (Vulkan back end compiled from source), and v2.0.14. **Note on the kernel:** on kernel 7.x the amdgpu default `lockup_timeout` is 2000 ms on every ring (it used to be 10 s gfx / 60 s compute). I raised it to `amdgpu.lockup_timeout=10000` for these runs, so the hangs below are real hangs, not long jobs cut short (`nvn: GPU waits in 5 s: 1 sync waits (11211 ms)`). **Run 1** (`RX_VK_MESH_NOCULL=2c56dc1006942f74`, `RX_VK_CHECKPOINTS=1`), Kokiri Forest, ~3 min in: ``` vk: device lost: 1797265 markers set, 60933 reached; the last whose earlier work all finished: 1792662 vk: finished before: marker 1792660 (draw of program d4abbcb4c2140609, frame 3151) vk: finished before: marker 1792661 (draw of program d8e59341cf4f629c, frame 3151) vk: RUNNING after: marker 1792662 (draw of program 89ca750f9852b7ca, frame 3151) ``` Same pair as #620 (RX 6600): last finished before `89ca750f9852b7ca` (foliage colour pass). **Run 2** (same + `RX_VK_SKIP_PROG=89ca750f9852b7ca`), fresh boot: ``` vk: device lost: 376236 markers set, 61358 reached; the last whose earlier work all finished: 372053 vk: finished before: marker 372051 (draw of program bd7da7a670ae8f68, frame 2673) vk: finished before: marker 372052 (draw of program bd7da7a670ae8f68, frame 2673) vk: RUNNING after: marker 372053 (draw of program 636eed4d5000d1c0, frame 2673) ``` With that program skipped it hangs after a different one (`636eed4d5000d1c0`), earlier in the route. So the stop point moves between runs, like the markers in #1275, which points to a wait that never completes rather than one slow shader. Both runs: `ring gfx_0.0.0 timeout` -> ring reset failed -> MODE1. Before each hang the log shows `a capture's wait for write-back ... timed out` and `slow submit: ~250 ms: memory sync`. v2.0.14 without `RX_VK_MESH_NOCULL` hangs the same way (gfx ring, ~80 s into gameplay). Happy to run more switches or a debug build if useful.
liomaroliveira commented 2026-11-11 01:52:27 +00:00 (Migrated from github.com)

Follow-up to my earlier comment: RX_VK_MESH_OPT=1 fixes it here too.

Same system (RX 6700 XT, RADV NAVI22, Mesa 26.2.6, kernel 7.3.3-1-cachyos, amdgpu.lockup_timeout=10000), Hookshot main @ c09e0ac, Kokiri Forest route:

Switches Run fps 1% low Hang
RX_VK_MESH_OPT=1 + RX_VK_CHECKPOINTS=1 110 s 28.45 21.1 no
RX_VK_MESH_OPT=1 380 s 32.55 24.1 no

Without it, every run since v2.0.11 hung between ~80 and ~180 s (gfx ring timeout, MODE1), at a different draw each time (markers in my comment above), with or without RX_VK_MESH_NOCULL. With it, the log no longer prints "task and mesh programs built without the driver's optimizer". So on RDNA2 + RADV the task/mesh programs built without ACO's optimizer are what hangs; this is a second confirmation after the RX 6800 XT and Steam Deck reports above. Turning the optimizer on by default for RADV RDNA2 (or for RADV in general) looks worth considering.

Follow-up to my earlier comment: `RX_VK_MESH_OPT=1` fixes it here too. Same system (RX 6700 XT, RADV NAVI22, Mesa 26.2.6, kernel 7.3.3-1-cachyos, `amdgpu.lockup_timeout=10000`), Hookshot `main` @ `c09e0ac`, Kokiri Forest route: | Switches | Run | fps | 1% low | Hang | |---|---|---|---|---| | `RX_VK_MESH_OPT=1` + `RX_VK_CHECKPOINTS=1` | 110 s | 28.45 | 21.1 | no | | `RX_VK_MESH_OPT=1` | 380 s | 32.55 | 24.1 | no | Without it, every run since v2.0.11 hung between ~80 and ~180 s (gfx ring timeout, MODE1), at a different draw each time (markers in my comment above), with or without `RX_VK_MESH_NOCULL`. With it, the log no longer prints "task and mesh programs built without the driver's optimizer". So on RDNA2 + RADV the task/mesh programs built without ACO's optimizer are what hangs; this is a second confirmation after the RX 6800 XT and Steam Deck reports above. Turning the optimizer on by default for RADV RDNA2 (or for RADV in general) looks worth considering.
GabrielGGuerreiro commented 2026-11-11 02:12:03 +00:00 (Migrated from github.com)

RX 6600 (RADV NAVI23), CachyOS, v2.0.14: same hangs as #620 / @liomaroliveira's runs; RX_VK_MESH_OPT=1 gets past the Navi cutscene but not Kokiri; AMDVLK 2025.Q2.1 runs with no hang

System: RX 6600 8 GB (RADV NAVI23, Mesa 26.2.4, driver 0x6802004), Xeon E5-2697 v3 (Haswell, 14C/28T), 32 GB RAM, CachyOS, kernel 7.3.1-1-cachyos (default amdgpu.lockup_timeout, i.e. 2000 ms on 7.x), KDE Plasma Wayland. Hookshot v2.0.14 (source f2796384), built with the AppImage.

1. Defaults (frame generation off), RX_VK_CHECKPOINTS=1: GPU hang every time during the first Navi cutscene (Navi flying to Link's house), ~17 fps, frame 12726:

vk:   finished before: marker 1768059 (draw of program d8e59341cf4f629c, frame 12726)
vk:   RUNNING after: marker 1768060 (draw of program 89ca750f9852b7ca, frame 12726)

Kernel: ring gfx_0.1.0 timeout -> ring reset failed -> MODE1 reset. 4 earlier runs (frame generation on) ended the same way at the same scene. Frame generation is not the cause.

hookshot_log_amdvlk_checkpoints.txt
hookshot_log_radv_defaults_checkpoints.txt
hookshot_log_radv_mesh_opt_checkpoints.txt

2. RX_VK_MESH_OPT=1, RX_VK_CHECKPOINTS=1: the cutscene plays through and Kokiri runs ~1h40 (frame 116911). It hangs on leaving Kokiri Forest:

vk:   RUNNING after: marker 109766054 (draw of program 636eed4d5000d1c0, frame 116911)
vk:   running: marker 109766055 (draw of program 6f9142def3b6a978, frame 116911)

Same two programs as @liomaroliveira's RX 6700 XT runs (89ca750f9852b7ca, then 636eed4d5000d1c0).

3. RX_VK_SKIP_CODE=463f42630fce83a0,d38b0d52a94ab5a8,40d0c0768e874600 (from #1424) on top of 2: no hang in that session, but parts of the plants are drawn plain white. d38b0d52a94ab5a8 is the fragment stage of 89ca750f9852b7ca, the foliage colour pass, so this is expected. Not a usable workaround.

4. AMDVLK 2025.Q2.1 for Hookshot only (as in @Alexatre's comment; VK_DRIVER_FILES pointing at the extracted .deb, the rest of the system on RADV), with RX_VK_MESH_OPT=1 RX_VK_WAIT_GPU=0 RX_VK_BATCH_MAX=4 and RX_VK_CHECKPOINTS=1: ~40,000 frames from Kokiri through the Hyrule Castle entrance cutscene. No device lost and no ring timeout in journalctl -k. Foliage is drawn normally.

  • Shader compiles: with an empty cache, the start's precompile took 394 s (3834 graphics + 2348 compute pipelines). Areas not noted yet compile in play: the castle entrance stopped on a blue frame for a while with ~588 jobs queued, the slowest pipelines 3–4 s each (SLOW compile).
  • Pipeline cache: mkw_vk_pipelines.bin is dropped on a driver switch (pipelineCacheUUID check), so switching back and forth rebuilds it each time. I keep one copy per UUID with a launch script.

Other notes:

  • Each MODE1 reset also logged a PCIe AER CmpltAbrt (uncorrectable, non-fatal) from the GPU in the same second. I read it as a consequence of the hang, not its cause.
  • CPU-bound on this CPU: ~18 fps on RADV with GPU time ~16 ms a frame, replay submit ~20 ms (p90 ~29 ms) and no shader waits.

Logs available if useful.

hookshot_log_radv_defaults_checkpoints.txt - 1: Navi cutscene hang (89ca750f9852b7ca) - 0,6 MB
hookshot_log_radv_mesh_opt_checkpoints.txt - 2: leaving Kokiri forest hang (636eed4d5000d1c0) - 7,1 MB
hookshot_log_amdvlk_checkpoints.txt - 3: session without hang on AMDVLK - 2,4 MB

**RX 6600 (RADV NAVI23), CachyOS, v2.0.14: same hangs as #620 / @liomaroliveira's runs; `RX_VK_MESH_OPT=1` gets past the Navi cutscene but not Kokiri; AMDVLK 2025.Q2.1 runs with no hang** **System:** RX 6600 8 GB (RADV NAVI23, Mesa 26.2.4, driver 0x6802004), Xeon E5-2697 v3 (Haswell, 14C/28T), 32 GB RAM, CachyOS, kernel 7.3.1-1-cachyos (default `amdgpu.lockup_timeout`, i.e. 2000 ms on 7.x), KDE Plasma Wayland. Hookshot v2.0.14 (source f2796384), built with the AppImage. **1. Defaults (frame generation off), `RX_VK_CHECKPOINTS=1`:** GPU hang every time during the first Navi cutscene (Navi flying to Link's house), ~17 fps, frame 12726: ``` vk: finished before: marker 1768059 (draw of program d8e59341cf4f629c, frame 12726) vk: RUNNING after: marker 1768060 (draw of program 89ca750f9852b7ca, frame 12726) ``` Kernel: `ring gfx_0.1.0 timeout` -> ring reset failed -> MODE1 reset. 4 earlier runs (frame generation on) ended the same way at the same scene. Frame generation is not the cause. [hookshot_log_amdvlk_checkpoints.txt](https://github.com/user-attachments/files/34666428/hookshot_log_amdvlk_checkpoints.txt) [hookshot_log_radv_defaults_checkpoints.txt](https://github.com/user-attachments/files/34666429/hookshot_log_radv_defaults_checkpoints.txt) [hookshot_log_radv_mesh_opt_checkpoints.txt](https://github.com/user-attachments/files/34666427/hookshot_log_radv_mesh_opt_checkpoints.txt) **2. `RX_VK_MESH_OPT=1`, `RX_VK_CHECKPOINTS=1`:** the cutscene plays through and Kokiri runs ~1h40 (frame 116911). It hangs on leaving Kokiri Forest: ``` vk: RUNNING after: marker 109766054 (draw of program 636eed4d5000d1c0, frame 116911) vk: running: marker 109766055 (draw of program 6f9142def3b6a978, frame 116911) ``` Same two programs as @liomaroliveira's RX 6700 XT runs (`89ca750f9852b7ca`, then `636eed4d5000d1c0`). **3. `RX_VK_SKIP_CODE=463f42630fce83a0,d38b0d52a94ab5a8,40d0c0768e874600` (from #1424) on top of 2:** no hang in that session, but parts of the plants are drawn plain white. `d38b0d52a94ab5a8` is the fragment stage of `89ca750f9852b7ca`, the foliage colour pass, so this is expected. Not a usable workaround. **4. AMDVLK 2025.Q2.1 for Hookshot only** (as in @Alexatre's comment; `VK_DRIVER_FILES` pointing at the extracted `.deb`, the rest of the system on RADV), with `RX_VK_MESH_OPT=1 RX_VK_WAIT_GPU=0 RX_VK_BATCH_MAX=4` and `RX_VK_CHECKPOINTS=1`: ~40,000 frames from Kokiri through the Hyrule Castle entrance cutscene. No device lost and no ring timeout in `journalctl -k`. Foliage is drawn normally. - **Shader compiles:** with an empty cache, the start's precompile took 394 s (3834 graphics + 2348 compute pipelines). Areas not noted yet compile in play: the castle entrance stopped on a blue frame for a while with ~588 jobs queued, the slowest pipelines 3–4 s each (`SLOW compile`). - **Pipeline cache:** `mkw_vk_pipelines.bin` is dropped on a driver switch (pipelineCacheUUID check), so switching back and forth rebuilds it each time. I keep one copy per UUID with a launch script. **Other notes:** - Each MODE1 reset also logged a PCIe AER `CmpltAbrt` (uncorrectable, non-fatal) from the GPU in the same second. I read it as a consequence of the hang, not its cause. - CPU-bound on this CPU: ~18 fps on RADV with GPU time ~16 ms a frame, replay submit ~20 ms (p90 ~29 ms) and no shader waits. Logs available if useful. hookshot_log_radv_defaults_checkpoints.txt - 1: Navi cutscene hang (89ca750f9852b7ca) - 0,6 MB hookshot_log_radv_mesh_opt_checkpoints.txt - 2: leaving Kokiri forest hang (636eed4d5000d1c0) - 7,1 MB hookshot_log_amdvlk_checkpoints.txt - 3: session without hang on AMDVLK - 2,4 MB
simonwjackson commented 2026-11-11 03:23:54 +00:00 (Migrated from github.com)

Claiming a small Linux fix here (also posted in Discord #dev-work). It builds on #448.

If Hookshot can't open /dev/udmabuf (on many distros it's root:kvm 0660), it quietly falls back to the slow path, and nothing tells you. On my RX 7900 XT (Mesa 26.2.3, kernel 7.2.7) that was 16 vs 36 game fps in Kokiri Forest, from that one permission.

Plan: a one-time warning (terminal and hookshot_log.txt) when it's a permission error, a short README section (device group or a narrow udev rule), and a game-free test. No renderer changes. Score: S2 × reach ~0.17 × confidence 1.0 ≈ 0.5. Branch: simonwjackson/Hookshot:udmabuf-warning.

Claiming a small Linux fix here (also posted in Discord #dev-work). It builds on #448. If Hookshot can't open `/dev/udmabuf` (on many distros it's `root:kvm 0660`), it quietly falls back to the slow path, and nothing tells you. On my RX 7900 XT (Mesa 26.2.3, kernel 7.2.7) that was 16 vs 36 game fps in Kokiri Forest, from that one permission. Plan: a one-time warning (terminal and `hookshot_log.txt`) when it's a permission error, a short README section (device group or a narrow udev rule), and a game-free test. No renderer changes. Score: S2 × reach ~0.17 × confidence 1.0 ≈ 0.5. Branch: `simonwjackson/Hookshot:udmabuf-warning`.
simonwjackson commented 2026-11-11 03:23:58 +00:00 (Migrated from github.com)

Following up on #817 with an RX 7900 XT (Navi31), Ryzen 5 7600X, Mesa RADV 26.2.3, Linux 7.2.7 / NixOS: the older local build hung entering Kokiri Forest in 3/4 matched native-mesh trials. This was our older 32df58e-based installation; its log identifies hookshot unknown (source 802b5e54). One failure logged:

ring gfx_0.0.0 timeout, signaled seq=1837979, emitted seq=1837981
MES failed to respond to msg=RESET
reset via MES failed and try pipe reset -110
MODE1 reset

Disabling mesh draws survived every such trial, but omitted geometry; that was not a rendering fix. With source v2.0.14 (117eae79d6724331dfa71c9139fee993d158f245, logged as hookshot unknown (source 4ca6c9ae)), all completed trials survived:

Mode Survived Median game fps
RX_VK_FORCE_MESH_FALLBACK=1 4/4 46.5
RX_VK_TASK_MESH_FALLBACK=1 4/4 43.8
Native (both unset) 2/2 45.2

These are medians of each run's final-five periodic samples, not frame-generated display fps. Run lengths were 137–231 s, at 1920×1080 with udmabuf active, built-in 2× frame generation and FSR enabled, audio disabled for the harness. One earlier task-fallback attempt timed out in shader preparation and is excluded, not counted as a successful load. Example: vi: 3554 frames presented (46.5 fps over the last 5.0 s, interval 1).

Mesa 26.2.3's Navi31 CI sets RADV_DEBUG: nomeshshader # Disable mesh shaders until task shaders stop hanging. This is context, not proof of the same defect. These short v2.0.14 runs do not establish a long-term fix or identify a culprit shader.

Following up on #817 with an RX 7900 XT (Navi31), Ryzen 5 7600X, Mesa RADV 26.2.3, Linux 7.2.7 / NixOS: the older local build hung entering Kokiri Forest in 3/4 matched native-mesh trials. This was our older 32df58e-based installation; its log identifies `hookshot unknown (source 802b5e54)`. One failure logged: ```text ring gfx_0.0.0 timeout, signaled seq=1837979, emitted seq=1837981 MES failed to respond to msg=RESET reset via MES failed and try pipe reset -110 MODE1 reset ``` Disabling mesh draws survived every such trial, but omitted geometry; that was not a rendering fix. With source v2.0.14 (`117eae79d6724331dfa71c9139fee993d158f245`, logged as `hookshot unknown (source 4ca6c9ae)`), all completed trials survived: | Mode | Survived | Median game fps | |---|---:|---:| | `RX_VK_FORCE_MESH_FALLBACK=1` | 4/4 | 46.5 | | `RX_VK_TASK_MESH_FALLBACK=1` | 4/4 | 43.8 | | Native (both unset) | 2/2 | 45.2 | These are medians of each run's final-five periodic samples, not frame-generated display fps. Run lengths were 137–231 s, at 1920×1080 with udmabuf active, built-in 2× frame generation and FSR enabled, audio disabled for the harness. One earlier task-fallback attempt timed out in shader preparation and is excluded, not counted as a successful load. Example: `vi: 3554 frames presented (46.5 fps over the last 5.0 s, interval 1)`. [Mesa 26.2.3's Navi31 CI](https://github.com/chaotic-cx/mesa-mirror/blob/mesa-26.2.3/src/amd/ci/gitlab-ci.yml) sets `RADV_DEBUG: nomeshshader # Disable mesh shaders until task shaders stop hanging`. This is context, not proof of the same defect. These short v2.0.14 runs do not establish a long-term fix or identify a culprit shader.
thelinuxgmr commented 2026-11-11 03:43:40 +00:00 (Migrated from github.com)

Follow-up on the Steam Deck testing from my v2.0.11 feedback above: v2.1.0 is built and deployed on the same Deck, ready to test.

  • Built on a Threadripper (NixOS) with the official Hookshot-v2.1.0-x86_64.AppImage (sha256 verified against the release SHA256SUMS), CLI mode, against the same game dump used for the v2.0.11 build. The build finished cleanly (exit 0). One observation: the full build took ~50 minutes wall clock here — after the main compile (0:08:59) there is a long shader stage that v2.0.11's build did not spend nearly as long on.
  • Deployed to the Deck's ~/Games/Hookshot by checksum rsync (~8.1 GB moved in 33 files). hookshot_version.txt on the Deck now reads version=v2.1.0. Existing options and saves were preserved; saves were also copied to the new ~/.local/share/hookshot location noted by the build, with the originals left in place and a separate backup taken.
  • Not tested yet — no results to report. Next step is a Game Mode session on the same route as the v2.0.11 test, through the Deku Tree. I'll report back here, particularly on whether the RX_VK_MESH_NOCULL work (#817) changes the task-shader hang behaviour on this RDNA2 Deck, and whether the choppiness/flicker from the v2.0.11 run is any different.
Follow-up on the Steam Deck testing from my v2.0.11 feedback above: **v2.1.0 is built and deployed on the same Deck, ready to test.** - Built on a Threadripper (NixOS) with the official `Hookshot-v2.1.0-x86_64.AppImage` (sha256 verified against the release SHA256SUMS), CLI mode, against the same game dump used for the v2.0.11 build. The build finished cleanly (exit 0). One observation: the full build took ~50 minutes wall clock here — after the main compile (0:08:59) there is a long shader stage that v2.0.11's build did not spend nearly as long on. - Deployed to the Deck's `~/Games/Hookshot` by checksum rsync (~8.1 GB moved in 33 files). `hookshot_version.txt` on the Deck now reads `version=v2.1.0`. Existing options and saves were preserved; saves were also copied to the new `~/.local/share/hookshot` location noted by the build, with the originals left in place and a separate backup taken. - Not tested yet — no results to report. Next step is a Game Mode session on the same route as the v2.0.11 test, through the Deku Tree. I'll report back here, particularly on whether the `RX_VK_MESH_NOCULL` work (#817) changes the task-shader hang behaviour on this RDNA2 Deck, and whether the choppiness/flicker from the v2.0.11 run is any different.
addisonbair commented 2026-11-11 04:05:06 +00:00 (Migrated from github.com)

The lost overlap reproduces on NVIDIA, so it isn't RADV-specific. You can see it without a Deck by locking the GPU clock until GPU time is close to the replay's.

Setup: ThinkPad P16 with an RTX PRO 2000 Blackwell Laptop GPU (driver 0x912c8100), sudo nvidia-smi -lgc 900,900. It's the same headless scripted run from one save for both builds, ~1,750-1,800 draws a frame, with the Deck's env: HOS_HANDHELD=1 RX_VK_MESH_OPT=1 RX_VK_PER_QUEUE_FENCES=0 RX_VK_WAIT_GPU=0 RX_VK_BATCH_MAX=4. Each build ran once first to warm its caches. The numbers average the last 8 fps lines and the last 3 replay time / GPU time lines.

900 MHz replay submit GPU time frame replay + GPU
v2.0.14 18.9 ms 22.2 ms 36.9 ms (27.1 fps) 41.1 ms
2.1.0-rc.2 (8ef8461) 10.3 ms 22.2 ms 34.5 ms (29.0 fps) 32.5 ms

v2.0.14 overlaps ~4 ms of the replay with the GPU. On rc.2, the frame is the replay plus the GPU time, the same pattern as the Deck numbers above (v2.0.14 ~13 ms overlapped, main none). rc.2 still comes out ahead here only because its replay is half of v2.0.14's on this CPU. On the Deck, the replay is about as long as the GPU time, so the lost overlap costs ~17 ms a frame (~22 to ~16 fps). At the stock clock (GPU ~10 ms), rc.2 is faster (45 vs 34 fps), which is probably why desktops haven't noticed.

8ef8461 is in v2.1.0, so v2.1.0 most likely has it too. I haven't benchmarked the final tag. I've only tried this with the Deck env above, so I can't say yet whether the default switches show it too.

A --first-parent bisect of v2.0.14..fc375e9 on this setup is running now. Before it starts, it checks that both ends built from source separate. I'll post the merge it lands on.

**The lost overlap reproduces on NVIDIA**, so it isn't RADV-specific. You can see it without a Deck by locking the GPU clock until GPU time is close to the replay's. Setup: ThinkPad P16 with an RTX PRO 2000 Blackwell Laptop GPU (driver 0x912c8100), `sudo nvidia-smi -lgc 900,900`. It's the same headless scripted run from one save for both builds, ~1,750-1,800 draws a frame, with the Deck's env: `HOS_HANDHELD=1 RX_VK_MESH_OPT=1 RX_VK_PER_QUEUE_FENCES=0 RX_VK_WAIT_GPU=0 RX_VK_BATCH_MAX=4`. Each build ran once first to warm its caches. The numbers average the last 8 fps lines and the last 3 `replay time` / `GPU time` lines. | 900 MHz | replay `submit` | `GPU time` | frame | replay + GPU | |---|---|---|---|---| | v2.0.14 | 18.9 ms | 22.2 ms | 36.9 ms (27.1 fps) | 41.1 ms | | 2.1.0-rc.2 (8ef8461) | 10.3 ms | 22.2 ms | 34.5 ms (29.0 fps) | 32.5 ms | v2.0.14 overlaps ~4 ms of the replay with the GPU. On rc.2, the frame is the replay plus the GPU time, the same pattern as the Deck numbers above (v2.0.14 ~13 ms overlapped, `main` none). rc.2 still comes out ahead here only because its replay is half of v2.0.14's on this CPU. On the Deck, the replay is about as long as the GPU time, so the lost overlap costs ~17 ms a frame (~22 to ~16 fps). At the stock clock (GPU ~10 ms), rc.2 is faster (45 vs 34 fps), which is probably why desktops haven't noticed. 8ef8461 is in v2.1.0, so v2.1.0 most likely has it too. I haven't benchmarked the final tag. I've only tried this with the Deck env above, so I can't say yet whether the default switches show it too. A `--first-parent` bisect of v2.0.14..fc375e9 on this setup is running now. Before it starts, it checks that both ends built from source separate. I'll post the merge it lands on.
thelinuxgmr commented 2026-11-11 06:27:06 +00:00 (Migrated from github.com)

Regression on the Steam Deck: the Deku Tree GPU hang is back in v2.1.0 — and still present in tonight's nightly (v2.1.0-rc.3-46-gddafc1f, main @ ddafc1f).

Follow-up to my earlier report (#817, tracked here). Same machine as all previous tests: Steam Deck (CachyOS Deckify, RADV Van Gogh), same save, same repro spot — loading the save and letting the Great Deku Tree speech play.

Version history at this spot, on this Deck:

  • v2.0.4 / v2.0.7-rc.1: GPU hang (original report).
  • v2.0.11: FIXED — played through clean (my previous comment here). That build's RX_VK_SKIP_CODE workaround (#1165) is what did it; RX_VK_NO_MESH=1 was no longer needed.
  • v2.1.0: REGRESSED — the hang is back. Kernel log tonight (Nov 10, local time): five separate hookshot processes hung the GPU between 21:33–21:38, across a save-load attempt and a new-game attempt. Signature identical to the original:
    • ring gfx_0.0.0 timeout, signaled seq=11652699, emitted seq=11652701
    • Process hookshot pid 223807 thread sead::MainThrea
    • Ring gfx_0.0.0 reset failed → full GPU reset, then a follow-on ring comp_1.2.0 timeout.
  • Nightly v2.1.0-rc.3-46-gddafc1f (ddafc1f): same hang. Tested tonight after the v2.1.0 result — ring gfx_0.0.0 timeout at 22:25:11 (pid 237044), ring reset failed, GPU reset, then ring comp_1.1.1 timeout.

Suspected cause: v2.1.0 replaced the RX_VK_SKIP_CODE Deck workaround with the new RX_VK_MESH_NOCULL mode (#1300). On this Deck, NOCULL does not hold where SKIP_CODE did. Options file/settings are unchanged from the working v2.0.11 setup; nothing else on the machine changed.

To be clear, v2.1.0 otherwise feels like a step forward — the long upfront pipeline compile looks like the right direction, and once this hang is corrected I'd expect it to run better than v2.0.11 did. Happy to test any build, and I can provide the full kernel log / AMDGPU coredump output if useful.

**Regression on the Steam Deck: the Deku Tree GPU hang is back in v2.1.0 — and still present in tonight's nightly (v2.1.0-rc.3-46-gddafc1f, main @ ddafc1f).** Follow-up to my earlier report (#817, tracked here). Same machine as all previous tests: Steam Deck (CachyOS Deckify, RADV Van Gogh), same save, same repro spot — loading the save and letting the Great Deku Tree speech play. **Version history at this spot, on this Deck:** - v2.0.4 / v2.0.7-rc.1: GPU hang (original report). - **v2.0.11: FIXED** — played through clean (my previous comment here). That build's `RX_VK_SKIP_CODE` workaround (#1165) is what did it; `RX_VK_NO_MESH=1` was no longer needed. - **v2.1.0: REGRESSED** — the hang is back. Kernel log tonight (Nov 10, local time): five separate `hookshot` processes hung the GPU between 21:33–21:38, across a save-load attempt and a new-game attempt. Signature identical to the original: - `ring gfx_0.0.0 timeout, signaled seq=11652699, emitted seq=11652701` - `Process hookshot pid 223807 thread sead::MainThrea` - `Ring gfx_0.0.0 reset failed` → full GPU reset, then a follow-on `ring comp_1.2.0 timeout`. - **Nightly v2.1.0-rc.3-46-gddafc1f (ddafc1f): same hang.** Tested tonight after the v2.1.0 result — `ring gfx_0.0.0 timeout` at 22:25:11 (pid 237044), ring reset failed, GPU reset, then `ring comp_1.1.1 timeout`. **Suspected cause:** v2.1.0 replaced the `RX_VK_SKIP_CODE` Deck workaround with the new `RX_VK_MESH_NOCULL` mode (#1300). On this Deck, NOCULL does not hold where SKIP_CODE did. Options file/settings are unchanged from the working v2.0.11 setup; nothing else on the machine changed. To be clear, v2.1.0 otherwise feels like a step forward — the long upfront pipeline compile looks like the right direction, and once this hang is corrected I'd expect it to run better than v2.0.11 did. Happy to test any build, and I can provide the full kernel log / AMDGPU coredump output if useful.
gabriochsky commented 2026-11-11 06:33:54 +00:00 (Migrated from github.com)

Steam Deck OLED / SteamOS — GPU hang on Hookshot v2.1.0 (RADV VANGOGH)

I'm experiencing an AMDGPU hang on a Steam Deck OLED running SteamOS with Hookshot v2.1.0.

The failure results in VK_ERROR_DEVICE_LOST, an AMDGPU graphics ring timeout, a failed ring reset, and a successful MODE2 GPU reset.

System information

  • Device: Steam Deck OLED
  • Operating system: SteamOS (BUILD_ID 20261023.100)
  • Kernel: 7.2.7-valve2-2-neptune-72-g31504582a073
  • GPU: AMD Custom GPU 0932 (RADV VANGOGH)
  • Vulkan driver: RADV
  • Mesa: 26.2.0-devel (git-5c65d4fc31)
  • Vulkan API: 1.4.350
  • Hookshot: v2.1.0
  • Source revision: e561602e
  • Game update: v131072
  • Execution: Native Linux build

Configuration

My hookshot_env.txt contains:

RX_VK_VRAM_MB=1200
RX_VK_TASK_MESH_FALLBACK=1
RX_VK_CHECKPOINTS=1

My hookshot_options.ini contains:

quality_preset=0
frame_generation=2
resolution=4

One important discrepancy: although RX_VK_TASK_MESH_FALLBACK=1 is present in my environment file, the startup log says:

task + mesh programs use the compute fallback (RX_VK_TASK_MESH_FALLBACK=0: native)

I cannot confirm whether the fallback was actually enabled at runtime.

What happened

On November 11, 2026, at approximately 01:21:59 local system time, Hookshot triggered a GPU hang.

The kernel reported:

amdgpu: ring gfx_0.0.0 timeout, signaled seq=4400126, emitted seq=4400128
amdgpu: Process hookshot pid 48721 thread OptimizeChangeB pid 48858
amdgpu: Starting gfx_0.0.0 ring reset
amdgpu: Ring gfx_0.0.0 reset failed
amdgpu: GPU reset begin!. Source: 1
amdgpu: MODE2 reset
amdgpu: GPU reset succeeded, trying to resume
amdgpu: GPU reset(6) succeeded!
amdgpu: [drm] device wedged, but no recovery needed

Hookshot's log ends with:

radv/amdgpu: The CS has been cancelled because the context is lost.
vk: batched submit 2046 failed (-4)
vk: FATAL: the GPU device was lost (VK_ERROR_DEVICE_LOST)

Vulkan checkpoints

RX_VK_CHECKPOINTS=1 enabled VK_AMD_buffer_marker on this RADV device.

At device loss, the log reported:

49429 markers set, 45782 reached
the last whose earlier work all finished: 46000

RUNNING after: marker 46000 (upload of texture 00000100002ec800)
running: marker 46001 (dispatch of program 26fe0c70ab9fc547)
running: marker 46002 (dispatch of program 685adb41edc19de7)
running: marker 46003 (INDIRECT dispatch of program 685adb41edc19de7)
running: marker 46004 (dispatch of program 6637ac1d052d22d4)

There were additional pending draws and dispatches after these markers. I am not assuming that any individual marker or shader is necessarily the cause.

Performance and memory observations

Shortly before the hang, Hookshot reported:

  • A slow submission lasting approximately 7.2 seconds.
  • An upload batch taking approximately 674 ms, including 148.8 MB of CPU-side ASTC decoding.
  • Approximately 0.1 FPS over the final 9.4 seconds.

The last memory sample showed approximately 7.7 GB working set and 1,017 MB of device memory used out of 5,462 MB allowed. This does not indicate straightforward exhaustion of the reported device-memory budget.

Previous testing

I have also encountered GPU hangs on earlier Hookshot builds.

RX_VK_NO_MESH=1 previously allowed the game to proceed, but caused missing geometry.

I would prefer a solution that preserves mesh rendering.

The current v2.1.0 run still ended in a GPU reset, despite RX_VK_TASK_MESH_FALLBACK=1 being present in my environment file. However, the startup log creates uncertainty about whether that setting was active.

Questions

  1. Can you confirm whether RX_VK_TASK_MESH_FALLBACK=1 was actually active in this run?
  2. Could this be related to the Steam Deck / RDNA2 task and mesh shader hangs already discussed in #817?
  3. Is there another diagnostic switch or test build that could help identify the cause without repeatedly triggering full GPU resets?

Attachments:

  • hookshot_log.txt — complete v2.1.0 log with Vulkan checkpoints.

hookshot_log.txt

I have paused further testing to avoid repeated GPU resets and desktop-session disruption.

### Steam Deck OLED / SteamOS — GPU hang on Hookshot v2.1.0 (RADV VANGOGH) I'm experiencing an AMDGPU hang on a Steam Deck OLED running SteamOS with Hookshot v2.1.0. The failure results in `VK_ERROR_DEVICE_LOST`, an AMDGPU graphics ring timeout, a failed ring reset, and a successful MODE2 GPU reset. #### System information - **Device:** Steam Deck OLED - **Operating system:** SteamOS (BUILD_ID `20261023.100`) - **Kernel:** `7.2.7-valve2-2-neptune-72-g31504582a073` - **GPU:** AMD Custom GPU 0932 (RADV VANGOGH) - **Vulkan driver:** RADV - **Mesa:** `26.2.0-devel (git-5c65d4fc31)` - **Vulkan API:** `1.4.350` - **Hookshot:** v2.1.0 - **Source revision:** `e561602e` - **Game update:** `v131072` - **Execution:** Native Linux build #### Configuration My `hookshot_env.txt` contains: ```ini RX_VK_VRAM_MB=1200 RX_VK_TASK_MESH_FALLBACK=1 RX_VK_CHECKPOINTS=1 ``` My `hookshot_options.ini` contains: ```ini quality_preset=0 frame_generation=2 resolution=4 ``` One important discrepancy: although `RX_VK_TASK_MESH_FALLBACK=1` is present in my environment file, the startup log says: ```text task + mesh programs use the compute fallback (RX_VK_TASK_MESH_FALLBACK=0: native) ``` I cannot confirm whether the fallback was actually enabled at runtime. #### What happened On November 11, 2026, at approximately 01:21:59 local system time, Hookshot triggered a GPU hang. The kernel reported: ```text amdgpu: ring gfx_0.0.0 timeout, signaled seq=4400126, emitted seq=4400128 amdgpu: Process hookshot pid 48721 thread OptimizeChangeB pid 48858 amdgpu: Starting gfx_0.0.0 ring reset amdgpu: Ring gfx_0.0.0 reset failed amdgpu: GPU reset begin!. Source: 1 amdgpu: MODE2 reset amdgpu: GPU reset succeeded, trying to resume amdgpu: GPU reset(6) succeeded! amdgpu: [drm] device wedged, but no recovery needed ``` Hookshot's log ends with: ```text radv/amdgpu: The CS has been cancelled because the context is lost. vk: batched submit 2046 failed (-4) vk: FATAL: the GPU device was lost (VK_ERROR_DEVICE_LOST) ``` #### Vulkan checkpoints `RX_VK_CHECKPOINTS=1` enabled `VK_AMD_buffer_marker` on this RADV device. At device loss, the log reported: ```text 49429 markers set, 45782 reached the last whose earlier work all finished: 46000 RUNNING after: marker 46000 (upload of texture 00000100002ec800) running: marker 46001 (dispatch of program 26fe0c70ab9fc547) running: marker 46002 (dispatch of program 685adb41edc19de7) running: marker 46003 (INDIRECT dispatch of program 685adb41edc19de7) running: marker 46004 (dispatch of program 6637ac1d052d22d4) ``` There were additional pending draws and dispatches after these markers. I am not assuming that any individual marker or shader is necessarily the cause. #### Performance and memory observations Shortly before the hang, Hookshot reported: - A slow submission lasting approximately **7.2 seconds**. - An upload batch taking approximately **674 ms**, including 148.8 MB of CPU-side ASTC decoding. - Approximately **0.1 FPS** over the final 9.4 seconds. The last memory sample showed approximately 7.7 GB working set and 1,017 MB of device memory used out of 5,462 MB allowed. This does not indicate straightforward exhaustion of the reported device-memory budget. #### Previous testing I have also encountered GPU hangs on earlier Hookshot builds. `RX_VK_NO_MESH=1` previously allowed the game to proceed, but caused missing geometry. I would prefer a solution that preserves mesh rendering. The current v2.1.0 run still ended in a GPU reset, despite `RX_VK_TASK_MESH_FALLBACK=1` being present in my environment file. However, the startup log creates uncertainty about whether that setting was active. #### Questions 1. Can you confirm whether `RX_VK_TASK_MESH_FALLBACK=1` was actually active in this run? 2. Could this be related to the Steam Deck / RDNA2 task and mesh shader hangs already discussed in #817? 3. Is there another diagnostic switch or test build that could help identify the cause without repeatedly triggering full GPU resets? **Attachments:** - `hookshot_log.txt` — complete v2.1.0 log with Vulkan checkpoints. [hookshot_log.txt](https://github.com/user-attachments/files/34673817/hookshot_log.txt) I have paused further testing to avoid repeated GPU resets and desktop-session disruption.
MattDev-974 commented 2026-11-11 10:01:05 +00:00 (Migrated from github.com)

On the latest version with an RX 6600, if I force mesh shaders from native to compute, it doesn’t crash, but in some areas I’m at 20 fps. I don’t know if that’s related to this setting. In native mode, it crashes when loading a save (my save is in Hyrule Field and Cocorico Village).

I also notice shader compilation it faster with native mesh mode.

hookshot_log_native_mesh_mode.txt

Edit: I still crash with RX_VK_TASK_MESH_FALLBACK=1

On the latest version with an RX 6600, if I force mesh shaders from native to compute, it doesn’t crash, but in some areas I’m at 20 fps. I don’t know if that’s related to this setting. In native mode, it crashes when loading a save (my save is in Hyrule Field and Cocorico Village). I also notice shader compilation it faster with native mesh mode. [hookshot_log_native_mesh_mode.txt](https://github.com/user-attachments/files/34682016/hookshot_log_native_mesh_mode.txt) Edit: I still crash with RX_VK_TASK_MESH_FALLBACK=1
Defalt13 commented 2026-11-11 12:28:34 +00:00 (Migrated from github.com)

Game works in the main menu but crashes as it loads a new save file or new game right after cutscene ends.

Hookshot Version: v2.1.0
GPU: MD Radeon RX 6650XT
AMD Driver Version: Mesa 1:26.2.6-1 (RADV)
OS: Archlinux - Kernel 7.2.14-zen1-1-zen

The game works with RX_VK_NO_MESH=1 but is missing some geometry, no grass and bushes, tested with RX_VK_TASK_MESH_FALLBACK=1 and still crash.

hookshot_log.3.txt

Game works in the main menu but crashes as it loads a new save file or new game right after cutscene ends. Hookshot Version: v2.1.0 GPU: MD Radeon RX 6650XT AMD Driver Version: Mesa 1:26.2.6-1 (RADV) OS: Archlinux - Kernel 7.2.14-zen1-1-zen The game works with RX_VK_NO_MESH=1 but is missing some geometry, no grass and bushes, tested with RX_VK_TASK_MESH_FALLBACK=1 and still crash. [hookshot_log.3.txt](https://github.com/user-attachments/files/34687380/hookshot_log.3.txt)
alvaroum02-rgb commented 2026-11-11 13:48:45 +00:00 (Migrated from github.com)

cual seria la solucion? ya se soluciono para las rx 6000? o se sigue bloqueando y perdiendo el controlador grafico?

cual seria la solucion? ya se soluciono para las rx 6000? o se sigue bloqueando y perdiendo el controlador grafico?
buffakee commented 2026-11-11 14:21:17 +00:00 (Migrated from github.com)

Adding my report here to consolidate the Linux/RADV performance investigation. I've already opened a separate issue documenting the problem in detail: #[your issue number].

System

  • Hookshot: v2.1.0
  • OS: Bazzite Linux (Fedora 45)
  • Kernel: 7.2.15-ogc1.1.fc45.x86_64
  • GPU: AMD Radeon RX 7900 XT (Navi 31, RDNA 3)
  • CPU: Ryzen 7 5800X3D
  • RAM: 32 GB DDR4-3600
  • Mesa: 26.2.6
  • Resolution: 2560 × 1440
  • Driver: RADV

Issue

I'm experiencing severe visual hitching and inconsistent performance, with no meaningful improvement after updating to v2.1.0.

The most noticeable issue is a disconnect between the reported framerate and the actual visual smoothness. The game exhibits substantial judder and hitching that feels significantly worse than the reported FPS would suggest.

The underlying rendering appears correct, but the visual motion is frequently disrupted.

Findings

  • The game struggles to consistently reach its 60 FPS target.
  • RX_VK_PARALLEL=4 provides a marginal performance improvement, but the severe hitching remains.
  • Switching between fullscreen and windowed modes makes no difference.
  • /dev/udmabuf is accessible (Access OK).
  • The logs confirm DMA-BUF imports, Vulkan batching (RX_VK_BATCH), VRAM mirroring, and submit-time memory capture are enabled.
  • Vulkan replay logs show approximately 0.7–0.8 ms submission times, with around 0.4 ms attributed to memory synchronisation. These measurements were collected outside demanding gameplay and aren't sufficient to identify the bottleneck.

Additional observations

I've experienced a remarkably similar visual hitching problem in The Witcher 3 on the same system, which disappeared when signing out of my CDPR account. I don't believe this establishes a shared cause, but it may be relevant when considering whether the issue extends beyond Hookshot itself.

Given the discrepancy between reported performance and perceived smoothness, I'm wondering whether there could be irregular frame presentation, synchronisation stalls, or simulation timing issues not reflected in the available FPS metrics.

I've attached my Hookshot logs to the original issue and can provide additional diagnostics if useful.

hookshot_log.txt
hookshot_log.1.txt
hookshot_log.2.txt
hookshot_log.3.txt
hookshot_log.4.txt

Adding my report here to consolidate the Linux/RADV performance investigation. I've already opened a separate issue documenting the problem in detail: **#[your issue number]**. ### System - **Hookshot:** v2.1.0 - **OS:** Bazzite Linux (Fedora 45) - **Kernel:** 7.2.15-ogc1.1.fc45.x86_64 - **GPU:** AMD Radeon RX 7900 XT (Navi 31, RDNA 3) - **CPU:** Ryzen 7 5800X3D - **RAM:** 32 GB DDR4-3600 - **Mesa:** 26.2.6 - **Resolution:** 2560 × 1440 - **Driver:** RADV ### Issue I'm experiencing severe visual hitching and inconsistent performance, with no meaningful improvement after updating to v2.1.0. The most noticeable issue is a **disconnect between the reported framerate and the actual visual smoothness**. The game exhibits substantial judder and hitching that feels significantly worse than the reported FPS would suggest. The underlying rendering appears correct, but the visual motion is frequently disrupted. ### Findings - The game struggles to consistently reach its 60 FPS target. - `RX_VK_PARALLEL=4` provides a marginal performance improvement, but the severe hitching remains. - Switching between fullscreen and windowed modes makes no difference. - `/dev/udmabuf` is accessible (`Access OK`). - The logs confirm DMA-BUF imports, Vulkan batching (`RX_VK_BATCH`), VRAM mirroring, and submit-time memory capture are enabled. - Vulkan replay logs show approximately 0.7–0.8 ms submission times, with around 0.4 ms attributed to memory synchronisation. These measurements were collected outside demanding gameplay and aren't sufficient to identify the bottleneck. ### Additional observations I've experienced a remarkably similar visual hitching problem in The Witcher 3 on the same system, which disappeared when signing out of my CDPR account. I don't believe this establishes a shared cause, but it may be relevant when considering whether the issue extends beyond Hookshot itself. Given the discrepancy between reported performance and perceived smoothness, I'm wondering whether there could be irregular frame presentation, synchronisation stalls, or simulation timing issues not reflected in the available FPS metrics. I've attached my Hookshot logs to the original issue and can provide additional diagnostics if useful. [hookshot_log.txt](https://github.com/user-attachments/files/34691660/hookshot_log.txt) [hookshot_log.1.txt](https://github.com/user-attachments/files/34691661/hookshot_log.1.txt) [hookshot_log.2.txt](https://github.com/user-attachments/files/34691663/hookshot_log.2.txt) [hookshot_log.3.txt](https://github.com/user-attachments/files/34691662/hookshot_log.3.txt) [hookshot_log.4.txt](https://github.com/user-attachments/files/34691659/hookshot_log.4.txt)
dvilelaf commented 2026-11-11 14:26:29 +00:00 (Migrated from github.com)

RX 6800 XT (RADV NAVI21, Mesa 25.0.7): gfx_0.0.0 timeout → MODE1 reset ~2 min into the opening, with RX_VK_MESH_OPT=1; last marker 636eed4d5000d1c0

Desktop RDNA2 data point, with the mesh optimizer on. Full hookshot_log.txt and the kernel excerpt: https://gist.github.com/dvilelaf/a0fe9825d1a5ab12ece462b9360b2277

System

  • Hookshot v2.1.0 (source e561602e), official Hookshot-v2.1.0-x86_64.AppImage, native Linux build from my own .nup, game update v131072, language es.
  • GPU: AMD Radeon RX 6800 XT 16 GB (RADV NAVI21, 1002:73bf) → AMD Radeon RX 6800 XT (RADV NAVI21), Vulkan 1.4, driver 0x6400007; mesh shaders yes, host memory import yes, pipeline libraries yes
  • Mesa 25.0.7 (kisak PPA), Vulkan 1.4.313, kernel 6.8.0-138-generic, elementary OS 7.1 (Ubuntu 22.04 base), Xorg/X11, 32 GB RAM, 16 threads.
  • udmabuf now accessible (root:video): mem: the guest window is a memfd's (8), shared with the GPU as dma-bufs and dma-bufs of at most 64 MB (udmabuf's limit 64 MB); larger pools are host-pointer imports.

Configuration

# hookshot_env.txt
RX_VK_MESH_OPT=1
RX_VK_CHECKPOINTS=1

Everything else default: 2048x1152 output, frame generation off, robust buffers auto. The startup log no longer prints task and mesh programs built without the driver's optimizer, so MESH_OPT was active.

What happens

  • The updated build precompiled its pipelines cleanly (38,809 programs, 70 failed).
  • First session: intro movie at ~60 fps (2-5 draws a frame). Gameplay from ~12,000 presents at 40-48 fps with 800-1,060 draws a frame. Foliage flickers (leaves), no other visual corruption.
  • At frame 16112 the GPU stops completing work. Frame rate was still ~40 fps right before, no stall building up:
vk: 16080 presents, 40.4 fps; a frame: 757 draws (0 skipped), 138 dispatches, 138 passes, 140 barriers, 6 submits, 0.7 uploads (0.4 MB), 86 ub updates (60 overlays), GPU-bound wait 0.0 ms; 10813 pipelines (1344 ms), 0 programs (11 failed), 1549 textures (4072 MB)
vk:   finished before: marker 4616989 (draw of program 3741fc69b2a60e64, frame 16112)
vk:   RUNNING after: marker 4616990 (draw of program 636eed4d5000d1c0, frame 16112)
vk:   running: marker 4616991 (draw of program 636eed4d5000d1c0, frame 16112)
vk:   reached, earlier work unfinished: marker 4616992 (draw of program 179e086021f3d7c3, frame 16112)
vk:   reached, earlier work unfinished: marker 4616993 (draw of program e3f341ac12c40e2c, frame 16112)
vk:   reached, earlier work unfinished: marker 4616995 (draw of program 918adef1afaa39d4, frame 16112)
vk:   reached, earlier work unfinished: marker 4616998 (draw of program 31526778a6b5ade2, frame 16112)
vk:   reached, earlier work unfinished: marker 4617000 (draw of program 4a8885a040b23f4a, frame 16112)
vk: FATAL: the GPU device was lost (VK_ERROR_DEVICE_LOST)

Kernel (/var/log/kern.log, uptime 100679 s):

[drm:amdgpu_job_timedout] *ERROR* ring gfx_0.0.0 timeout, signaled seq=3169364, emitted seq=3169367
[drm:amdgpu_job_timedout] *ERROR* Process information: process hookshot pid 2491594 thread hookshot pid 2491670
amdgpu: GPU reset begin! / MODE1 reset / GPU smu mode1 reset
[drm] VRAM is lost due to GPU reset!
amdgpu: GPU reset(1) succeeded!
[drm:amdgpu_cs_ioctl] *ERROR* Failed to initialize parser -125!

After the reset, Xorg on the same GPU aborted inside Mesa (Fatal server error: Caught signal 6 (Aborted) in amdgpu_winsys_create) and the whole X session went down. Happy to attach the Xorg log if it helps.

Notes

  • 636eed4d5000d1c0 is the program @liomaroliveira saw on the RX 6700 XT (run 2, "RUNNING after"), and 918adef1afaa39d4 shows up in @rere225's 6900 XT markers too. On this 6800 XT RX_VK_MESH_OPT=1 alone is not enough, unlike the 6700 XT result.
  • Next I can run RX_VK_TASK_MESH_FALLBACK=1, RX_VK_NO_MESH=1, and RX_VK_MESH_OPT off for comparison and post the results if that's useful.
**RX 6800 XT (RADV NAVI21, Mesa 25.0.7): `gfx_0.0.0` timeout → MODE1 reset ~2 min into the opening, with `RX_VK_MESH_OPT=1`; last marker `636eed4d5000d1c0`** Desktop RDNA2 data point, with the mesh optimizer on. Full `hookshot_log.txt` and the kernel excerpt: https://gist.github.com/dvilelaf/a0fe9825d1a5ab12ece462b9360b2277 ### System - **Hookshot v2.1.0** (`source e561602e`), official `Hookshot-v2.1.0-x86_64.AppImage`, native Linux build from my own `.nup`, game update `v131072`, language es. - **GPU: AMD Radeon RX 6800 XT 16 GB (RADV NAVI21, `1002:73bf`)** → `AMD Radeon RX 6800 XT (RADV NAVI21), Vulkan 1.4, driver 0x6400007; mesh shaders yes, host memory import yes, pipeline libraries yes` - Mesa **25.0.7** (kisak PPA), Vulkan 1.4.313, **kernel 6.8.0-138-generic**, elementary OS 7.1 (Ubuntu 22.04 base), Xorg/X11, 32 GB RAM, 16 threads. - `udmabuf` now accessible (`root:video`): `mem: the guest window is a memfd's (8), shared with the GPU as dma-bufs` and `dma-bufs of at most 64 MB (udmabuf's limit 64 MB); larger pools are host-pointer imports`. ### Configuration ``` # hookshot_env.txt RX_VK_MESH_OPT=1 RX_VK_CHECKPOINTS=1 ``` Everything else default: 2048x1152 output, frame generation off, robust buffers auto. The startup log no longer prints `task and mesh programs built without the driver's optimizer`, so MESH_OPT was active. ### What happens - The updated build precompiled its pipelines cleanly (38,809 programs, 70 failed). - First session: intro movie at ~60 fps (2-5 draws a frame). Gameplay from ~12,000 presents at 40-48 fps with 800-1,060 draws a frame. Foliage flickers (leaves), no other visual corruption. - At **frame 16112** the GPU stops completing work. Frame rate was still ~40 fps right before, no stall building up: ``` vk: 16080 presents, 40.4 fps; a frame: 757 draws (0 skipped), 138 dispatches, 138 passes, 140 barriers, 6 submits, 0.7 uploads (0.4 MB), 86 ub updates (60 overlays), GPU-bound wait 0.0 ms; 10813 pipelines (1344 ms), 0 programs (11 failed), 1549 textures (4072 MB) vk: finished before: marker 4616989 (draw of program 3741fc69b2a60e64, frame 16112) vk: RUNNING after: marker 4616990 (draw of program 636eed4d5000d1c0, frame 16112) vk: running: marker 4616991 (draw of program 636eed4d5000d1c0, frame 16112) vk: reached, earlier work unfinished: marker 4616992 (draw of program 179e086021f3d7c3, frame 16112) vk: reached, earlier work unfinished: marker 4616993 (draw of program e3f341ac12c40e2c, frame 16112) vk: reached, earlier work unfinished: marker 4616995 (draw of program 918adef1afaa39d4, frame 16112) vk: reached, earlier work unfinished: marker 4616998 (draw of program 31526778a6b5ade2, frame 16112) vk: reached, earlier work unfinished: marker 4617000 (draw of program 4a8885a040b23f4a, frame 16112) vk: FATAL: the GPU device was lost (VK_ERROR_DEVICE_LOST) ``` Kernel (`/var/log/kern.log`, uptime 100679 s): ``` [drm:amdgpu_job_timedout] *ERROR* ring gfx_0.0.0 timeout, signaled seq=3169364, emitted seq=3169367 [drm:amdgpu_job_timedout] *ERROR* Process information: process hookshot pid 2491594 thread hookshot pid 2491670 amdgpu: GPU reset begin! / MODE1 reset / GPU smu mode1 reset [drm] VRAM is lost due to GPU reset! amdgpu: GPU reset(1) succeeded! [drm:amdgpu_cs_ioctl] *ERROR* Failed to initialize parser -125! ``` After the reset, Xorg on the same GPU aborted inside Mesa (`Fatal server error: Caught signal 6 (Aborted)` in `amdgpu_winsys_create`) and the whole X session went down. Happy to attach the Xorg log if it helps. ### Notes - `636eed4d5000d1c0` is the program @liomaroliveira saw on the RX 6700 XT (run 2, "RUNNING after"), and `918adef1afaa39d4` shows up in @rere225's 6900 XT markers too. On this 6800 XT `RX_VK_MESH_OPT=1` alone is not enough, unlike the 6700 XT result. - Next I can run `RX_VK_TASK_MESH_FALLBACK=1`, `RX_VK_NO_MESH=1`, and `RX_VK_MESH_OPT` off for comparison and post the results if that's useful.
simonwjackson commented 2026-11-11 14:30:07 +00:00 (Migrated from github.com)

Two data points that may help the last two reports (same RX 7900 XT / Navi31 here, Mesa 26.2.3; rows in #2202):

  • @dvilelaf: on our older build, the load into Kokiri Forest hung the same way (gfx ring timeout → MODE1 reset) in about 3 of 4 tries with native mesh. With RX_VK_FORCE_MESH_FALLBACK=1 (task and mesh as compute, keeps all foliage) we've had no hang in any run since, and it was also our fastest mode (~46.5 vs ~45 native, game fps). Might be worth one try on the 6800 XT instead of RX_VK_MESH_OPT=1.
  • @buffakee: if frame generation is on, the big FPS number counts generated frames; the small game N line under it is what you feel. On our 7900 XT the game runs about 40–46 there at 1920x1080–2448x1848 standing in Kokiri Forest, so 60 isn't reached on this card yet. Worth comparing your game number with frame generation off.
Two data points that may help the last two reports (same RX 7900 XT / Navi31 here, Mesa 26.2.3; rows in #2202): - @dvilelaf: on our older build, the load into Kokiri Forest hung the same way (gfx ring timeout → MODE1 reset) in about 3 of 4 tries with native mesh. With `RX_VK_FORCE_MESH_FALLBACK=1` (task and mesh as compute, keeps all foliage) we've had no hang in any run since, and it was also our fastest mode (~46.5 vs ~45 native, game fps). Might be worth one try on the 6800 XT instead of `RX_VK_MESH_OPT=1`. - @buffakee: if frame generation is on, the big FPS number counts generated frames; the small `game N` line under it is what you feel. On our 7900 XT the game runs about 40–46 there at 1920x1080–2448x1848 standing in Kokiri Forest, so 60 isn't reached on this card yet. Worth comparing your `game` number with frame generation off.
MattDev-974 commented 2026-11-11 14:51:24 +00:00 (Migrated from github.com)

This configuration works on my RX 6600 and prevents the GPU crash with RX_VK_TASK_MESH_FALLBACK=1:

RX_VK_TASK_MESH_FALLBACK=1
RX_VK_MESH_NOCULL=2c56dc1006942f74
RX_VK_CHECKPOINTS=1
RX_VK_SKIP_PROG=739acd678ae08655,c36a4f3f667c886a,d905f52b7517c681
RX_VK_WB_DIFF=0

RX_VK_TASK_MESH_FALLBACK=1 uses the compute fallback for task+mesh programs. With 0 (native path), I get VK_ERROR_DEVICE_LOST.

The game is now playable without crashing, but the grass/foliage is white. Therefore, this is only a temporary workaround and still has a graphical issue.

image

Note: AI assistance was used on this test

This configuration works on my RX 6600 and prevents the GPU crash with ```RX_VK_TASK_MESH_FALLBACK=1```: ``` RX_VK_TASK_MESH_FALLBACK=1 RX_VK_MESH_NOCULL=2c56dc1006942f74 RX_VK_CHECKPOINTS=1 RX_VK_SKIP_PROG=739acd678ae08655,c36a4f3f667c886a,d905f52b7517c681 RX_VK_WB_DIFF=0 ``` ```RX_VK_TASK_MESH_FALLBACK=1``` uses the compute fallback for task+mesh programs. With 0 (native path), I get ```VK_ERROR_DEVICE_LOST```. The game is now playable without crashing, but the grass/foliage is white. Therefore, this is only a temporary workaround and still has a graphical issue. <img width="2050" height="1160" alt="image" src="https://github.com/user-attachments/assets/dede0e8e-8954-46ff-81b8-5bb3364d5abc" /> **Note: AI assistance was used on this test**
buffakee commented 2026-11-11 15:38:21 +00:00 (Migrated from github.com)

Two data points that may help the last two reports (same RX 7900 XT / Navi31 here, Mesa 26.2.3; rows in #2202):

* [@dvilelaf](https://github.com/dvilelaf): on our older build, the load into Kokiri Forest hung the same way (gfx ring timeout → MODE1 reset) in about 3 of 4 tries with native mesh. With `RX_VK_FORCE_MESH_FALLBACK=1` (task and mesh as compute, keeps all foliage) we've had no hang in any run since, and it was also our fastest mode (~46.5 vs ~45 native, game fps). Might be worth one try on the 6800 XT instead of `RX_VK_MESH_OPT=1`.

* [@buffakee](https://github.com/buffakee): if frame generation is on, the big FPS number counts generated frames; the small `game N` line under it is what you feel. On our 7900 XT the game runs about 40–46 there at 1920x1080–2448x1848 standing in Kokiri Forest, so 60 isn't reached on this card yet. Worth comparing your `game` number with frame generation off.

Thanks for the suggestions! I ran some additional tests on my RX 7900 XT (Mesa 26.2.6, Ryzen 7 5800X3D).

Frame generation has generally been disabled throughout my testing, since I prefer native rendering.

I've discovered that resolution makes a substantial difference. My earlier testing was at native 2560 × 1440, whereas dropping back to the game's default rendering resolution produces considerably better performance, slightly better than the results you've reported.

However, my original issue wasn't simply the inability to reach 60 FPS. I was also experiencing noticeable visual hitching and judder during character and camera movement.

This at least clarifies that rendering resolution is a significant contributor to the performance difference. I'll distinguish between the resolution-related FPS drop and the movement-related hitching in my future testing.

> Two data points that may help the last two reports (same RX 7900 XT / Navi31 here, Mesa 26.2.3; rows in [#2202](https://git.magicbean.dev/MagicBeanDev/Hookshot/pulls/2202)): > > * [@dvilelaf](https://github.com/dvilelaf): on our older build, the load into Kokiri Forest hung the same way (gfx ring timeout → MODE1 reset) in about 3 of 4 tries with native mesh. With `RX_VK_FORCE_MESH_FALLBACK=1` (task and mesh as compute, keeps all foliage) we've had no hang in any run since, and it was also our fastest mode (~46.5 vs ~45 native, game fps). Might be worth one try on the 6800 XT instead of `RX_VK_MESH_OPT=1`. > > * [@buffakee](https://github.com/buffakee): if frame generation is on, the big FPS number counts generated frames; the small `game N` line under it is what you feel. On our 7900 XT the game runs about 40–46 there at 1920x1080–2448x1848 standing in Kokiri Forest, so 60 isn't reached on this card yet. Worth comparing your `game` number with frame generation off. Thanks for the suggestions! I ran some additional tests on my RX 7900 XT (Mesa 26.2.6, Ryzen 7 5800X3D). Frame generation has generally been disabled throughout my testing, since I prefer native rendering. I've discovered that resolution makes a substantial difference. My earlier testing was at native 2560 × 1440, whereas dropping back to the game's default rendering resolution produces considerably better performance, slightly better than the results you've reported. However, my original issue wasn't simply the inability to reach 60 FPS. I was also experiencing noticeable visual hitching and judder during character and camera movement. This at least clarifies that rendering resolution is a significant contributor to the performance difference. I'll distinguish between the resolution-related FPS drop and the movement-related hitching in my future testing.
simonwjackson commented 2026-11-11 15:39:57 +00:00 (Migrated from github.com)

@MattDev-974 try RX_VK_FORCE_MESH_FALLBACK=1 in place of RX_VK_TASK_MESH_FALLBACK=1. It runs the mesh stage as compute too, not only the task stage. On our RX 7900 XT it drew all the grass and foliage in Kokiri Forest, with no hangs in any run (rows in #2202). The RX_VK_SKIP_PROG list may also be part of the white foliage, so one run without it would show that.

@MattDev-974 try `RX_VK_FORCE_MESH_FALLBACK=1` in place of `RX_VK_TASK_MESH_FALLBACK=1`. It runs the mesh stage as compute too, not only the task stage. On our RX 7900 XT it drew all the grass and foliage in Kokiri Forest, with no hangs in any run (rows in #2202). The `RX_VK_SKIP_PROG` list may also be part of the white foliage, so one run without it would show that.
jabbaxipil commented 2026-11-11 15:45:13 +00:00 (Migrated from github.com)

One NVIDIA device lost on Linux, intermittent (1 of 2 sessions so far).

  • Hookshot v2.1.0-rc.3-46-gddafc1f (nightly, source d13bde75), started as ./bin/hookshot from the game folder.
  • RTX 4070 12 GB, 615.71.09, Ubuntu 26.04.1, GNOME 50 Wayland, Ryzen 7 5800X3D, 64 GB.
  • 2560x1440 output, DLAA (model K), frame generation 3x at 180 Hz, Reflex on, RX_VK_PARALLEL=4, no mods.

About 8 minutes in, during free play after Kokiri Forest:

vk: pool 0x1010eb8000+0xf00000 imported in 5401.7 ms as 0x1010000000..0x1012000000 (81 imports, 6238 ms in all)
vk: slow upload 5401.8 ms: #39835 0x100032a1000 2560x1440x1 x1 levels 1 NVN 0xa, 15360 of 15360 KB again
vk: submit 186984 failed (-4)
vk: device lost: 2 checkpoints (55197175 markers set)
vk:   stage 0x1: marker 55194495 (draw of program 02ee95fbf9e0050d, frame 26704)
(before/after: programs ffb53ed102dd9908, 58ad8db34a72f9ec, 060f95b97897c523)

Kernel at the same second:

NVRM: Xid 109, name=hookshot, channel 0x00000012, errorString CTX SWITCH TIMEOUT, Info 0x1c016
NVRM: Xid 31, name=hookshot, MMU Fault: ENGINE GRAPHICS GPC0 UNRECOGNIZED_CLIENT faulted @ 0x1803fc_10801ead. Fault is of type UNRECOGNIZED_FAULT UNRECOGNIZED_ACCESS_TYPE

The GPU recovered without a reboot. These are the only Xid lines in this machine's kernel log since Nov 3.

The game's VRAM was 10.0-10.7 GB of 10.8 GB allowed in the minutes before (10,433 MB on the last line). But a second, 17-minute session on the same build reached the same VRAM (up to 10.5 GB; 11,951 of 12,282 MiB for the whole card) with no crash. So being near the limit is not enough by itself. The 5.4 s import just before the reset is the clearest lead (my guess). Both sessions also had a few NVRM: memMap_IMPL: CPU mapping not supported for addressSpace: 0x1 lines without a crash.

The same Xid 109 is reported for Lichii (zortos293/Lichii #619) on an RTX 4070 with a 615-series driver, so this driver series may be involved. Full hookshot_log.txt of the crashed run attached (home path removed). Discord was hooked into the game (game activity); I have not yet tried a crash run without it.

hookshot_log_crash_2026-11-11.txt

One NVIDIA device lost on Linux, intermittent (1 of 2 sessions so far). - Hookshot v2.1.0-rc.3-46-gddafc1f (nightly, source d13bde75), started as `./bin/hookshot` from the game folder. - RTX 4070 12 GB, 615.71.09, Ubuntu 26.04.1, GNOME 50 Wayland, Ryzen 7 5800X3D, 64 GB. - 2560x1440 output, DLAA (model K), frame generation 3x at 180 Hz, Reflex on, `RX_VK_PARALLEL=4`, no mods. About 8 minutes in, during free play after Kokiri Forest: vk: pool 0x1010eb8000+0xf00000 imported in 5401.7 ms as 0x1010000000..0x1012000000 (81 imports, 6238 ms in all) vk: slow upload 5401.8 ms: #39835 0x100032a1000 2560x1440x1 x1 levels 1 NVN 0xa, 15360 of 15360 KB again vk: submit 186984 failed (-4) vk: device lost: 2 checkpoints (55197175 markers set) vk: stage 0x1: marker 55194495 (draw of program 02ee95fbf9e0050d, frame 26704) (before/after: programs ffb53ed102dd9908, 58ad8db34a72f9ec, 060f95b97897c523) Kernel at the same second: NVRM: Xid 109, name=hookshot, channel 0x00000012, errorString CTX SWITCH TIMEOUT, Info 0x1c016 NVRM: Xid 31, name=hookshot, MMU Fault: ENGINE GRAPHICS GPC0 UNRECOGNIZED_CLIENT faulted @ 0x1803fc_10801ead. Fault is of type UNRECOGNIZED_FAULT UNRECOGNIZED_ACCESS_TYPE The GPU recovered without a reboot. These are the only Xid lines in this machine's kernel log since Nov 3. The game's VRAM was 10.0-10.7 GB of 10.8 GB allowed in the minutes before (10,433 MB on the last line). But a second, 17-minute session on the same build reached the same VRAM (up to 10.5 GB; 11,951 of 12,282 MiB for the whole card) with no crash. So being near the limit is not enough by itself. The 5.4 s import just before the reset is the clearest lead (my guess). Both sessions also had a few `NVRM: memMap_IMPL: CPU mapping not supported for addressSpace: 0x1` lines without a crash. The same Xid 109 is reported for Lichii (zortos293/Lichii #619) on an RTX 4070 with a 615-series driver, so this driver series may be involved. Full `hookshot_log.txt` of the crashed run attached (home path removed). Discord was hooked into the game (game activity); I have not yet tried a crash run without it. [hookshot_log_crash_2026-11-11.txt](https://github.com/user-attachments/files/34695006/hookshot_log_crash_2026-11-11.txt)
addisonbair commented 2026-11-11 16:22:05 +00:00 (Migrated from github.com)

Bisect result for the lost CPU/GPU overlap: #1375 (e63d30d). I bisected --first-parent v2.0.14..fc375e9 on the P16 setup from my previous comment (RTX PRO 2000, GPU locked to 900 MHz, the Deck's env). Each step was built from source, and the measure was overlap = replay + GPU time − frame time. The controls separated: v2.0.14 at +2.8 ms, fc375e9 at −1.8 ms. 10cfd70 was good (+1.1) and e63d30d bad (−1.8).

On current main (ebbba2e), the overlap is −1.4 ms, and +1.4 ms with #1375 reverted. The revert costs its CPU gain, though: replay goes from 10.1 to 14.9 ms, programs from 1.3 to 5.1. So I don't think a revert is the right fix.

What the Deck shows (fc375e9, the same standing Kokiri scene):

  • About 175 of every 3,000 readbacks wait for their write-back, at 25-30 ms each (readbacks of GPU results line). v2.0.14 never logs that line in the same scene.
  • RX_VK_LOG_READBACK_WAITS=1 shows only two ranges, alternating: 0x113b623000 +0x3980 and 0x113b628000 +0x3980. RX_VK_LOG_READBACK shows the same words in them every frame: 3dcccccd 46c35000 3fe38e3b 3f7fffbd, i.e. 0.1, 25000, 1.777, 0.99999. They look like camera constants that the CPU writes and the GPU only reads, not GPU results.
  • A diagnostic log in note_direct_write shows these pages marked on every bind, from gpu_buffer_bind(..., written=true). I haven't found yet which binding passes written.
  • RX_VK_NO_READBACK_WAIT=1 brings fc375e9 from 14.1-14.4 to 19.6 fps (v2.0.14: 19.7), and the game's fence waits come back (0 → 82 per 5 s). It showed no exposure steps: brightness over 150 screenshots, one every 6 frames, moved at most 0.34 between shots, against 0.39 on v2.0.14.

On the Deck, reverting #1375 from fc375e9 alone didn't remove the waits (still ~170 per 3,000, ~30 ms each). So something else also marks those pages there. My guess is that the fix belongs in the write-back marking (a binding conservatively flagged as written), not in #1375's cache. That's from reading and logging, not proven.

**Bisect result for the lost CPU/GPU overlap: #1375 (e63d30d).** I bisected `--first-parent v2.0.14..fc375e9` on the P16 setup from my previous comment (RTX PRO 2000, GPU locked to 900 MHz, the Deck's env). Each step was built from source, and the measure was overlap = replay + GPU time − frame time. The controls separated: v2.0.14 at +2.8 ms, fc375e9 at −1.8 ms. 10cfd70 was good (+1.1) and e63d30d bad (−1.8). On current main (ebbba2e), the overlap is −1.4 ms, and +1.4 ms with #1375 reverted. The revert costs its CPU gain, though: replay goes from 10.1 to 14.9 ms, programs from 1.3 to 5.1. So I don't think a revert is the right fix. **What the Deck shows (fc375e9, the same standing Kokiri scene):** - About 175 of every 3,000 readbacks wait for their write-back, at 25-30 ms each (`readbacks of GPU results` line). v2.0.14 never logs that line in the same scene. - `RX_VK_LOG_READBACK_WAITS=1` shows only two ranges, alternating: `0x113b623000 +0x3980` and `0x113b628000 +0x3980`. `RX_VK_LOG_READBACK` shows the same words in them every frame: `3dcccccd 46c35000 3fe38e3b 3f7fffbd`, i.e. 0.1, 25000, 1.777, 0.99999. They look like camera constants that the CPU writes and the GPU only reads, not GPU results. - A diagnostic log in `note_direct_write` shows these pages marked on every bind, from `gpu_buffer_bind(..., written=true)`. I haven't found yet which binding passes `written`. - `RX_VK_NO_READBACK_WAIT=1` brings fc375e9 from 14.1-14.4 to 19.6 fps (v2.0.14: 19.7), and the game's fence waits come back (0 → 82 per 5 s). It showed no exposure steps: brightness over 150 screenshots, one every 6 frames, moved at most 0.34 between shots, against 0.39 on v2.0.14. On the Deck, reverting #1375 from fc375e9 alone didn't remove the waits (still ~170 per 3,000, ~30 ms each). So something else also marks those pages there. My guess is that the fix belongs in the write-back marking (a binding conservatively flagged as written), not in #1375's cache. That's from reading and logging, not proven.
quazardous commented 2026-11-11 16:45:53 +00:00 (Migrated from github.com)

A tool offer, not a bug report — and if it is noise in a tracking issue, say so
and I will drop it.

Reading this issue, the hard part is rarely the symptom: it is that "stutters in
the forest" from one machine cannot be set against "stutters in the forest" from
another. Different save, different route, different settings, numbers read off
the OS rather than the renderer. So after reporting here from a ROG Ally X I
built the harness I needed to stop guessing, and it is now doing real work:

What it does. The game runs headless in a nested Wayland compositor with a
virtual Xbox pad, driven by a YAML scenario rather than by hand. A scenario
waits on the game's own log lines instead of sleeping: vk: replay ready,
oe: startup logo finished, then cheats: inventory probe from
HOS_OOT_CHEATS=1, which is how it knows Link exists rather than guessing from
a picture. The title screen is recognised by comparing against a reference with
a mask over the shield so the movie behind it does not count. Then it plays a
scripted walk to the millisecond and collects RX_VK_FRAME_LOG, captures, and a
manifest holding the Hookshot version, the kernel, the driver and a digest of
the scenario and config. Two runs are comparable, and a result can be replayed
by someone else.

What it has produced this week, all of it on a Ryzen Z1 Extreme / Radeon
780M:

  • the v2.1.0 Deku Tree regression in #2156, measured with the driver held fixed
    across versions — which is how I caught that my own first attribution of it
    was unsound, because the container's RADV had moved under me between two
    measurements;
  • the one-frame flash counts in #1005, repeated three times per setting, which
    located a brightness pulse that RX_VK_PER_QUEUE_FENCES=0 removes half of;
  • the village's texture budget against the Deku Tree's in #2156 — 1097 textures
    for 3146 MB against a 2560 MB budget, with the eviction lines to match.

Two cautions it encodes, in case they help anyone here. The pad's confirm
button is B, not A, because hookshot_options.ini has pad_a=1 and that lands
on an Xbox pad's B. And the first start-ups after an update are very long — on
this machine it took three launches before the title screen appeared, while the
program cache filled to 6.7 GB; a scenario with a 240 s timeout simply fails
there, which looks like a hang and is not one.

On your rules. Neither repository holds any game file, dump, key, save or
build output, and nothing in them helps anyone obtain the game: they drive a
copy you already built yourself. Reference images and captures are gitignored
and stay on the machine that made them.

If a specific measurement on Z1 Extreme / RADV would help you — another scene, a
setting toggled, an rc build before you tag it — it is about two minutes a run
now. Ask here and I will post the numbers.

A tool offer, not a bug report — and if it is noise in a tracking issue, say so and I will drop it. Reading this issue, the hard part is rarely the symptom: it is that "stutters in the forest" from one machine cannot be set against "stutters in the forest" from another. Different save, different route, different settings, numbers read off the OS rather than the renderer. So after reporting here from a ROG Ally X I built the harness I needed to stop guessing, and it is now doing real work: - [hookshot-wbox](https://github.com/quazardous/hookshot-wbox) — scenarios for this game - [wbox-mcp](https://github.com/quazardous/wbox-mcp) — the box they run in **What it does.** The game runs headless in a nested Wayland compositor with a virtual Xbox pad, driven by a YAML scenario rather than by hand. A scenario waits on *the game's own log lines* instead of sleeping: `vk: replay ready`, `oe: startup logo finished`, then `cheats: inventory probe` from `HOS_OOT_CHEATS=1`, which is how it knows Link exists rather than guessing from a picture. The title screen is recognised by comparing against a reference with a mask over the shield so the movie behind it does not count. Then it plays a scripted walk to the millisecond and collects `RX_VK_FRAME_LOG`, captures, and a manifest holding the Hookshot version, the kernel, the driver and a digest of the scenario and config. Two runs are comparable, and a result can be replayed by someone else. **What it has produced this week**, all of it on a Ryzen Z1 Extreme / Radeon 780M: - the v2.1.0 Deku Tree regression in #2156, measured with the driver held fixed across versions — which is how I caught that my own first attribution of it was unsound, because the container's RADV had moved under me between two measurements; - the one-frame flash counts in #1005, repeated three times per setting, which located a brightness pulse that `RX_VK_PER_QUEUE_FENCES=0` removes half of; - the village's texture budget against the Deku Tree's in #2156 — 1097 textures for 3146 MB against a 2560 MB budget, with the eviction lines to match. **Two cautions it encodes, in case they help anyone here.** The pad's confirm button is B, not A, because `hookshot_options.ini` has `pad_a=1` and that lands on an Xbox pad's B. And the first start-ups after an update are very long — on this machine it took three launches before the title screen appeared, while the program cache filled to 6.7 GB; a scenario with a 240 s timeout simply fails there, which looks like a hang and is not one. **On your rules.** Neither repository holds any game file, dump, key, save or build output, and nothing in them helps anyone obtain the game: they drive a copy you already built yourself. Reference images and captures are gitignored and stay on the machine that made them. If a specific measurement on Z1 Extreme / RADV would help you — another scene, a setting toggled, an rc build before you tag it — it is about two minutes a run now. Ask here and I will post the numbers.
addisonbair commented 2026-11-11 18:27:21 +00:00 (Migrated from github.com)

Steam Deck performance: what I measured over the last two days, and where I think the ceiling is. Steam Deck LCD, SteamOS 3.9, GPU at 1200 MHz, FSR 3.1 + handheld profile. All numbers are from a deterministic headless run of the standing Kokiri scene (~2,400 draws, the P16 bench save). A is pressed only until gameplay starts, so every run renders the same scene; runs are alternated A/B, ~2 min each, and the noise is ~1-4 ms of replay.

Where a frame goes (v2.0.14): ~20 fps, replay ~37 ms, GPU ~28 ms. The Deck is CPU-bound on the replay thread, and the GPU would already fit 30.

  • Replay breakdown: draw ~24 (descriptors ~9), commands ~9, queue submit ~7 (6 submits, ~1.1 ms each), programs ~4.
  • Profile of the replay thread (user + kernel): ~54% hookshot_vk.so (build_descriptors 6%, dw 5%, std::map walks 4%, texture_view_of 3%, gpu_buffer_bind 2.5%, __tls_get_addr 2%), ~17% RADV, ~10% kernel. It's on the CPU ~56% of the time. Most of the 7 ms queue submit is blocked, not working: pthread_mutex_lock inside RADV's submit. amdgpu_cs_ioctl is only ~0.9 ms a frame.

Regressions since v2.0.14 on the Deck:

  1. #1375: readback waits (bisect above). A correction to my earlier comment: the waited buffer (0x113b623000/628000 +0x3980) is bound written by six compute programs (stage 5, e.g. 44511d69b52282ad, 383a566958350efe, slots 0/9/10), through the storage-buffer path (d.is_written). The camera constants I decoded are only its first words, so the GPU may well write the rest, and the wait may be legitimate rather than a false positive. What costs the Deck is how it waits: the game thread waits ~25 ms each frame (replay caught up plus GPU done). RX_VK_NO_READBACK_WAIT=1 gives back v2.0.14's speed with no visible exposure stepping. On the Deck, reverting #1375 from fc375e9 doesn't remove the waits, so something else marks those pages there.
  2. #1999 (idle send): +5 ms of queue submit on the Deck. #2422 makes it default-off on integrated GPUs.
  3. With both worked around, current main is at parity with v2.0.14 on the Deck (20.4 vs 19.5 fps). #1375's CPU gain doesn't show here (programs ~4.3 ms either way).

Tried, no win on the Deck (each as an A/B):

  • RX_VK_BATCH_MAX 8/16 (still 6 submits)
  • RX_VK_MIRROR=1 (12.7 fps)
  • RX_VK_IMPORT_CHUNK_MB 64 (27 pools instead of 36, the same submit cost)
  • RX_VK_PARALLEL 2/3 (19.2/18.9 vs 19.1)
  • RX_VK_CAPTURE_THREADS=0
  • RX_VK_PER_QUEUE_FENCES=1
  • RX_VK_EVENT_WAITS=0 / RX_VK_SYNC_WAITS=0 (submit -0.7 ms)
  • HOS_PIN for OptimizeChangeBank / ParallelDecomp (its CPU halved, the same fps)
  • -ftls-model=initial-exec
  • DCC through a format list on the colour targets: -0.6 ms GPU, but it broke the light shafts via refused R32_UINT/E5B9G9R9 views, so I parked it.
  • Mesa main RADV (26.99, debugoptimized): queue submit 7.0 → 4.6 ms and GPU -0.9 ms, but commands +1 ms, so fps was flat; a release build might net 2-3 ms.

GPU, for later: the top passes are full-screen 43ec86f35fd937b9 3.75 ms (a deferred-lighting loop over lights, ~450 ALU a light), d8e59341cf4f629c 1.7 ms and da7a7ab28b8e73d9 1.0 ms; barriers ~1 ms.

The horizon as I see it. The replay's ~37 ms is spread over many functions, with no single hot spot. The incremental levers I can measure add up to perhaps 5-8 ms:

  • Image/sampler descriptors repeat ~76% frame to frame (the whole set only 0.3%, buffers without their offsets 44%). A cache of that half might save 2-4 ms.
  • Newer RADV, 2-3 ms.
  • The submit-path lock, unknown.

That's enough for mid-20s, not 30. Getting to 30 on this CPU probably needs the replay to skip translating work that repeats: reuse recorded Vulkan commands for passes whose NVN streams match a recent frame, with constants rebased through dynamic offsets. Before anyone builds that, it needs its repeat rate measured against the last N frames, not just the last one. I'm happy to measure that, or any candidate, on the Deck harness.

**Steam Deck performance: what I measured over the last two days, and where I think the ceiling is.** Steam Deck LCD, SteamOS 3.9, GPU at 1200 MHz, FSR 3.1 + handheld profile. All numbers are from a deterministic headless run of the standing Kokiri scene (~2,400 draws, the P16 bench save). A is pressed only until gameplay starts, so every run renders the same scene; runs are alternated A/B, ~2 min each, and the noise is ~1-4 ms of replay. **Where a frame goes (v2.0.14):** ~20 fps, **replay ~37 ms**, GPU ~28 ms. The Deck is CPU-bound on the replay thread, and the GPU would already fit 30. - Replay breakdown: draw ~24 (descriptors ~9), commands ~9, queue submit ~7 (6 submits, ~1.1 ms each), programs ~4. - Profile of the replay thread (user + kernel): ~54% `hookshot_vk.so` (build_descriptors 6%, dw 5%, std::map walks 4%, texture_view_of 3%, gpu_buffer_bind 2.5%, __tls_get_addr 2%), ~17% RADV, ~10% kernel. It's on the CPU ~56% of the time. Most of the 7 ms `queue submit` is blocked, not working: `pthread_mutex_lock` inside RADV's submit. `amdgpu_cs_ioctl` is only ~0.9 ms a frame. **Regressions since v2.0.14 on the Deck:** 1. **#1375:** readback waits (bisect above). **A correction to my earlier comment:** the waited buffer (`0x113b623000/628000 +0x3980`) is bound written by six compute programs (stage 5, e.g. `44511d69b52282ad`, `383a566958350efe`, slots 0/9/10), through the storage-buffer path (`d.is_written`). The camera constants I decoded are only its first words, so the GPU may well write the rest, and the wait may be legitimate rather than a false positive. What costs the Deck is how it waits: the game thread waits ~25 ms each frame (replay caught up plus GPU done). `RX_VK_NO_READBACK_WAIT=1` gives back v2.0.14's speed with no visible exposure stepping. On the Deck, reverting #1375 from fc375e9 doesn't remove the waits, so something else marks those pages there. 2. **#1999 (idle send):** +5 ms of queue submit on the Deck. #2422 makes it default-off on integrated GPUs. 3. With both worked around, current main is at parity with v2.0.14 on the Deck (20.4 vs 19.5 fps). #1375's CPU gain doesn't show here (programs ~4.3 ms either way). **Tried, no win on the Deck** (each as an A/B): - `RX_VK_BATCH_MAX` 8/16 (still 6 submits) - `RX_VK_MIRROR=1` (12.7 fps) - `RX_VK_IMPORT_CHUNK_MB` 64 (27 pools instead of 36, the same submit cost) - `RX_VK_PARALLEL` 2/3 (19.2/18.9 vs 19.1) - `RX_VK_CAPTURE_THREADS=0` - `RX_VK_PER_QUEUE_FENCES=1` - `RX_VK_EVENT_WAITS=0` / `RX_VK_SYNC_WAITS=0` (submit -0.7 ms) - `HOS_PIN` for OptimizeChangeBank / ParallelDecomp (its CPU halved, the same fps) - `-ftls-model=initial-exec` - DCC through a format list on the colour targets: -0.6 ms GPU, but it broke the light shafts via refused R32_UINT/E5B9G9R9 views, so I parked it. - Mesa main RADV (26.99, debugoptimized): queue submit 7.0 → 4.6 ms and GPU -0.9 ms, but commands +1 ms, so fps was flat; a release build might net 2-3 ms. **GPU, for later:** the top passes are full-screen `43ec86f35fd937b9` 3.75 ms (a deferred-lighting loop over lights, ~450 ALU a light), `d8e59341cf4f629c` 1.7 ms and `da7a7ab28b8e73d9` 1.0 ms; barriers ~1 ms. **The horizon as I see it.** The replay's ~37 ms is spread over many functions, with no single hot spot. The incremental levers I can measure add up to perhaps 5-8 ms: - Image/sampler descriptors repeat ~76% frame to frame (the whole set only 0.3%, buffers without their offsets 44%). A cache of that half might save 2-4 ms. - Newer RADV, 2-3 ms. - The submit-path lock, unknown. That's enough for mid-20s, not 30. Getting to 30 on this CPU probably needs the replay to skip translating work that repeats: reuse recorded Vulkan commands for passes whose NVN streams match a recent frame, with constants rebased through dynamic offsets. Before anyone builds that, it needs its repeat rate measured against the last N frames, not just the last one. I'm happy to measure that, or any candidate, on the Deck harness.
matvei8123-cyber commented 2026-11-11 18:37:24 +00:00 (Migrated from github.com)

RX 6800 — RADV vs AMDVLK 2025.Q2.1 (CachyOS)

Hardware:

  • GPU: AMD Radeon RX 6800 16 GB (RDNA 2 / Navi 21)
  • CPU: AMD Ryzen 5 8400F
  • RAM: 32 GB
  • OS: CachyOS Linux
  • Kernel: 7.3.3-1-cachyos
  • Mesa: 26.2.6-arch3.1
  • AMDVLK: 2025.Q2.1

RADV testing:

With RADV, I was unable to get past the fairy cutscene near the beginning of the game. Shortly after that scene, the GPU driver would crash, making further gameplay impossible.

System logs showed gfx_0.0.0 ring timeout, followed by failed GPU ring reset attempts.

I also tried launching the game with RX_VK_MESH_OPT=1, but this did not solve the problem.

AMDVLK testing:

After switching to AMDVLK 2025.Q2.1, the game finally allowed me to get past the fairy cutscene and continue playing.

So far, gameplay has been relatively stable, with no comparable GPU driver crashes. Performance is not particularly high, hovering around 39–52 FPS, but the game is actually playable now.

Conclusion:

On my RX 6800, AMDVLK 2025.Q2.1 appears significantly more stable than RADV in the opening section of the game. Despite the relatively low FPS, being able to get past the point where RADV consistently crashed is a major improvement.

I will continue testing and report any further crashes or stability issues.

### RX 6800 — RADV vs AMDVLK 2025.Q2.1 (CachyOS) **Hardware:** - GPU: AMD Radeon RX 6800 16 GB (RDNA 2 / Navi 21) - CPU: AMD Ryzen 5 8400F - RAM: 32 GB - OS: CachyOS Linux - Kernel: 7.3.3-1-cachyos - Mesa: 26.2.6-arch3.1 - AMDVLK: 2025.Q2.1 **RADV testing:** With RADV, I was unable to get past the fairy cutscene near the beginning of the game. Shortly after that scene, the GPU driver would crash, making further gameplay impossible. System logs showed `gfx_0.0.0 ring timeout`, followed by failed GPU ring reset attempts. I also tried launching the game with `RX_VK_MESH_OPT=1`, but this did not solve the problem. **AMDVLK testing:** After switching to AMDVLK 2025.Q2.1, the game finally allowed me to get past the fairy cutscene and continue playing. So far, gameplay has been relatively stable, with no comparable GPU driver crashes. Performance is not particularly high, hovering around **39–52 FPS**, but the game is actually playable now. **Conclusion:** On my RX 6800, AMDVLK 2025.Q2.1 appears significantly more stable than RADV in the opening section of the game. Despite the relatively low FPS, being able to get past the point where RADV consistently crashed is a major improvement. I will continue testing and report any further crashes or stability issues.
valentas commented 2026-11-11 18:39:06 +00:00 (Migrated from github.com)

Steam Deck: RX_VK_MESH_OPT=1 stops the hang, RX_VK_MIRROR=1 removes the flashing (measured)

Setup: Steam Deck, SteamOS Game Mode, Mesa 26.2 RADV VANGOGH. Hookshot v2.0.11 (source c3d60938), the Linux game folder built with the AppImage's toolchain. Two local, logging-only switches were added; they were off in the runs below. Handheld profile on, frame generation off.

1. The hang: fixed by RX_VK_MESH_OPT=1

  • With defaults: title screen → Continue → black screen → radv/amdgpu: The CS has been cancelled because the context is lost. This context is innocent. → batched submit failed (-4) → the process is killed.
  • With RX_VK_MESH_OPT=1, nothing else changed: Kokiri Forest loads. Six sessions of a few minutes each had no device loss.
  • This matches #1965 / #2311. The log line task and mesh programs built without the driver's optimizer (AMD; RX_VK_MESH_OPT=1: with it) is the setting that matters on RADV.
  • I also measured the occlusion task shader 2c56dc1006942f74. Its depth grid (c3+0xc10) is never larger than 32 × 18 cells on the Deck, so a runaway loop is not the cause.

2. The full-screen flashing: data races, not exposure

Once in game, the screen flashed white/black about every second. I measured it with the built-in detector: RX_VK_SHOTS=<dir> RX_VK_SHOT_EVERY=1 RX_VK_FLASH=1 RX_VK_FLASH_DUMPS=0 RX_VK_EXPOSURE_LOG=2.

Run (otherwise the same env: MESH_OPT=1 UB_SNAPSHOT=1) flashes logged presents in Kokiri
default (VRAM mirror of buffer pools off) 45 ~1,350
RX_VK_MIRROR=1 0 ~1,000
  • With mirrors off, the exposure (c3+0x38 of 73320e720a317817) is exactly 1.0 on every present, flash frames included.
  • The flash frames (attached: a = before, b = flash, c = after):
    • All foliage (leaves and grass) is drawn solid white.
    • The HUD is scrambled: the hearts are gone, a heart is drawn where the minimap is, and the minimap and item icon are missing.
    • The neighbouring frames are clean.
  • This looks like single frames that read the game's per-frame buffers after the CPU has started rewriting them. On the Deck the GPU reads the imported guest memory directly, because mirrors default to off on integrated GPUs.

Tried without effect on the flashing (with mirrors off):

  • RX_VK_EVENT_WAITS=0
  • RX_VK_PER_QUEUE_FENCES=0 RX_VK_WAIT_GPU=0 RX_VK_BATCH_MAX=4: also dropped the frame rate a lot.
  • RX_VK_UB_SNAPSHOT=1 (v2.0.11's version) was on in both runs in the table.

Cost of RX_VK_MIRROR=1 on the Deck

mirrors off mirrors on
replay submit (CPU) ~25 ms ~44–48 ms
replay memory sync ~1 ms ~8–11 ms
GPU time (100% resolution) ~45–49 ms ~57 ms

The mirrors line reads mirrors 65–68 (768 MB): 7.5–9.4 MB synced in ~860–1030 copies, ~12.5–12.9 MB written back a frame.

The result is about 11–14 fps with mirrors on, against about 14–20 fps with them off (flashing). The replay thread's CPU time is now the limit; dropping the 3D resolution to 50% lowered GPU time to 33–46 ms but did not raise the fps.

Suggestion: on integrated GPUs it might be enough to mirror (or read from the submit-time captures) only the pools that hold per-frame data, such as the foliage instance data and the HUD constants. That would keep the flash fix without paying for all 768 MB. I can run a test build or more detector runs on the Deck if that helps.

Env for anyone on a Deck who wants to try (v2.0.11, hookshot_env.txt):

RX_VK_MESH_OPT=1
RX_VK_MIRROR=1
RX_VK_UB_SNAPSHOT=1
flash_1339_b
**Steam Deck: `RX_VK_MESH_OPT=1` stops the hang, `RX_VK_MIRROR=1` removes the flashing (measured)** Setup: Steam Deck, SteamOS Game Mode, Mesa 26.2 RADV VANGOGH. Hookshot v2.0.11 (source c3d60938), the Linux game folder built with the AppImage's toolchain. Two local, logging-only switches were added; they were off in the runs below. Handheld profile on, frame generation off. **1. The hang: fixed by `RX_VK_MESH_OPT=1`** - With defaults: title screen → Continue → black screen → `radv/amdgpu: The CS has been cancelled because the context is lost. This context is innocent.` → `batched submit failed (-4)` → the process is killed. - With `RX_VK_MESH_OPT=1`, nothing else changed: Kokiri Forest loads. Six sessions of a few minutes each had no device loss. - This matches #1965 / #2311. The log line `task and mesh programs built without the driver's optimizer (AMD; RX_VK_MESH_OPT=1: with it)` is the setting that matters on RADV. - I also measured the occlusion task shader `2c56dc1006942f74`. Its depth grid (c3+0xc10) is never larger than 32 × 18 cells on the Deck, so a runaway loop is not the cause. **2. The full-screen flashing: data races, not exposure** Once in game, the screen flashed white/black about every second. I measured it with the built-in detector: `RX_VK_SHOTS=<dir> RX_VK_SHOT_EVERY=1 RX_VK_FLASH=1 RX_VK_FLASH_DUMPS=0 RX_VK_EXPOSURE_LOG=2`. | Run (otherwise the same env: `MESH_OPT=1 UB_SNAPSHOT=1`) | flashes logged | presents in Kokiri | |---|---|---| | default (`VRAM mirror of buffer pools off`) | **45** | ~1,350 | | `RX_VK_MIRROR=1` | **0** | ~1,000 | - With mirrors off, the exposure (c3+0x38 of `73320e720a317817`) is exactly 1.0 on every present, flash frames included. - The flash frames (attached: a = before, b = flash, c = after): - All foliage (leaves and grass) is drawn solid white. - The HUD is scrambled: the hearts are gone, a heart is drawn where the minimap is, and the minimap and item icon are missing. - The neighbouring frames are clean. - This looks like single frames that read the game's per-frame buffers after the CPU has started rewriting them. On the Deck the GPU reads the imported guest memory directly, because mirrors default to off on integrated GPUs. Tried without effect on the flashing (with mirrors off): - `RX_VK_EVENT_WAITS=0` - `RX_VK_PER_QUEUE_FENCES=0 RX_VK_WAIT_GPU=0 RX_VK_BATCH_MAX=4`: also dropped the frame rate a lot. - `RX_VK_UB_SNAPSHOT=1` (v2.0.11's version) was on in both runs in the table. **Cost of `RX_VK_MIRROR=1` on the Deck** | | mirrors off | mirrors on | |---|---|---| | replay `submit` (CPU) | ~25 ms | ~44–48 ms | | replay `memory sync` | ~1 ms | ~8–11 ms | | GPU time (100% resolution) | ~45–49 ms | ~57 ms | The mirrors line reads `mirrors 65–68 (768 MB): 7.5–9.4 MB synced in ~860–1030 copies, ~12.5–12.9 MB written back` a frame. The result is about 11–14 fps with mirrors on, against about 14–20 fps with them off (flashing). The replay thread's CPU time is now the limit; dropping the 3D resolution to 50% lowered GPU time to 33–46 ms but did not raise the fps. **Suggestion:** on integrated GPUs it might be enough to mirror (or read from the submit-time captures) only the pools that hold per-frame data, such as the foliage instance data and the HUD constants. That would keep the flash fix without paying for all 768 MB. I can run a test build or more detector runs on the Deck if that helps. Env for anyone on a Deck who wants to try (v2.0.11, `hookshot_env.txt`): ``` RX_VK_MESH_OPT=1 RX_VK_MIRROR=1 RX_VK_UB_SNAPSHOT=1 ``` <img width="1280" height="720" alt="flash_1339_b" src="https://github.com/user-attachments/assets/405df17f-def0-4c1e-b2f6-f0c969ce6ef3" />
addisonbair commented 2026-11-11 19:42:58 +00:00 (Migrated from github.com)

Follow-up to my Deck summary above: where the replay time goes, and one correction. Same harness: standing Kokiri scene, v2.0.14 unless noted.

Correction on #1375's readback wait: it is legitimate. I snapshotted the bytes the game reads before and after each wait. In ~92% of waits (5,300 measured) they change, by ~1.5 KB per wait, at offsets 5-7791 of the 14.7 KB block. So the GPU really rewrites it each frame. RX_VK_NO_READBACK_WAIT=1 makes the game read those results one frame stale, which v2.0.14 did implicitly and which showed no visible problem here. That makes it a trade-off for CPU-bound devices, not a bug fix.

The replay is serialized under sync_order_mu. I wrapped it to trace holders and waiters per frame:

  • P16 (RTX PRO 2000), RX_VK_PER_QUEUE_FENCES=0: the Presentation Thread holds it 21 ms/frame (the main queue's whole replay). A ModuleSystemWorker waits ~12.8 ms/frame for it in wait_queue_empty(), the readback catch-up. With per-queue fences on (the lighter sync_settle()), that wait disappears and fps goes from 31.1 to 35.1.
  • Deck: per-queue fences make no difference (18.9/19.4 vs 19.2/19.4). Here the mkw_vk order thread holds the lock ~12 ms/frame replaying event-stopped work while present waits ~11.6 ms. The held time adds up to ~45 ms of a ~53 ms frame, so the Deck's real per-frame replay work is ~45 ms, more than the replay time line's ~37.

Negative results, so nobody repeats them:

  • RX_VK_RECORDER=thread (main fc375e9 + RX_VK_NO_READBACK_WAIT=1): commands go from 8.4 to 5.0 ms and the replay is ~2 ms lighter, but fps is flat (20.8/20.9 vs 21.2/20.8).
  • By queue: one queue carries 85-87% of the replay (18.5 ms/frame on the P16), the next 10%. Replaying queues concurrently can't buy much.

Cross-frame repeat: keyed on the game's own inputs (program, textures, samplers, guest uniform-buffer address and size, storage bindings), draws repeat only 2.8% against the previous frame, but 79-80% against 2 frames back and 86-89% within 8. The game double-buffers its per-frame constants. A cache keyed on that could skip the handle → view resolution (~3 ms on the Deck); uniform copies and gpu_buffer_bind's side effects still have to run every frame.

What I'm working on next, each as its own PR with Deck numbers:

  1. A texture/sampler resolution cache keyed on 2-8 frames back.
  2. Program and pipeline lookup caching.
  3. The lock RADV's submit blocks on, using a symbolized Mesa main (which also measured queue submit 7.0 → 4.6 ms).

My estimate is ~8-15 ms together: mid-to-high 20s on the Deck, not a locked 30.

**Follow-up to my Deck summary above: where the replay time goes, and one correction.** Same harness: standing Kokiri scene, v2.0.14 unless noted. **Correction on #1375's readback wait: it is legitimate.** I snapshotted the bytes the game reads before and after each wait. In ~92% of waits (5,300 measured) they change, by ~1.5 KB per wait, at offsets 5-7791 of the 14.7 KB block. So the GPU really rewrites it each frame. `RX_VK_NO_READBACK_WAIT=1` makes the game read those results one frame stale, which v2.0.14 did implicitly and which showed no visible problem here. That makes it a trade-off for CPU-bound devices, not a bug fix. **The replay is serialized under `sync_order_mu`.** I wrapped it to trace holders and waiters per frame: - P16 (RTX PRO 2000), `RX_VK_PER_QUEUE_FENCES=0`: the Presentation Thread holds it 21 ms/frame (the main queue's whole replay). A `ModuleSystemWorker` waits **~12.8 ms/frame** for it in `wait_queue_empty()`, the readback catch-up. With per-queue fences on (the lighter `sync_settle()`), that wait disappears and fps goes from 31.1 to 35.1. - Deck: per-queue fences make no difference (18.9/19.4 vs 19.2/19.4). Here the mkw_vk order thread holds the lock ~12 ms/frame replaying event-stopped work while `present` waits ~11.6 ms. The held time adds up to ~45 ms of a ~53 ms frame, so the Deck's real per-frame replay work is ~45 ms, more than the `replay time` line's ~37. **Negative results**, so nobody repeats them: - `RX_VK_RECORDER=thread` (main fc375e9 + `RX_VK_NO_READBACK_WAIT=1`): commands go from 8.4 to 5.0 ms and the replay is ~2 ms lighter, but fps is flat (20.8/20.9 vs 21.2/20.8). - By queue: one queue carries **85-87%** of the replay (18.5 ms/frame on the P16), the next 10%. Replaying queues concurrently can't buy much. **Cross-frame repeat:** keyed on the game's own inputs (program, textures, samplers, guest uniform-buffer address and size, storage bindings), draws repeat only **2.8%** against the previous frame, but **79-80%** against 2 frames back and **86-89%** within 8. The game double-buffers its per-frame constants. A cache keyed on that could skip the handle → view resolution (~3 ms on the Deck); uniform copies and `gpu_buffer_bind`'s side effects still have to run every frame. **What I'm working on next, each as its own PR with Deck numbers:** 1. A texture/sampler resolution cache keyed on 2-8 frames back. 2. Program and pipeline lookup caching. 3. The lock RADV's submit blocks on, using a symbolized Mesa main (which also measured queue submit 7.0 → 4.6 ms). My estimate is ~8-15 ms together: mid-to-high 20s on the Deck, not a locked 30.
addisonbair commented 2026-11-11 21:15:38 +00:00 (Migrated from github.com)

Steam Deck: where I think the CPU ceiling is. This closes out my Deck series above, with the same harness throughout: standing Kokiri scene, deterministic headless runs, A/B alternated.

The frame is the total replay work, serialized. On the Deck the held time of sync_order_mu adds up to ~45 ms of a ~53 ms frame. In sync mode present() runs drain(0) under that lock, which replays submissions stopped at an event wait, and the order thread replays the rest. So the ~11 ms gap between the replay time line and the frame time is replay work that the line doesn't count, not idle waiting. Moving work between threads doesn't shrink it:

Tried on the Deck (v2.0.14 unless noted) fps
sync (default) 19.4-20.4
RX_VK_ASYNC=1 (core reserved) 15.5 / 16.3
RX_VK_ASYNC=1 HOS_RESERVE_CORE=0 16.0 / 17.2
RX_VK_RECORDER=thread (fc375e9 + RX_VK_NO_READBACK_WAIT=1) 20.8 / 20.9 vs 21.2 / 20.8
RX_VK_PARALLEL=2 / 3 19.2 / 18.9 vs 19.1

Async also brings the exposure stepping back: 90 brightness steps above 2 (largest 15.5) over 200 shots taken every 3 frames, against 0 in sync.

Reusing translated work across frames doesn't fit this game. Keyed on the game's own inputs (program, textures, samplers, guest uniform-buffer address and size, storage bindings), single draws repeat 79-89% within 2-8 frames. But whole replay segments (the work between pass starts, 177 a frame) repeat far less, measured on the P16:

Unit Replay time repeating whole within 2 / 4 / 8 frames
whole passes 11 / 12 / 48 %
32-draw chunks 12 / 14 / 51 %
8-draw chunks 16 / 21 / 59 %

The ~20% of draws that change each frame are spread evenly through the passes (0.8^8 ≈ 17% for an 8-draw chunk), so recording passes once and replaying them can skip only a small part. What's left is per-draw caching, and texture views are already cached (handle_hits).

Ceiling. The remaining levers I can measure are:

  • a build_descriptors rewrite (~1.5-5 ms);
  • newer RADV (submit 7.0 → 4.6 ms on Mesa main, plus a gang-preamble early-out that took it to ~3.0 ms; neither helps fps by itself here);
  • #2422 for current main;
  • small hot spots.

Together that's ~5-10 ms of the ~45, so ~22-25 fps on the Deck harness (real play somewhat higher, ~45+ shown with frame generation), not 30. A locked 30 on this CPU would need the per-draw memory bookkeeping (captures, write tracking, readback marking, uniform staging) redesigned around reuse. I don't see a safe path to that from these measurements. The full write-up with the prior-art comparison (Ryujinx, yuzu/Eden, DXVK, vkd3d-proton, RADV) is available if useful. I'm keeping the harness, so any candidate can be measured on the Deck in ~10 minutes.

**Steam Deck: where I think the CPU ceiling is.** This closes out my Deck series above, with the same harness throughout: standing Kokiri scene, deterministic headless runs, A/B alternated. **The frame is the total replay work, serialized.** On the Deck the held time of `sync_order_mu` adds up to ~45 ms of a ~53 ms frame. In sync mode `present()` runs `drain(0)` under that lock, which replays submissions stopped at an event wait, and the order thread replays the rest. So the ~11 ms gap between the `replay time` line and the frame time is replay work that the line doesn't count, not idle waiting. Moving work between threads doesn't shrink it: | Tried on the Deck (v2.0.14 unless noted) | fps | |---|---| | sync (default) | 19.4-20.4 | | `RX_VK_ASYNC=1` (core reserved) | 15.5 / 16.3 | | `RX_VK_ASYNC=1 HOS_RESERVE_CORE=0` | 16.0 / 17.2 | | `RX_VK_RECORDER=thread` (fc375e9 + `RX_VK_NO_READBACK_WAIT=1`) | 20.8 / 20.9 vs 21.2 / 20.8 | | `RX_VK_PARALLEL=2` / `3` | 19.2 / 18.9 vs 19.1 | Async also brings the exposure stepping back: 90 brightness steps above 2 (largest 15.5) over 200 shots taken every 3 frames, against 0 in sync. **Reusing translated work across frames doesn't fit this game.** Keyed on the game's own inputs (program, textures, samplers, guest uniform-buffer address and size, storage bindings), single draws repeat 79-89% within 2-8 frames. But whole replay segments (the work between pass starts, 177 a frame) repeat far less, measured on the P16: | Unit | Replay time repeating whole within 2 / 4 / 8 frames | |---|---| | whole passes | 11 / 12 / 48 % | | 32-draw chunks | 12 / 14 / 51 % | | 8-draw chunks | 16 / 21 / 59 % | The ~20% of draws that change each frame are spread evenly through the passes (0.8^8 ≈ 17% for an 8-draw chunk), so recording passes once and replaying them can skip only a small part. What's left is per-draw caching, and texture views are already cached (`handle_hits`). **Ceiling.** The remaining levers I can measure are: - a `build_descriptors` rewrite (~1.5-5 ms); - newer RADV (submit 7.0 → 4.6 ms on Mesa main, plus a gang-preamble early-out that took it to ~3.0 ms; neither helps fps by itself here); - #2422 for current main; - small hot spots. Together that's ~5-10 ms of the ~45, so **~22-25 fps** on the Deck harness (real play somewhat higher, ~45+ shown with frame generation), not 30. A locked 30 on this CPU would need the per-draw memory bookkeeping (captures, write tracking, readback marking, uniform staging) redesigned around reuse. I don't see a safe path to that from these measurements. The full write-up with the prior-art comparison (Ryujinx, yuzu/Eden, DXVK, vkd3d-proton, RADV) is available if useful. I'm keeping the harness, so any candidate can be measured on the Deck in ~10 minutes.
NotRexed commented 2026-11-11 21:21:54 +00:00 (Migrated from github.com)

More reports of this, collected here:

  • #1275: [Linux/AMD] GPU hang (ring timeout → MODE1 reset) on scene change, RX 6800 XT / RADV — buffer-marker logs atta (v2.0.11; 6X6800XT; R7 5700X3D, 64GB RAM, Arch Linux)
  • #1404: Don´t run in Vega 7 IGPU RADV (v2.0.5 - v2.0.11; Vega 7 (4gb UMA Bios Mod) • Driver Base (Kernel): amdgpu • Driver Open; Ryzen 5 5500u , 2x8gb 3200mhz cl20 , Mint Cinnamont 22.3 kernel 7.0.42)
  • #1580: Crash in game (v.2.0.11; GTX 1650; Ryzen 5 5600H, 16GB, Kubuntu 26.04.1 LTS)
  • #1634: Red lines (v2.0.12; 7900XTX, latest mesa/RADV drivers; 9800x3D; 96 GB of RAM. Fedora 45)
  • #2069: Using the Owl in Lake Hylia to take you to Hyrule Castle gate doesn't load textures properly (v2.0.14; 9070xt Graphics Driver: Mesa 26.1.2; 7800x3d, 64GB DDR5, SteamOS)
  • #2076: GRAPHICS ERRORS (2.0.14; Radeon Vega 7 (Radeon Graphics); Ryzen 5600GT Linux Fedora (Bazzite) 16 GB RAM)
  • #2158: Crashing after the firtscutscene (2.1.0; vega 7; Ryzen 5 5600GT, 16GB RAM, Linux CachyOS)
  • #2164: Linux Ram usage (v2.1.0-rc.3; 3060 ti; ryzen 5-5600 16gb linux mint)
  • #2214: Geometry Fix (v2.1.0; Operating System: SteamOS 3.9.5 Build: 20261023.100 KDE Plasma Version; Operating System: SteamOS 3.9.5 Build: 20261023.100 KDE Plasma Version)
  • #2235: [Linux/Nvidia] Black screen with sound (v2.1.0; RTX 4060 Laptop; 13th Gen Intel® Core™ i7-13620H)
  • #2239: Linux AMD (RADV): grass and small plants flicker in and out; pools over udmabuf's 64 MB limit are not imported (v2.1.0 (source e561602e); AMD Radeon RX 7800 XT, RADV NAVI32, Mesa 25.0.7; 32 GB RAM, Debian 13)
  • #2245: Linux AMD (RADV): VK_ERROR_DEVICE_LOST after the opening cutscene and before the Great Deku Tree appears (RX 6 (v2.1.0; AMD Radeon RX 6600 XT (8 GB VRAM) mesa:26.2.6; AMD Ryzen 7 7840HS ,32G,LINUX:AOSC OS) (pull request #2362, #2311)
  • #2319: Crash ln steam deck (v2.1.0; Steam deck LCD, with latest version of the system; Steam OS)
  • #2321: GPU hang (ring gfx timeout, reset fails) freezes the whole system on RX 6700 / RADV (OoT and MKW)
  • #2334: tests/run_all.py on a current Linux (Clang 23, only a .NET 10 SDK): three checks fail on main, and the crash f
  • #2351: Optimization for running on Steam Deck (v2.0.11; steam deck 1; steam deck 1)
  • #2404: Linux, Flatpak Steam (Gaming Mode): guest memory falls back to host-pointer imports because /sys/module is hid (Measured on v2.0.14 (source f2796384); now on v2.1.0 (source e561602e); AMD Ryzen Z1 Extreme (RADV PHOENIX), Mesa RADV, Vulkan 1.4, driver 0x6; ASUS ROG Ally X (Z1 Extreme), 24 GB (about 15.6 GB visible to Linux). ) (pull request #2431)
  • #2408: Game Crashing my GPU on the same spot - .Appimage (Linux) RX 6700 XT (v2.1.0; RX 6700 XT, MESA 26.2.6-arch3.1; Ryzen 5 5600, 16GB, CachyOS)
  • #2411: Linux: memfd guest-window discard crashes after the intro (main 49f75dc8 (v2.1.0-rc.3-53), built from source. The discard cod; RTX 4090, NVIDIA 590.48.01 (open kernel module); Ryzen 7 5700X3D, 125 GB, Arch Linux, kernel 6.19.8)
  • #2454: Poor performance on linux over windows version (2.1.0; AMD RX9060XT 16GB; RYZEN 5600X 32GB DDR5 BAZZITE OS (FEDORA))
More reports of this, collected here: - #1275: [Linux/AMD] GPU hang (ring timeout → MODE1 reset) on scene change, RX 6800 XT / RADV — buffer-marker logs atta (v2.0.11; 6X6800XT; R7 5700X3D, 64GB RAM, Arch Linux) - #1404: Don´t run in Vega 7 IGPU RADV (v2.0.5 - v2.0.11; Vega 7 (4gb UMA Bios Mod) • Driver Base (Kernel): amdgpu • Driver Open; Ryzen 5 5500u , 2x8gb 3200mhz cl20 , Mint Cinnamont 22.3 kernel 7.0.42) - #1580: Crash in game (v.2.0.11; GTX 1650; Ryzen 5 5600H, 16GB, Kubuntu 26.04.1 LTS) - #1634: Red lines (v2.0.12; 7900XTX, latest mesa/RADV drivers; 9800x3D; 96 GB of RAM. Fedora 45) - #2069: Using the Owl in Lake Hylia to take you to Hyrule Castle gate doesn't load textures properly (v2.0.14; 9070xt Graphics Driver: Mesa 26.1.2; 7800x3d, 64GB DDR5, SteamOS) - #2076: GRAPHICS ERRORS (2.0.14; Radeon Vega 7 (Radeon Graphics); Ryzen 5600GT Linux Fedora (Bazzite) 16 GB RAM) - #2158: Crashing after the firtscutscene (2.1.0; vega 7; Ryzen 5 5600GT, 16GB RAM, Linux CachyOS) - #2164: Linux Ram usage (v2.1.0-rc.3; 3060 ti; ryzen 5-5600 16gb linux mint) - #2214: Geometry Fix (v2.1.0; Operating System: SteamOS 3.9.5 Build: 20261023.100 KDE Plasma Version; Operating System: SteamOS 3.9.5 Build: 20261023.100 KDE Plasma Version) - #2235: [Linux/Nvidia] Black screen with sound (v2.1.0; RTX 4060 Laptop; 13th Gen Intel® Core™ i7-13620H) - #2239: Linux AMD (RADV): grass and small plants flicker in and out; pools over udmabuf's 64 MB limit are not imported (v2.1.0 (source e561602e); AMD Radeon RX 7800 XT, RADV NAVI32, Mesa 25.0.7; 32 GB RAM, Debian 13) - #2245: Linux AMD (RADV): VK_ERROR_DEVICE_LOST after the opening cutscene and before the Great Deku Tree appears (RX 6 (v2.1.0; AMD Radeon RX 6600 XT (8 GB VRAM) mesa:26.2.6; AMD Ryzen 7 7840HS ,32G,LINUX:AOSC OS) (pull request #2362, #2311) - #2319: Crash ln steam deck (v2.1.0; Steam deck LCD, with latest version of the system; Steam OS) - #2321: GPU hang (ring gfx timeout, reset fails) freezes the whole system on RX 6700 / RADV (OoT and MKW) - #2334: tests/run_all.py on a current Linux (Clang 23, only a .NET 10 SDK): three checks fail on main, and the crash f - #2351: Optimization for running on Steam Deck (v2.0.11; steam deck 1; steam deck 1) - #2404: Linux, Flatpak Steam (Gaming Mode): guest memory falls back to host-pointer imports because /sys/module is hid (Measured on v2.0.14 (source f2796384); now on v2.1.0 (source e561602e); AMD Ryzen Z1 Extreme (RADV PHOENIX), Mesa RADV, Vulkan 1.4, driver 0x6; ASUS ROG Ally X (Z1 Extreme), 24 GB (about 15.6 GB visible to Linux). ) (pull request #2431) - #2408: Game Crashing my GPU on the same spot - .Appimage (Linux) RX 6700 XT (v2.1.0; RX 6700 XT, MESA 26.2.6-arch3.1; Ryzen 5 5600, 16GB, CachyOS) - #2411: Linux: memfd guest-window discard crashes after the intro (main `49f75dc8` (`v2.1.0-rc.3-53`), built from source. The discard cod; RTX 4090, NVIDIA 590.48.01 (open kernel module); Ryzen 7 5700X3D, 125 GB, Arch Linux, kernel 6.19.8) - #2454: Poor performance on linux over windows version (2.1.0; AMD RX9060XT 16GB; RYZEN 5600X 32GB DDR5 BAZZITE OS (FEDORA))
MarcTheFennec commented 2026-11-11 22:10:10 +00:00 (Migrated from github.com)

Hey, I've been testing v2.1.0 (e561602e) on a Ryzen 5 5600GT (RADV Renoir iGPU, 16 GB shared RAM on Bazzite Linux) and managed to track down why AMD GPUs are getting VK_ERROR_DEVICE_LOST right after the intro cutscene, plus a config that fixes both the crash and the missing grass/leaves without needing to rebuild caches (there was also a graphical error from my previous report, which is now fixed in v2.1.0).

Why it crashes by default (hookshot_log.1.txt & hookshot_log.2.txt)

On a 16 GB shared-memory APU, Hookshot automatically sets the VRAM limit to 5411–5543 MB. When the intro cinematic ends and Kokiri Forest loads (around frame 970–1276), the game tries to upload ~450 MB in a single frame—including a massive 12288x12288 shadow texture (288 MB) and two 1365x1365x90 ASTC texture arrays (213 MB each).

As soon as it hits ~500 textures (1691 MB), the log starts spamming texture slot ... no image for it across dozens of slots, the submit hangs for 1577–2243 ms (also logging a capture's wait for write-back 8639 timed out on a fresh shader cache in hookshot_log.2.txt), and amdgpu resets the context (batched submit 1013 failed (-4)).

I ran it with RX_VK_CHECKPOINTS=1 (hookshot_log.1.txt) and the buffer markers caught the exact moment it dies—it's not hanging on the lighting shader, it's dying mid-upload right around program 5fbaa372e5b10593:

[hos Presentation Thread] vk: slow submit: 2243.7 ms: draw 2137.3 descriptors 2132.7 texture lookups 2131.3 uploads 449.1 programs 1.8 commands 2.6
...
radv/amdgpu: The CS has been cancelled because the context is lost. This context is innocent.
[hos Presentation Thread] vk: batched submit 1013 failed (-4)
[hos Presentation Thread] vk: device lost: 27190 markers set, 24037 reached; the last whose earlier work all finished: 24049
[hos Presentation Thread] vk:   finished before: marker 24048 (draw of program d67637b392936cf4, frame 970)
[hos Presentation Thread] vk:   RUNNING after: marker 24049 (upload of texture 0000001168f9d000, frame 970)
[hos Presentation Thread] vk:   running: marker 24050 .. 24052 (upload of textures 0x1168eaf000, 0x1168f7b000, 0x1169069000)
[hos Presentation Thread] vk:   running: marker 24053 .. 24054 (draw of program 5fbaa372e5b10593, frame 970)
[hos Presentation Thread] vk:   running: marker 24055 .. 24057 (upload of textures 0x1169443000, 0x1169355000, 0x1169421000)

How I fixed the crash + missing foliage (hookshot_log.3.txt & hookshot_log.txt

I was able to get past the intro and play for 4,500+ frames without a single crash using this hookshot_env.txt:

RX_VK_VRAM_MB=3584
RX_VK_TEX_MAX_MB=2048
RX_VK_TEX_MAX_DIM=2048
RX_VK_MIRROR_MB=512
RX_VK_PER_QUEUE_FENCES=0

One really important detail I noticed while tweaking the RAM/VRAM values:

  • When I first capped RX_VK_VRAM_MB=3072 (hookshot_log.3.txt), the crash stopped completely (4,575+ frames at ~21–24 fps), but grass, leaves, and some meshes were invisible. Looking at the log, those 3 huge textures alone eat up 714 MB, so a 3072 MB budget was constantly evicting 70–115 textures per frame and starving the compute mesh fallback buffers.
  • Bumping RX_VK_VRAM_MB=3584 (in my latest run, hookshot_log.txt) gave it just enough breathing room (~3165 MB used) so the storage buffers (prog 3a131272834635ab ssbo 0 and program da7a7ab28b8e73d9) could stay bound. With 3584 MB, all the grass, leaves, and meshes render properly (scaling up to 4,012 draws at frame 4320) and the game survives even a 4920 ms scene-load spike without resetting the AMD driver.
Hey, I've been testing `v2.1.0` (`e561602e`) on a Ryzen 5 5600GT (RADV Renoir iGPU, 16 GB shared RAM on Bazzite Linux) and managed to track down why AMD GPUs are getting `VK_ERROR_DEVICE_LOST` right after the intro cutscene, plus a config that fixes both the crash and the missing grass/leaves without needing to rebuild caches (there was also a graphical error from my previous report, which is now fixed in `v2.1.0`). ### Why it crashes by default ([hookshot_log.1.txt](https://github.com/user-attachments/files/34714456/hookshot_log.1.txt) & [hookshot_log.2.txt](https://github.com/user-attachments/files/34714655/hookshot_log.2.txt)) On a 16 GB shared-memory APU, Hookshot automatically sets the VRAM limit to `5411–5543 MB`. When the intro cinematic ends and Kokiri Forest loads (around frame 970–1276), the game tries to upload ~450 MB in a single frame—including a massive `12288x12288` shadow texture (288 MB) and two `1365x1365x90` ASTC texture arrays (213 MB each). As soon as it hits ~500 textures (`1691 MB`), the log starts spamming `texture slot ... no image for it` across dozens of slots, the submit hangs for `1577–2243 ms` (also logging `a capture's wait for write-back 8639 timed out` on a fresh shader cache in [hookshot_log.2.txt](https://github.com/user-attachments/files/34714655/hookshot_log.2.txt)), and `amdgpu` resets the context (`batched submit 1013 failed (-4)`). I ran it with `RX_VK_CHECKPOINTS=1` ([hookshot_log.1.txt](https://github.com/user-attachments/files/34714456/hookshot_log.1.txt)) and the buffer markers caught the exact moment it dies—it's not hanging on the lighting shader, it's dying mid-upload right around program `5fbaa372e5b10593`: ```text [hos Presentation Thread] vk: slow submit: 2243.7 ms: draw 2137.3 descriptors 2132.7 texture lookups 2131.3 uploads 449.1 programs 1.8 commands 2.6 ... radv/amdgpu: The CS has been cancelled because the context is lost. This context is innocent. [hos Presentation Thread] vk: batched submit 1013 failed (-4) [hos Presentation Thread] vk: device lost: 27190 markers set, 24037 reached; the last whose earlier work all finished: 24049 [hos Presentation Thread] vk: finished before: marker 24048 (draw of program d67637b392936cf4, frame 970) [hos Presentation Thread] vk: RUNNING after: marker 24049 (upload of texture 0000001168f9d000, frame 970) [hos Presentation Thread] vk: running: marker 24050 .. 24052 (upload of textures 0x1168eaf000, 0x1168f7b000, 0x1169069000) [hos Presentation Thread] vk: running: marker 24053 .. 24054 (draw of program 5fbaa372e5b10593, frame 970) [hos Presentation Thread] vk: running: marker 24055 .. 24057 (upload of textures 0x1169443000, 0x1169355000, 0x1169421000) ``` ### How I fixed the crash + missing foliage ([hookshot_log.3.txt](https://github.com/user-attachments/files/34714656/hookshot_log.3.txt) & [hookshot_log.txt](https://github.com/user-attachments/files/34716153/hookshot_log.txt) I was able to get past the intro and play for 4,500+ frames without a single crash using this `hookshot_env.txt`: ```ini RX_VK_VRAM_MB=3584 RX_VK_TEX_MAX_MB=2048 RX_VK_TEX_MAX_DIM=2048 RX_VK_MIRROR_MB=512 RX_VK_PER_QUEUE_FENCES=0 ``` One really important detail I noticed while tweaking the RAM/VRAM values: * When I first capped `RX_VK_VRAM_MB=3072` ([hookshot_log.3.txt](https://github.com/user-attachments/files/34714656/hookshot_log.3.txt)), the crash stopped completely (4,575+ frames at ~21–24 fps), **but grass, leaves, and some meshes were invisible**. Looking at the log, those 3 huge textures alone eat up `714 MB`, so a 3072 MB budget was constantly evicting 70–115 textures per frame and starving the compute mesh fallback buffers. * Bumping `RX_VK_VRAM_MB=3584` (in my latest run, [hookshot_log.txt](https://github.com/user-attachments/files/34716153/hookshot_log.txt)) gave it just enough breathing room (`~3165 MB` used) so the storage buffers (`prog 3a131272834635ab ssbo 0` and `program da7a7ab28b8e73d9`) could stay bound. With 3584 MB, all the grass, leaves, and meshes render properly (scaling up to 4,012 draws at frame 4320) and the game survives even a `4920 ms` scene-load spike without resetting the AMD driver.
gabriochsky commented 2026-11-11 22:37:22 +00:00 (Migrated from github.com)

Additional Steam Deck OLED testing – Hookshot v2.1.0 / AMD RADV / Compute mesh shaders

I'd like to share the results of another round of testing on my Steam Deck OLED, this time using the new Mesh Shaders: Compute option available in Hookshot v2.1.0.

Hardware and software configuration

  • Device: Steam Deck OLED (Galileo)
  • APU: AMD Custom GPU 0932 (Van Gogh)
  • Memory: 16 GB unified/shared memory
  • OS: SteamOS, build 20261023.100
  • Kernel: 7.2.7-valve2-2-neptune-72-g31504582a073
  • Graphics driver: Mesa RADV, 26.2.0-devel (git-5c65d4fc31)
  • Vulkan: 1.4.350
  • Hookshot: v2.1.0
  • Game version: Ocarina of Time update v131072

Test configuration

  • Mesh Shaders: Compute
  • Output resolution: 1920×1080
  • In-game upscaler: 67%
  • Frame Generation: x2
  • RX_VK_VRAM_MB=1200

I switched to Compute through Hookshot's settings rather than relying on the previous experimental mesh shader workarounds.

Visual results

This configuration produced a noticeable improvement:

  • Shader flickering in Kokiri Forest was no longer present.
  • Vegetation was visible in Hyrule Field, whereas previous configurations had missing geometry.
  • I was able to load my save and explore the areas without the previous visual corruption.

This is the first configuration in my recent testing that gave me this combination of improved geometry and reduced visual artifacts.

Performance and crash

Performance was still inconsistent, however.

  • Kokiri Forest was playable, with some slowdowns.
  • Hyrule Field showed lower FPS and occasional significant drops.
  • Performance eventually dropped to approximately 8 FPS as I approached Hyrule Castle.
  • The game then closed unexpectedly.

The last Hookshot log showed the following statistics:

  • Approximately 17.8 FPS over the last 5 seconds.
  • GPU frame time: 30.2 ms.
  • 1,693 draws and 197 dispatches per frame.
  • 939 textures, accounting for approximately 2,025 MB.

Important finding: system memory exhaustion (OOM)

I checked the SteamOS kernel logs immediately after the crash.

At 17:29:02, the kernel reported:

BaseProcExecuto invoked oom-killer

The subsequent stack trace included out_of_memory() and __alloc_pages_slowpath().

This indicates that Linux triggered its Out-Of-Memory Killer because a memory allocation could not be satisfied.

Importantly, I did not find a new AMDGPU ring timeout or GPU reset in the corresponding five-minute kernel log window. This suggests that this particular crash may be related to system memory pressure rather than the GPU reset issues observed in previous tests.

I have not yet identified which process was ultimately killed, so I cannot confirm that Hookshot itself was the OOM victim.

Possible connection with texture uploads

I also came across another user's report mentioning a very large texture uploading, involving a 12,288×12,288 shadow texture and large ASTC texture arrays.

I wonder whether this could be related to the memory pressure observed on my device, although I have not independently confirmed that these specific textures are responsible for my crash.

Summary

On my Steam Deck OLED, switching to Compute mesh shaders appears to resolve or significantly improve the previous visual problems:

  • No more noticeable flickering in Kokiri Forest.
  • Vegetation correctly rendered in Hyrule Field.
  • Save loading and exploration are possible.

However, performance still degrades considerably in more demanding areas, eventually leading to an OOM event and game closure.

I hope these results are useful. I will wait for further improvements before running more experimental configurations, but I wanted to share these findings because Compute seems to be a meaningful improvement on this hardware.

### Additional Steam Deck OLED testing – Hookshot v2.1.0 / AMD RADV / Compute mesh shaders I'd like to share the results of another round of testing on my Steam Deck OLED, this time using the new **Mesh Shaders: Compute** option available in Hookshot v2.1.0. #### Hardware and software configuration - **Device:** Steam Deck OLED (Galileo) - **APU:** AMD Custom GPU 0932 (Van Gogh) - **Memory:** 16 GB unified/shared memory - **OS:** SteamOS, build `20261023.100` - **Kernel:** `7.2.7-valve2-2-neptune-72-g31504582a073` - **Graphics driver:** Mesa RADV, `26.2.0-devel` (`git-5c65d4fc31`) - **Vulkan:** 1.4.350 - **Hookshot:** v2.1.0 - **Game version:** Ocarina of Time update v131072 #### Test configuration - Mesh Shaders: **Compute** - Output resolution: 1920×1080 - In-game upscaler: 67% - Frame Generation: x2 - `RX_VK_VRAM_MB=1200` I switched to Compute through Hookshot's settings rather than relying on the previous experimental mesh shader workarounds. #### Visual results This configuration produced a noticeable improvement: - Shader flickering in Kokiri Forest was no longer present. - Vegetation was visible in Hyrule Field, whereas previous configurations had missing geometry. - I was able to load my save and explore the areas without the previous visual corruption. This is the first configuration in my recent testing that gave me this combination of improved geometry and reduced visual artifacts. #### Performance and crash Performance was still inconsistent, however. - Kokiri Forest was playable, with some slowdowns. - Hyrule Field showed lower FPS and occasional significant drops. - Performance eventually dropped to approximately **8 FPS** as I approached Hyrule Castle. - The game then closed unexpectedly. The last Hookshot log showed the following statistics: - Approximately 17.8 FPS over the last 5 seconds. - GPU frame time: 30.2 ms. - 1,693 draws and 197 dispatches per frame. - 939 textures, accounting for approximately 2,025 MB. #### Important finding: system memory exhaustion (OOM) I checked the SteamOS kernel logs immediately after the crash. At `17:29:02`, the kernel reported: `BaseProcExecuto invoked oom-killer` The subsequent stack trace included `out_of_memory()` and `__alloc_pages_slowpath()`. This indicates that Linux triggered its Out-Of-Memory Killer because a memory allocation could not be satisfied. Importantly, I did not find a new AMDGPU ring timeout or GPU reset in the corresponding five-minute kernel log window. This suggests that this particular crash may be related to system memory pressure rather than the GPU reset issues observed in previous tests. I have not yet identified which process was ultimately killed, so I cannot confirm that Hookshot itself was the OOM victim. #### Possible connection with texture uploads I also came across another user's report mentioning a very large texture uploading, involving a 12,288×12,288 shadow texture and large ASTC texture arrays. I wonder whether this could be related to the memory pressure observed on my device, although I have not independently confirmed that these specific textures are responsible for my crash. #### Summary On my Steam Deck OLED, switching to Compute mesh shaders appears to resolve or significantly improve the previous visual problems: - No more noticeable flickering in Kokiri Forest. - Vegetation correctly rendered in Hyrule Field. - Save loading and exploration are possible. However, performance still degrades considerably in more demanding areas, eventually leading to an OOM event and game closure. I hope these results are useful. I will wait for further improvements before running more experimental configurations, but I wanted to share these findings because Compute seems to be a meaningful improvement on this hardware.
LucianoMSS commented 2026-11-11 23:24:03 +00:00 (Migrated from github.com)

Steam Deck (RADV VANGOGH): @addisonbair's env worked here — playable through Kokiri / sword & shield, no crashes

Setup: Steam Deck, stock SteamOS, Hookshot v2.1.0 (e561602e), RADV VANGOGH. Native mesh (no NO_MESH / no forced mesh fallback).

hookshot_env.txt (from addisonbair's measured Deck config), plus RADV_PERFTEST=cswave32 from the launcher:

HOS_HANDHELD=1
RX_VK_MESH_OPT=1
RX_VK_PER_QUEUE_FENCES=0
RX_VK_WAIT_GPU=0
RX_VK_BATCH_MAX=4
RX_VK_CHECKPOINTS=1

In-game: Handheld on, AMD FSR 3.1 upscaler. In-game Frame generation left Off.

Frame generation: I used lsfg-vk (2×) instead of Hookshot's built-in FG. For me that felt better — smoother presentation without stacking two FG paths, and the base game fps stayed honest in the log.

Session: played from the start through getting the sword and shield. No GPU hang / no VK_ERROR_DEVICE_LOST / no crash in that stretch.

Base fps from hookshot_log.txt (game presents, before lsfg-vk multiply):

Typical / median ~20 fps
Busy views (high draw counts) ~17–20 fps
Lighter / simpler scenes up to 30 fps
GPU-bound wait ~0.3–0.4 ms (CPU / replay-bound on Deck)

So this matches Addison's ballpark (~20–24 base). With lsfg-vk 2× the motion feels closer to the mid/high 40s on screen, while the log still reports ~20 base in Kokiri-heavy areas.

Happy to retest builds that touch the mesh path or the replay CPU side — this Deck is in a good place for that with this env.

**Steam Deck (RADV VANGOGH): @addisonbair's env worked here — playable through Kokiri / sword & shield, no crashes** Setup: Steam Deck, stock SteamOS, Hookshot **v2.1.0** (`e561602e`), RADV VANGOGH. Native mesh (no `NO_MESH` / no forced mesh fallback). `hookshot_env.txt` (from [addisonbair's measured Deck config](https://git.magicbean.dev/MagicBeanDev/Hookshot/issues/1000)), plus `RADV_PERFTEST=cswave32` from the launcher: ``` HOS_HANDHELD=1 RX_VK_MESH_OPT=1 RX_VK_PER_QUEUE_FENCES=0 RX_VK_WAIT_GPU=0 RX_VK_BATCH_MAX=4 RX_VK_CHECKPOINTS=1 ``` In-game: Handheld on, AMD FSR 3.1 upscaler. **In-game Frame generation left Off.** **Frame generation:** I used **lsfg-vk** (2×) instead of Hookshot's built-in FG. For me that felt better — smoother presentation without stacking two FG paths, and the base game fps stayed honest in the log. **Session:** played from the start through getting the **sword and shield**. **No GPU hang / no `VK_ERROR_DEVICE_LOST` / no crash** in that stretch. **Base fps from `hookshot_log.txt`** (game presents, before lsfg-vk multiply): | | | |---|---| | Typical / median | ~20 fps | | Busy views (high draw counts) | ~17–20 fps | | Lighter / simpler scenes | up to **30 fps** | | GPU-bound wait | ~0.3–0.4 ms (CPU / replay-bound on Deck) | So this matches Addison's ballpark (~20–24 base). With lsfg-vk 2× the motion feels closer to the mid/high 40s on screen, while the log still reports ~20 base in Kokiri-heavy areas. Happy to retest builds that touch the mesh path or the replay CPU side — this Deck is in a good place for that with this env.
MarcTheFennec commented 2026-11-11 23:48:15 +00:00 (Migrated from github.com)

Follow-up: Mid-game save loading, BC3 compute hang, and GTT/System Heap exhaustion on 16 GB APUs

After playing further into the game (past the Great Deku Tree, Hyrule Field, Market, and up to Hyrule Castle), I ran into a few more specific bottlenecks on a 16 GB shared-memory AMD APU (Ryzen 5 5600GT / RADV Renoir on Bazzite, ~13.8 GB system RAM available to Linux) that might help explain why 16 GB APUs/handhelds crash later in the game:

1. Loading a mid-game save crashes on the GPU BC3 re-encode shader (submit failed (-4))

When loading a save file after the Deku Tree, both 1365x1365x90 ASTC terrain arrays (0x10a0eda600 and 0x10a4752c00, 56.5 MB upload each) + ~78 CPU textures are submitted in the same frame:

[hos Presentation Thread] vk: a frame's uploads took 704 ms: ASTC on the GPU 2 (112.9 MB, 369 ms); on the CPU 78 (42.6 MB, 335 ms); [1365x1365 x90 NVN 0x80 ASTC on the GPU 56.5 MB 358 ms] [260x260 x1 NVN 0x25 on the CPU 0.4 MB 322 ms] [1365x1365 x90 NVN 0x8e ASTC on the GPU 56.5 MB 11 ms]
radv/amdgpu: The CS has been cancelled because the context is lost. This context is innocent.
[hos sead::MainThread] vk: submit 15543 failed (-4)
  • Even with RX_VK_BATCH=0 and RX_VK_PER_QUEUE_FENCES=0, keeping all large ASTC textures kept as BC3 consistently resets amdgpu on save load when both 90-layer arrays are decoded and re-encoded to BC3 on the GPU in the same frame.
  • Setting RX_VK_ASTC_RGBA8=1 (along with RX_VK_BATCH=0) completely stops the GPU reset on save load and boosts performance to 30–37 fps.

2. RX_VK_ASTC_RGBA8=1 balloons the 1365x1365x90 arrays to 852 MB each (Not enough memory for command submission)

With RX_VK_ASTC_RGBA8=1 at default dimensions, 0x10a0eda600 and 0x10a4752c00 jump from 213 MB (BC3) to 852 MB each (1,704 MB total). During a zone transition around frame 3647 (when dma-buf pool imports reach 82 imports / ~2.2 GB + 4.6 GB in textures), radv/amdgpu hits the kernel GTT limit:

[hos Presentation Thread] vk: texture 0x10a0eda600 1365x1365x1 x90 levels 11 NVN 0x8e -> vk 37 (ASTC decoded) (956 textures, 3464 MB)
[hos Presentation Thread] vk: texture 0x10a4752c00 1365x1365x1 x90 levels 11 NVN 0x80 -> vk 37 (ASTC decoded) (957 textures, 4516 MB)
radv/amdgpu: Not enough memory for command submission.
[hos Presentation Thread] vk: submit 25590 failed (-4)

3. Capping RX_VK_TEX_MAX_DIM=1024 fixes VRAM, but system heap + dma-buf imports hit the ceiling at Hyrule Castle

To keep RX_VK_ASTC_RGBA8=1 without blowing past the GTT allowance, I used:

RX_VK_ASTC_RGBA8=1
RX_VK_VRAM_MB=1792
RX_VK_TEX_MAX_MB=1024
RX_VK_TEX_MAX_DIM=1024
RX_VK_MIRROR_MB=256
RX_VK_PER_QUEUE_FENCES=0
RX_VK_BATCH=0
RX_VK_PLAY_CACHE=0
  • This drops the two 1365x1365x90 arrays to 682x682x90 (212 MB each, leaving 1 top mip level out), keeping active texture VRAM around 1.9–2.2 GB and allowing smooth 30–38 fps gameplay across Kokiri Forest, Hyrule Field, and Market for 5,180+ frames.
  • However, upon reaching Hyrule Castle (around frame 4905–5183), dma-buf pool imports spike up to 96 imports (42 live (2080 MB)) and system heap hits 2432 of 2501 MB (while also running 120,000+ DrawMeshTasksIndirect via the compute fallback path and waiting on 199 of 3000 GPU write-backs), which eventually exhausts host/shared memory and closes the process without a Vulkan error.
### Follow-up: Mid-game save loading, BC3 compute hang, and GTT/System Heap exhaustion on 16 GB APUs After playing further into the game (past the Great Deku Tree, Hyrule Field, Market, and up to Hyrule Castle), I ran into a few more specific bottlenecks on a 16 GB shared-memory AMD APU (Ryzen 5 5600GT / RADV Renoir on Bazzite, ~13.8 GB system RAM available to Linux) that might help explain why 16 GB APUs/handhelds crash later in the game: #### 1. Loading a mid-game save crashes on the GPU BC3 re-encode shader (`submit failed (-4)`) When loading a save file after the Deku Tree, both `1365x1365x90` ASTC terrain arrays (`0x10a0eda600` and `0x10a4752c00`, 56.5 MB upload each) + ~78 CPU textures are submitted in the same frame: ```text [hos Presentation Thread] vk: a frame's uploads took 704 ms: ASTC on the GPU 2 (112.9 MB, 369 ms); on the CPU 78 (42.6 MB, 335 ms); [1365x1365 x90 NVN 0x80 ASTC on the GPU 56.5 MB 358 ms] [260x260 x1 NVN 0x25 on the CPU 0.4 MB 322 ms] [1365x1365 x90 NVN 0x8e ASTC on the GPU 56.5 MB 11 ms] radv/amdgpu: The CS has been cancelled because the context is lost. This context is innocent. [hos sead::MainThread] vk: submit 15543 failed (-4) ``` * Even with `RX_VK_BATCH=0` and `RX_VK_PER_QUEUE_FENCES=0`, keeping `all large ASTC textures kept as BC3` consistently resets `amdgpu` on save load when both 90-layer arrays are decoded and re-encoded to BC3 on the GPU in the same frame. * Setting **`RX_VK_ASTC_RGBA8=1`** (along with `RX_VK_BATCH=0`) completely stops the GPU reset on save load and boosts performance to **30–37 fps**. #### 2. `RX_VK_ASTC_RGBA8=1` balloons the `1365x1365x90` arrays to `852 MB` each (`Not enough memory for command submission`) With `RX_VK_ASTC_RGBA8=1` at default dimensions, `0x10a0eda600` and `0x10a4752c00` jump from `213 MB` (BC3) to **`852 MB` each (`1,704 MB` total)**. During a zone transition around frame 3647 (when `dma-buf` pool imports reach `82 imports` / `~2.2 GB` + `4.6 GB` in textures), `radv/amdgpu` hits the kernel GTT limit: ```text [hos Presentation Thread] vk: texture 0x10a0eda600 1365x1365x1 x90 levels 11 NVN 0x8e -> vk 37 (ASTC decoded) (956 textures, 3464 MB) [hos Presentation Thread] vk: texture 0x10a4752c00 1365x1365x1 x90 levels 11 NVN 0x80 -> vk 37 (ASTC decoded) (957 textures, 4516 MB) radv/amdgpu: Not enough memory for command submission. [hos Presentation Thread] vk: submit 25590 failed (-4) ``` #### 3. Capping `RX_VK_TEX_MAX_DIM=1024` fixes VRAM, but `system heap` + `dma-buf` imports hit the ceiling at Hyrule Castle To keep `RX_VK_ASTC_RGBA8=1` without blowing past the GTT allowance, I used: ```ini RX_VK_ASTC_RGBA8=1 RX_VK_VRAM_MB=1792 RX_VK_TEX_MAX_MB=1024 RX_VK_TEX_MAX_DIM=1024 RX_VK_MIRROR_MB=256 RX_VK_PER_QUEUE_FENCES=0 RX_VK_BATCH=0 RX_VK_PLAY_CACHE=0 ``` * This drops the two `1365x1365x90` arrays to `682x682x90` (`212 MB` each, leaving 1 top mip level out), keeping active texture VRAM around `1.9–2.2 GB` and allowing smooth **30–38 fps** gameplay across Kokiri Forest, Hyrule Field, and Market for **5,180+ frames**. * However, upon reaching **Hyrule Castle** (around frame 4905–5183), `dma-buf` pool imports spike up to `96 imports` (`42 live (2080 MB)`) and `system heap` hits `2432 of 2501 MB` (while also running `120,000+` `DrawMeshTasksIndirect` via the compute fallback path and waiting on `199 of 3000` GPU write-backs), which eventually exhausts host/shared memory and closes the process without a Vulkan error.
tinerb commented 2026-11-11 23:53:40 +00:00 (Migrated from github.com)

[Steam Deck OLED / RADV] Sacred Grove GPU timeout on v2.1.0 — RX_VK_NO_MESH=1 allows scene to load

Summary

I am running Hookshot v2.1.0 on a Steam Deck OLED with SteamOS and the AMD RADV VANGOGH Vulkan driver.

I have successfully progressed through the Great Deku Tree, Kakariko Village, and Death Mountain using several environment settings to improve stability.

However, entering Sacred Grove from Lost Woods consistently causes a GPU crash with normal mesh rendering enabled.

Important finding: Lowering graphics settings to Minimum does not prevent the crash, but enabling RX_VK_NO_MESH=1 allows Sacred Grove to load successfully.

This suggests the crash is associated with the mesh/task rendering path rather than simply the overall graphics quality or resolution.

Steps to reproduce

  1. Launch Hookshot v2.1.0 on Steam Deck OLED using the environment configuration below.

  2. Load a save near Lost Woods.

  3. Proceed into Sacred Grove.

  4. During the scene transition, the game freezes or crashes.

  5. Sometimes the Sacred Grove cutscene starts before crashing; other times the screen remains black.

  6. The kernel reports an AMDGPU graphics-ring timeout and GPU reset.

Environment configuration

These settings allowed me to progress substantially further than my earlier configurations:

HOS_HANDHELD=1
RX_VK_MESH_OPT=1
RX_VK_PER_QUEUE_FENCES=0
RX_VK_WAIT_GPU=0
RX_VK_BATCH_MAX=4
RADV_PERFTEST=cswave32
RX_VK_CHECKPOINTS=1

The last setting was added for GPU crash diagnostics.

Workarounds tested

Configuration | Result -- | -- Above configuration with normal graphics settings | Successfully progressed through multiple areas, but crashes entering Sacred Grove Minimum (4GB) graphics preset, 50% resolution, frame generation disabled | Still crashes entering Sacred Grove Above environment configuration plus RX_VK_NO_MESH=1 | Sacred Grove successfully loads Earlier targeted RX_VK_MESH_NOCULL=2c56dc1006942f74 testing | Setting was confirmed active in logs, but did not eliminate all GPU crashes

I understand that RX_VK_NO_MESH=1 can produce missing geometry, making it unsuitable as a permanent solution. However, it is a useful diagnostic workaround.

Crash log and GPU checkpoints

With RX_VK_CHECKPOINTS=1 enabled, the crash produced the following:

radv/amdgpu: The CS has been cancelled because the context is lost.
This context is guilty of a hard recovery.

vk: batched submit 1808 failed (-4)
vk: device lost: reading the buffer markers

vk: device lost: 163724 markers set, 61135 reached
the last whose earlier work all finished: 160963

finished before: marker 160961
(upload of texture 00000010cb1c2c00, frame 1714)

finished before: marker 160962
(upload of texture 00000010cb1d9800, frame 1714)

RUNNING after: marker 160963
(upload of texture 00000010cb1ce200, frame 1714)

running: marker 160964
(draw of program 8c62d1705ea73694, frame 1714)

running: marker 160965
(draw of program 8c62d1705ea73694, frame 1714)

vk: FATAL: the GPU device was lost (VK_ERROR_DEVICE_LOST)

The kernel reported:

amdgpu: ring gfx_0.0.0 timeout,
signaled seq=1832945, emitted seq=1832946

Process hookshot pid 24021 thread Presentation Th pid 24036

Starting gfx_0.0.0 ring reset
Ring gfx_0.0.0 reset failed
GPU reset begin!
MODE2 reset
GPU reset succeeded, trying to resume
GPU reset(14) succeeded!

Other observations

Immediately before the crash, the log included:

  • A 12288x12288 render target (288 MB).

  • Approximately 2.1 GB of active texture allocations.

  • Multiple ASTC texture uploads.

  • A slow submit of 741.7 ms, including 706.8 ms in texture lookups.

  • Several draws using program 8c62d1705ea73694 remaining outstanding after the last completed GPU checkpoint.

I cannot determine whether the outstanding texture upload or subsequent draw operations caused the timeout.

I also attempted to inspect the AMDGPU device coredump reported by the kernel, but /sys/class/drm/card0/device/devcoredump/ was not available when checked.

Related issues

  • #817 — Steam Deck RADV GPU hangs involving mesh/task shaders.

  • #1318 — Steam Deck device loss during a transition involving a 12288 render target.

  • #1000 — Linux/Steam Deck GPU hang tracking issue.

Questions for developers

  1. Does the fact that RX_VK_NO_MESH=1 allows Sacred Grove to load indicate another mesh/task shader hang, potentially distinct from the previously identified Great Deku Tree issue?

  2. Can the outstanding draw program 8c62d1705ea73694 be mapped to its underlying shader code to identify a targeted workaround?

  3. Are there additional supported diagnostic settings or targeted fixes I can test without disabling mesh rendering globally?

I can reproduce this issue using my Sacred Grove save and can provide additional checkpoint logs or run specific tests if useful.

Thank you for the work on Steam Deck compatibility!

hookshot_log.txt

hookshot_log.1.txt

<h2><span>[Steam Deck OLED / RADV] Sacred Grove GPU timeout on v2.1.0 — RX_VK_NO_MESH=1 allows scene to load</span></h2><h3><span>Summary</span></h3><p><span>I am running Hookshot v2.1.0 on a Steam Deck OLED with SteamOS and the AMD RADV VANGOGH Vulkan driver.</span></p><p><span>I have successfully progressed through the Great Deku Tree, Kakariko Village, and Death Mountain using several environment settings to improve stability.</span></p><p><span>However, entering </span><strong><span>Sacred Grove from Lost Woods</span></strong><span> consistently causes a GPU crash with normal mesh rendering enabled.</span></p><p><strong><span>Important finding: Lowering graphics settings to Minimum does not prevent the crash, but enabling </span></strong><code><strong><span>RX_VK_NO_MESH=1</span></strong></code><strong><span> allows Sacred Grove to load successfully.</span></strong></p><p><span>This suggests the crash is associated with the mesh/task rendering path rather than simply the overall graphics quality or resolution.</span></p><h3><span>Steps to reproduce</span></h3><ol start="1"><li><p><span>Launch Hookshot v2.1.0 on Steam Deck OLED using the environment configuration below.</span></p></li><li><p><span>Load a save near Lost Woods.</span></p></li><li><p><span>Proceed into Sacred Grove.</span></p></li><li><p><span>During the scene transition, the game freezes or crashes.</span></p></li><li><p><span>Sometimes the Sacred Grove cutscene starts before crashing; other times the screen remains black.</span></p></li><li><p><span>The kernel reports an AMDGPU graphics-ring timeout and GPU reset.</span></p></li></ol><h3><span>Environment configuration</span></h3><p><span>These settings allowed me to progress substantially further than my earlier configurations:</span></p><pre><code><span>HOS_HANDHELD=1 RX_VK_MESH_OPT=1 RX_VK_PER_QUEUE_FENCES=0 RX_VK_WAIT_GPU=0 RX_VK_BATCH_MAX=4 RADV_PERFTEST=cswave32 RX_VK_CHECKPOINTS=1</span></code></pre><p><span>The last setting was added for GPU crash diagnostics.</span></p><h3><span>Workarounds tested</span></h3> Configuration | Result -- | -- Above configuration with normal graphics settings | Successfully progressed through multiple areas, but crashes entering Sacred Grove Minimum (4GB) graphics preset, 50% resolution, frame generation disabled | Still crashes entering Sacred Grove Above environment configuration plus RX_VK_NO_MESH=1 | Sacred Grove successfully loads Earlier targeted RX_VK_MESH_NOCULL=2c56dc1006942f74 testing | Setting was confirmed active in logs, but did not eliminate all GPU crashes <p><span>I understand that </span><code><span>RX_VK_NO_MESH=1</span></code><span> can produce missing geometry, making it unsuitable as a permanent solution. However, it is a useful diagnostic workaround.</span></p><h3><span>Crash log and GPU checkpoints</span></h3><p><span>With </span><code><span>RX_VK_CHECKPOINTS=1</span></code><span> enabled, the crash produced the following:</span></p><pre><code><span>radv/amdgpu: The CS has been cancelled because the context is lost. This context is guilty of a hard recovery. vk: batched submit 1808 failed (-4) vk: device lost: reading the buffer markers vk: device lost: 163724 markers set, 61135 reached the last whose earlier work all finished: 160963 finished before: marker 160961 (upload of texture 00000010cb1c2c00, frame 1714) finished before: marker 160962 (upload of texture 00000010cb1d9800, frame 1714) RUNNING after: marker 160963 (upload of texture 00000010cb1ce200, frame 1714) running: marker 160964 (draw of program 8c62d1705ea73694, frame 1714) running: marker 160965 (draw of program 8c62d1705ea73694, frame 1714) vk: FATAL: the GPU device was lost (VK_ERROR_DEVICE_LOST)</span></code></pre><p><span>The kernel reported:</span></p><pre><code><span>amdgpu: ring gfx_0.0.0 timeout, signaled seq=1832945, emitted seq=1832946 Process hookshot pid 24021 thread Presentation Th pid 24036 Starting gfx_0.0.0 ring reset Ring gfx_0.0.0 reset failed GPU reset begin! MODE2 reset GPU reset succeeded, trying to resume GPU reset(14) succeeded!</span></code></pre><h3><span>Other observations</span></h3><p><span>Immediately before the crash, the log included:</span></p><ul><li><p><span>A </span><code><span>12288x12288</span></code><span> render target (288 MB).</span></p></li><li><p><span>Approximately 2.1 GB of active texture allocations.</span></p></li><li><p><span>Multiple ASTC texture uploads.</span></p></li><li><p><span>A slow submit of 741.7 ms, including 706.8 ms in texture lookups.</span></p></li><li><p><span>Several draws using program </span><code><span>8c62d1705ea73694</span></code><span> remaining outstanding after the last completed GPU checkpoint.</span></p></li></ul><p><span>I cannot determine whether the outstanding texture upload or subsequent draw operations caused the timeout.</span></p><p><span>I also attempted to inspect the AMDGPU device coredump reported by the kernel, but </span><code><span>/sys/class/drm/card0/device/devcoredump/</span></code><span> was not available when checked.</span></p><h3><span>Related issues</span></h3><ul><li><p><span>#817 — Steam Deck RADV GPU hangs involving mesh/task shaders.</span></p></li><li><p><span>#1318 — Steam Deck device loss during a transition involving a 12288 render target.</span></p></li><li><p><span>#1000 — Linux/Steam Deck GPU hang tracking issue.</span></p></li></ul><h3><span>Questions for developers</span></h3><ol start="1"><li><p><span>Does the fact that </span><code><span>RX_VK_NO_MESH=1</span></code><span> allows Sacred Grove to load indicate another mesh/task shader hang, potentially distinct from the previously identified Great Deku Tree issue?</span></p></li><li><p><span>Can the outstanding draw program </span><code><span>8c62d1705ea73694</span></code><span> be mapped to its underlying shader code to identify a targeted workaround?</span></p></li><li><p><span>Are there additional supported diagnostic settings or targeted fixes I can test without disabling mesh rendering globally?</span></p></li></ol><p><span>I can reproduce this issue using my Sacred Grove save and can provide additional checkpoint logs or run specific tests if useful.</span></p><p><span>Thank you for the work on Steam Deck compatibility!</span></p> [hookshot_log.txt](https://github.com/user-attachments/files/34720541/hookshot_log.txt) [hookshot_log.1.txt](https://github.com/user-attachments/files/34720543/hookshot_log.1.txt)
TuxArchi commented 2026-11-12 00:38:29 +00:00 (Migrated from github.com)

Another Linux/RADV datapoint, matching #2245's fingerprint exactly, plus the
workaround confirmed on the card.

  • GPU: RX 6650 XT (RADV NAVI23), Mesa 26.2.6-1, kernel 7.2.14-arch1-1,
    Hyprland 0.57.2 / Wayland. Hookshot v2.1.0 (e561602e).
  • It is not a long-session or VRAM bug: with the stock config
    (mesh_shaders=0 → native task/mesh) it dies as soon as the world/map loads;
    the in-game menu and the loading screens are fine.
  • Kernel order at the hang: ring comp_1.3.0 timeout (ring reset succeeded)
    → ring gfx_0.0.0 timeout → Ring gfx_0.0.0 reset failed →
    GPU reset begin!. Source: 1 → VRAM is lost due to GPU reset! →
    GPU reset(2) succeeded!.
  • Same line right before the reset as #2245:
    storage buffer NOT bound (reads zeros): program da7a7ab28b8e73d9 stage 1 c5+0 addr 0x4180000000000200 size 0x20
    plus a capture's wait for write-back 6035 timed out (done 6031) and
    slow submit: 257.5 ms: memory sync 257.4.
  • Workaround: mesh_shaders=2 (Compute), one line in hookshot_options.ini.
    Then: 49,584 frames, 57–60 fps, 0 ring timeouts, and it uses more VRAM
    than the crashing run (5.4 GB used, 3069 MB of textures vs 1283 MB used in the
    crashing one). Cost: longer first start (task/mesh re-prepared as compute) and
    some fps.
  • Side effect worth knowing: the MODE1 reset takes the whole Wayland session
    down — Hyprland aborts in Render::GL::CHyprOpenGLImpl::begin right after the
    VRAM loss, so users see the desktop go away, not just the game.

Full report with logs and dmesg: #2590

Another Linux/RADV datapoint, matching #2245's fingerprint exactly, plus the workaround confirmed on the card. - GPU: RX 6650 XT (RADV NAVI23), Mesa 26.2.6-1, kernel 7.2.14-arch1-1, Hyprland 0.57.2 / Wayland. Hookshot v2.1.0 (`e561602e`). - It is **not** a long-session or VRAM bug: with the stock config (`mesh_shaders=0` → native task/mesh) it dies as soon as the world/map loads; the in-game menu and the loading screens are fine. - Kernel order at the hang: `ring comp_1.3.0 timeout` (ring reset **succeeded**) → `ring gfx_0.0.0 timeout` → `Ring gfx_0.0.0 reset failed` → `GPU reset begin!. Source: 1` → `VRAM is lost due to GPU reset!` → `GPU reset(2) succeeded!`. - Same line right before the reset as #2245: `storage buffer NOT bound (reads zeros): program da7a7ab28b8e73d9 stage 1 c5+0 addr 0x4180000000000200 size 0x20` plus `a capture's wait for write-back 6035 timed out (done 6031)` and `slow submit: 257.5 ms: memory sync 257.4`. - Workaround: `mesh_shaders=2` (Compute), one line in `hookshot_options.ini`. Then: 49,584 frames, 57–60 fps, **0** ring timeouts, and it uses *more* VRAM than the crashing run (5.4 GB used, 3069 MB of textures vs 1283 MB used in the crashing one). Cost: longer first start (task/mesh re-prepared as compute) and some fps. - Side effect worth knowing: the MODE1 reset takes the whole Wayland session down — Hyprland aborts in `Render::GL::CHyprOpenGLImpl::begin` right after the VRAM loss, so users see the desktop go away, not just the game. Full report with logs and dmesg: https://git.magicbean.dev/MagicBeanDev/Hookshot/issues/2590
Martilin555 commented 2026-11-12 00:38:53 +00:00 (Migrated from github.com)

Is there a way to decrease even more the resolution of the game? Like 540p or else? Sorry if I bother in here, but I wanna know if there is any command on Hookshot_env.txt or something to decrease it

Is there a way to decrease even more the resolution of the game? Like 540p or else? Sorry if I bother in here, but I wanna know if there is any command on Hookshot_env.txt or something to decrease it
DarKneSsRequiem commented 2026-11-12 01:09:26 +00:00 (Migrated from github.com)

Tried the README workaround (RX_VK_MESH_NOCULL=2c56dc1006942f74 in hookshot_env.txt) — it didn't help.

The env file is picked up: the log shows "task code 2c56dc1006942f74: culling off, every meshlet drawn (RX_VK_MESH_NOCULL)" x8 and shaders were recompiled. But the hang is identical: ~3 min fine at 60 fps through intro/menu, then on New Game the first mesh draws appear, heavy texture uploads, fps drops to ~20 and the GPU hangs.

journalctl -k:
02:42:51 ring gfx_0.0.0 timeout, signaled seq=89387, emitted seq=89390 — hookshot thread mkw_vk (without workaround)
03:01:29 ring gfx_0.0.0 timeout, signaled seq=170715, emitted seq=170719 — hookshot thread Presentation Th (with workaround)
Ring gfx_0.0.0 reset failed
03:01:41 ring comp_1.0.1 timeout

Without the workaround the run ended with VK_ERROR_DEVICE_LOST (radv: "The CS has been cancelled because the context is lost. This context is innocent.").

Steam Deck OLED, SteamOS kernel 7.2.7-valve2 (neptune-72), RADV VANGOGH, hookshot v2.1.0 (e561602e).

Is there a way to force the mesh fallback path instead of native mesh shaders to test?

Logs attached.

kernel_crash.txt
hookshot_log_with_workaround.txt

Tried the README workaround (RX_VK_MESH_NOCULL=2c56dc1006942f74 in hookshot_env.txt) — it didn't help. The env file is picked up: the log shows "task code 2c56dc1006942f74: culling off, every meshlet drawn (RX_VK_MESH_NOCULL)" x8 and shaders were recompiled. But the hang is identical: ~3 min fine at 60 fps through intro/menu, then on New Game the first mesh draws appear, heavy texture uploads, fps drops to ~20 and the GPU hangs. journalctl -k: 02:42:51 ring gfx_0.0.0 timeout, signaled seq=89387, emitted seq=89390 — hookshot thread mkw_vk (without workaround) 03:01:29 ring gfx_0.0.0 timeout, signaled seq=170715, emitted seq=170719 — hookshot thread Presentation Th (with workaround) Ring gfx_0.0.0 reset failed 03:01:41 ring comp_1.0.1 timeout Without the workaround the run ended with VK_ERROR_DEVICE_LOST (radv: "The CS has been cancelled because the context is lost. This context is innocent."). Steam Deck OLED, SteamOS kernel 7.2.7-valve2 (neptune-72), RADV VANGOGH, hookshot v2.1.0 (e561602e). Is there a way to force the mesh fallback path instead of native mesh shaders to test? Logs attached. [kernel_crash.txt](https://github.com/user-attachments/files/34721965/kernel_crash.txt) [hookshot_log_with_workaround.txt](https://github.com/user-attachments/files/34721966/hookshot_log_with_workaround.txt)
NotRexed commented 2026-11-12 03:07:14 +00:00 (Migrated from github.com)

More reports of this, collected here:

  • #2521: Crash after intro (v2.1.0; AMD Custom GPU 0405; AMD Custom APU 0405)
  • #2535: Hookshot Linux performance diagnosis: NVIDIA GeForce RTX 3060 / v2.1.0
  • #2590: Linux AMD RADV (RX 6650 XT, Mesa 26.2.6): GPU reset as soon as the world loads — comp_1.3.0 → gfx_0.0.0 timeou (v2.1.0 (source e561602e), Linux AppImage; ; )
More reports of this, collected here: - #2521: Crash after intro (v2.1.0; AMD Custom GPU 0405; AMD Custom APU 0405) - #2535: Hookshot Linux performance diagnosis: NVIDIA GeForce RTX 3060 / v2.1.0 - #2590: Linux AMD RADV (RX 6650 XT, Mesa 26.2.6): GPU reset as soon as the world loads — comp_1.3.0 → gfx_0.0.0 timeou (v2.1.0 (source e561602e), Linux AppImage; ```; ```)
Owner

@addisonbair commented on GitHub · 2026-11-12 06:10 UTC · original

Steam Deck performance: where the frame goes, what helps today, and what didn't

We measured every change on a Steam Deck LCD in one deterministic scene: headless, standing in Kokiri Forest next to Saria (~2,400 draws), GPU fixed at 1200 MHz, same save, alternating A/B runs.

fps GPU ms
v2.0.14 (settings below) 19.4-20.9 28.2
main eaef1460, default switches 13.5 / 13.8 30.0
main + #2422 14.3 / 14.4 29.9

v2.0.14 is still the fastest Hookshot on the Deck, by 30-40 %. Per-thread perf traces of main show where it goes:

  • The game's main thread looks twice as busy (~35 vs ~16 ms of CPU a frame), but most of that is spinning. The job system sleep-polls (sched_yield) for workers that sit in readback waits. On main those are ~1 a frame of 10-14 ms each, on the newest submission; on v2.0.14 they're ~6 a frame of ~0.6 ms.
  • The prime suspect is #1133 (direct-path write-back pages). It applies to every GPU without a VRAM mirror, so every iGPU, and its own thread reports ~9 ms a frame of readback waits on an 8060S. Not confirmed on a Deck yet. Running main with RX_VK_DIRECT_WB_PAGES=0 would show it, but watch for #1126's foliage glow in motion.
  • #2125's readback catch-up is a small part (~+1.8 fps with it off). The 16x Anisotropic default costs ~1.4 ms of GPU and no fps.

The Deck's own ceiling: even on v2.0.14 the frame is ~37 ms of replay that runs in order under the order lock (on a P16 stand-in it's held 93-98 % of the time). Little of the frame is idle handoff. These were all measured and didn't help on the Deck:

  • async replay (slower, plus exposure flicker);
  • parallel replay;
  • the recorder thread;
  • per-queue fences;
  • batch sizes;
  • mirrors;
  • DCC (broke lighting);
  • thread pinning;
  • a cross-frame descriptor-set cache (replay slower);
  • deferring the present (flat).

Faster single-thread CPUs are what move this.

What works on the Deck today (v2.0.14):

  • RX_VK_MESH_OPT=1 RX_VK_PER_QUEUE_FENCES=0 RX_VK_WAIT_GPU=0 RX_VK_BATCH_MAX=4 RADV_PERFTEST=cswave32 in hookshot_env.txt.
  • Upscaler FSR 3.1, Render resolution Performance, Frame generation 2x.
  • Manual GPU clock 1200 MHz, and 48 Hz with a 48 fps limit.

That's ~24 fps base in villages. Hyrule Field is CPU-bound (~10 fps): there, a lower GPU clock (800-1000 MHz) leaves more of the 15 W for the CPU.

On v2.1.0 / main:

  • Upscaler: the game's own. AMD's game upscaler is now a cheap bilinear stand-in, and FSR 3.1 costs 4-8 ms more GPU on the Deck (why #2110 is closed).
  • Keep RX_VK_BATCH_IDLE at its default; set alone it lengthens readback waits. #2422 pairs it with a fix.

The full numbers, the benchmark setup, and a v2.0.14-based branch with the merged Deck fix (#1965) are at https://github.com/addisonbair/Hookshot/blob/deck/docs/steam-deck.md. We're stepping back from Deck tuning for now; #2422 stays open.

🤖 Generated with Claude Code

> [@addisonbair](https://github.com/addisonbair) commented on GitHub · 2026-11-12 06:10 UTC · [original](https://github.com/NotRexed/Hookshot/issues/1000#issuecomment-6816166095) **Steam Deck performance: where the frame goes, what helps today, and what didn't** We measured every change on a Steam Deck LCD in one deterministic scene: headless, standing in Kokiri Forest next to Saria (~2,400 draws), GPU fixed at 1200 MHz, same save, alternating A/B runs. | | fps | GPU ms | |---|---|---| | v2.0.14 (settings below) | 19.4-20.9 | 28.2 | | main eaef1460, default switches | 13.5 / 13.8 | 30.0 | | main + #2422 | 14.3 / 14.4 | 29.9 | **v2.0.14 is still the fastest Hookshot on the Deck, by 30-40 %.** Per-thread perf traces of main show where it goes: - **The game's main thread looks twice as busy (~35 vs ~16 ms of CPU a frame), but most of that is spinning.** The job system sleep-polls (`sched_yield`) for workers that sit in readback waits. On main those are ~1 a frame of 10-14 ms each, on the newest submission; on v2.0.14 they're ~6 a frame of ~0.6 ms. - **The prime suspect is #1133** (direct-path write-back pages). It applies to every GPU without a VRAM mirror, so every iGPU, and its own thread reports ~9 ms a frame of readback waits on an 8060S. Not confirmed on a Deck yet. Running main with `RX_VK_DIRECT_WB_PAGES=0` would show it, but watch for #1126's foliage glow in motion. - #2125's readback catch-up is a small part (~+1.8 fps with it off). The 16x Anisotropic default costs ~1.4 ms of GPU and no fps. **The Deck's own ceiling:** even on v2.0.14 the frame is ~37 ms of replay that runs in order under the order lock (on a P16 stand-in it's held 93-98 % of the time). Little of the frame is idle handoff. These were all measured and didn't help on the Deck: - async replay (slower, plus exposure flicker); - parallel replay; - the recorder thread; - per-queue fences; - batch sizes; - mirrors; - DCC (broke lighting); - thread pinning; - a cross-frame descriptor-set cache (replay slower); - deferring the present (flat). Faster single-thread CPUs are what move this. **What works on the Deck today (v2.0.14):** - `RX_VK_MESH_OPT=1 RX_VK_PER_QUEUE_FENCES=0 RX_VK_WAIT_GPU=0 RX_VK_BATCH_MAX=4 RADV_PERFTEST=cswave32` in `hookshot_env.txt`. - Upscaler FSR 3.1, Render resolution Performance, Frame generation 2x. - Manual GPU clock 1200 MHz, and 48 Hz with a 48 fps limit. That's ~24 fps base in villages. Hyrule Field is CPU-bound (~10 fps): there, a *lower* GPU clock (800-1000 MHz) leaves more of the 15 W for the CPU. **On v2.1.0 / main:** - **Upscaler: the game's own.** AMD's game upscaler is now a cheap bilinear stand-in, and FSR 3.1 costs 4-8 ms more GPU on the Deck (why #2110 is closed). - Keep `RX_VK_BATCH_IDLE` at its default; set alone it lengthens readback waits. #2422 pairs it with a fix. The full numbers, the benchmark setup, and a v2.0.14-based branch with the merged Deck fix (#1965) are at https://github.com/addisonbair/Hookshot/blob/deck/docs/steam-deck.md. We're stepping back from Deck tuning for now; #2422 stays open. 🤖 Generated with [Claude Code](https://claude.com/claude-code) <!-- github-sync:c:6816166095 -->
Owner

@naxil commented on GitHub · 2026-11-12 06:55 UTC · original

amvlk here (amd 5600G + amd 6600 8gb), solve all the problem, but it rebuild the shaders (instead radv, load the shaders immediatly)

> [@naxil](https://github.com/naxil) commented on GitHub · 2026-11-12 06:55 UTC · [original](https://github.com/NotRexed/Hookshot/issues/1000#issuecomment-6816975514) amvlk here (amd 5600G + amd 6600 8gb), solve all the problem, but it rebuild the shaders (instead radv, load the shaders immediatly) <!-- github-sync:c:6816975514 -->
Owner

@kuraeow commented on GitHub · 2026-11-12 13:27 UTC · original

hookshot_gpu.txt
hookshot_log.txt

I'm experiencing GPU hangs on my Steam Deck OLED with Hookshot v2.1.0 (source e561602e), running SteamOS.

Even before the intro cutscene, the title screen has noticeable performance issues. FPS drops significantly during the close-up shot of the grass, and the frame rate is generally quite uneven. The frametime graph shows regular, periodic spikes, almost as if some part of the original game's 60 Hz timing or synchronization is still interfering with frame pacing. That's just a guess based on the graph, though.

The intro cutscene itself runs at around 60 FPS, but the frame pacing isn't consistently smooth. Right at the transition into gameplay, FPS drops to ~1, then slowly recovers to ~8 FPS while the screen remains black. On my latest attempt, I briefly saw the first second of gameplay before the GPU hung and the game eventually exited.

VRAM allocation shown by the Steam Deck overlay reached approximately 5.5–5.6 GB.

I tried the following settings in hookshot_env.txt:

RX_VK_MESH_NOCULL=2c56dc1006942f74
RX_VK_CHECKPOINTS=1

The shaders were rebuilt (over 67,000 compilation operations), but the issue persists.

The kernel log confirms an AMDGPU hang:

ring gfx_0.0.0 timeout
Process hookshot pid 8957 thread Presentation Th
Ring gfx_0.0.0 reset failed
GPU reset begin!
MODE2 reset
GPU reset succeeded

On one attempt, the entire Steam Deck became unresponsive and required a forced reboot. On the latest attempt, SteamOS remained responsive and the game exited after the GPU reset.

I've attached hookshot_log.txt and hookshot_gpu.txt.

Let me know if any additional diagnostics would help!

> [@kuraeow](https://github.com/kuraeow) commented on GitHub · 2026-11-12 13:27 UTC · [original](https://github.com/NotRexed/Hookshot/issues/1000#issuecomment-6824910076) [hookshot_gpu.txt](https://github.com/user-attachments/files/34750083/hookshot_gpu.txt) [hookshot_log.txt](https://github.com/user-attachments/files/34750084/hookshot_log.txt) I'm experiencing GPU hangs on my Steam Deck OLED with Hookshot v2.1.0 (source `e561602e`), running SteamOS. Even before the intro cutscene, the title screen has noticeable performance issues. FPS drops significantly during the close-up shot of the grass, and the frame rate is generally quite uneven. The frametime graph shows regular, periodic spikes, almost as if some part of the original game's 60 Hz timing or synchronization is still interfering with frame pacing. That's just a guess based on the graph, though. The intro cutscene itself runs at around 60 FPS, but the frame pacing isn't consistently smooth. Right at the transition into gameplay, FPS drops to ~1, then slowly recovers to ~8 FPS while the screen remains black. On my latest attempt, I briefly saw the first second of gameplay before the GPU hung and the game eventually exited. VRAM allocation shown by the Steam Deck overlay reached approximately 5.5–5.6 GB. I tried the following settings in `hookshot_env.txt`: ```ini RX_VK_MESH_NOCULL=2c56dc1006942f74 RX_VK_CHECKPOINTS=1 ``` The shaders were rebuilt (over 67,000 compilation operations), but the issue persists. The kernel log confirms an AMDGPU hang: ```text ring gfx_0.0.0 timeout Process hookshot pid 8957 thread Presentation Th Ring gfx_0.0.0 reset failed GPU reset begin! MODE2 reset GPU reset succeeded ``` On one attempt, the entire Steam Deck became unresponsive and required a forced reboot. On the latest attempt, SteamOS remained responsive and the game exited after the GPU reset. I've attached `hookshot_log.txt` and `hookshot_gpu.txt`. Let me know if any additional diagnostics would help! <!-- github-sync:c:6824910076 -->
Owner

@camilobt commented on GitHub · 2026-11-12 14:06 UTC · original

Steam Deck LCD, v2.1.0: GPU only ~56% busy because of readback waits (#1375); RX_VK_NO_READBACK_WAIT=1 gives +16%. Also: why RX_VK_ASYNC=1 freezes at boot, with a patch

Hardware / build

  • Steam Deck LCD, SteamOS 3.8.28, kernel 6.18 (valve), RADV VANGOGH, driver 0x6801063, GPU 1600 MHz, 15 W cap
  • Hookshot v2.1.0 AppImage (source e561602e), built on the Deck from my own .nup (v131072)

Method

  • Headless runs (HOS_HEADLESS=1), HOS_HANDHELD=1, HOS_OUTPUT_RES=1280x800, RX_VK_MESH_OPT=1, RX_VK_PRECOMPILE=0
  • Save loaded by an input script; Kokiri Forest, open view outside Link's house (Saria's dialogue after leaving the house). Link does not move.
  • FPS = mean of the last 18 vi: ... fps over the last 5.0 s lines (90 s), after ~170 s of warm-up. Run-to-run spread of the baseline: 21.62-21.88 fps (5 runs).

1. Configuration and hangs (loading the save into Kokiri)

Config Result
default gfx_0.0.0 timeout, GPU reset while loading
RX_VK_MESH_NOCULL=2c56dc1006942f74 (the 2.1.0 workaround) gfx_0.0.0 timeout, GPU reset while loading
RX_VK_TASK_MESH_FALLBACK=1 standing: OK, 21.6 fps; walking: GPU reset after a few minutes
RX_VK_MESH_OPT=1 no hang (standing, walking inside the house, ~15 min outside in Kokiri)
RX_VK_MESH_NOCULL + RX_VK_MESH_OPT=1 no hang, slightly slower than MESH_OPT alone

So on this Deck, NOCULL alone does not avoid the hang in 2.1.0; MESH_OPT does.

2. CPU and GPU take turns

Render resolution (menu row, resolution= in hookshot_options.ini) against frame time:

resolution GPU time / frame fps frame time
33% 19.7 ms 23.9 41.8 ms
Auto (3D scale 0.75) 25.0 ms 21.8 45.9 ms
100% 37.0 ms 15.5 64.7 ms

Frame time is about GPU time + ~21 ms in every case: the GPU and the CPU work one after the other. gpu_busy_percent (amdgpu sysfs, 300 samples at 10 Hz) agrees: 55.7% busy at Auto, about half the samples near 100% and the rest near 0.

An all-thread sample (HOS_SAMPLE_ALL, scripts/crit.py) shows the CPU is not saturated either: on average fewer than 2 game threads run at once, sead::MainThread is blocked ~86% of the time (job waits in f_8007fe60 / the 20 µs SleepThread poll at lr 0x8009a478, ~58k calls/s, and event waits), and the Presentation Thread waits in queue_get ~39% of the time.

3. RX_VK_NO_READBACK_WAIT=1: +16%

fps (runs) GPU busy
default (MESH_OPT) 21.62 / 21.81 / 21.88 55.7%
RX_VK_NO_READBACK_WAIT=1 25.33 / 25.12 / 25.37 66.9%

No GPU hang. RX_VK_FLASH=1 with RX_VK_SHOT_EVERY=1 over ~3 minutes of frames: no flash in either configuration. Screenshots at the same presents look the same: grass, fog and lighting. I only tested this one scene, so the CPU reads that the readback waits protect (#1375) may still matter elsewhere. Maybe the waits could be limited to the reads that need them, instead of waiting for every submission that wrote the page.

4. Things that did not change fps here (each ±0.1-0.2 of the baseline)

  • HOS_RESERVE_CORE=0, HOS_VCORES=0, HOS_CORES=8, HOS_POLL_SLEEP_NS=5000, HOS_PRESENT_POLL=1, HOS_PRESENT_NOWAIT=1, RX_VK_BATCH_IDLE=0, HOS_SPIN_US=0
  • HOS_PIN=Presentation=c0, the Presentation Thread on the reserved core, which on Linux sits idle without async because replay_pin_mask() is Windows-only: replay submit went from 30.7 to 26.7 ms, but fps stayed the same (21.7). The replay is not the frame's limit here.
  • Rebuilding hookshot_vk.so with -O3 (21.9) or -mtls-dialect=gnu2 (21.8). ThinLTO (-flto=thin) gave 22.2 alone, and nothing on top of NO_READBACK_WAIT (25.37).
  • HOS_GRAPHICS_SCALE=0.5 and HOS_RES_SCALE=0.5 did not change the 3D scale (GPU time unchanged).

5. RX_VK_ASYNC=1 freezes at boot on Linux/RADV: cause and patch

With RX_VK_ASYNC=1 the game stops after ~19 submits: no present, every thread idle. All-thread sample: sead::MainThread is in n_nvnSyncWait → mkwvk::wait() → vkWaitSemaphores with no timeout. The value it waits for belongs to work the replay thread has stopped at an event wait (submission 11..14 stopped at command buffer 0's wait for event ...), for the event the game signals after this wait. Or it is recorded but held in the batch (RX_VK_BATCH, on with RADV), which nothing flushes while the game waits. The 3 ms hold/drain in wait() is skipped by !async_on().

  • RX_VK_ASYNC=1 RX_VK_BATCH=0: boots and plays, but at 11 fps, because unbatched submits cost ~15 ms a frame here.
  • The patch below (~25 lines, gpu/vk/vk_replay.cpp): in wait() with async on, it bumps drain_waiters and notifies q_cv so that the replay thread runs its stopped work (drain 2, as wait_queue_empty does), and it waits in 2 ms steps, flushing the batch between them. With it, ASYNC + batching boots and plays with no freeze.
  • Async is still slower on this Deck, though: 11 fps against 21.8 sync, with ~27k forced waits in 4 min. OoT waits for the GPU several times a frame, and each wait now crosses threads. So the patch only fixes the freeze; it does not make async a win here.

I can run more A/B tests on this Deck if useful (same scene, same script).

The patch (gpu/vk/vk_replay.cpp, v2.1.0)
--- a/gpu/vk/vk_replay.cpp
+++ b/gpu/vk/vk_replay.cpp
@@ -2134,6 +2134,7 @@
     auto it = q_last.find(queue);
     return it != q_last.end() ? it->second : fence();
 }
+void async_wait_nudge(int d);   // (RX_VK_ASYNC: a waiter asks the replay thread for its stopped work, below)
 int wait(uint64_t f, uint64_t timeout_ns) {
     if (completed() >= f) return 1;
     queue_flush_for(FR_WAIT);
@@ -2181,7 +2182,26 @@
     wi.pSemaphores = &timeline;
     wi.pValues = &f;
     queue_flush_for(FR_WAIT);
-    const VkResult res = vkWaitSemaphores(dev.device, &wi, timeout_ns);
+    VkResult res;
+    if (async_on() && timeout_ns) {
+        // (camilo-deck) RX_VK_ASYNC: the work this waits for can be stopped at an event wait on the replay thread (the event
+        // the game signals after this wait), or recorded but held in the batch (RX_VK_BATCH) that nothing flushes while the
+        // game waits: the game froze at its first frames. The replay thread lets its stopped work on (drain 2, as for
+        // wait_queue_empty) and the held batch goes out every 2 ms until the value is reached
+        async_wait_nudge(1);
+        const auto t0 = std::chrono::steady_clock::now();
+        for (;;) {
+            const uint64_t waited = (uint64_t)std::chrono::duration_cast<std::chrono::nanoseconds>(
+                std::chrono::steady_clock::now() - t0).count();
+            const uint64_t left = waited >= timeout_ns ? 0 : timeout_ns - waited;
+            res = vkWaitSemaphores(dev.device, &wi, std::min<uint64_t>(left, 2000000));
+            if (res != VK_TIMEOUT || left <= 2000000) break;
+            queue_flush_for(FR_WAIT);
+        }
+        async_wait_nudge(-1);
+    } else {
+        res = vkWaitSemaphores(dev.device, &wi, timeout_ns);
+    }
     static int logged;
     if (res != VK_SUCCESS && timeout_ns > 1000000000ull && logged++ < 8)
         logf("vk: wait for fence %llu (done %llu, pushed %llu): %d", (unsigned long long)f,
@@ -3840,6 +3860,11 @@
 };
 std::mutex q_mu;
 std::condition_variable q_cv, q_space, q_idle;
+void async_wait_nudge(int d) {   // (camilo-deck: wait's, RX_VK_ASYNC)
+    std::lock_guard lk(q_mu);
+    drain_waiters += d;
+    if (d > 0) q_cv.notify_all();
+}
 std::deque<Job> q_jobs;
 int q_presents = 0;
 bool q_busy = false;
> [@camilobt](https://github.com/camilobt) commented on GitHub · 2026-11-12 14:06 UTC · [original](https://github.com/NotRexed/Hookshot/issues/1000#issuecomment-6825821270) ### Steam Deck LCD, v2.1.0: GPU only ~56% busy because of readback waits (#1375); `RX_VK_NO_READBACK_WAIT=1` gives +16%. Also: why `RX_VK_ASYNC=1` freezes at boot, with a patch **Hardware / build** - Steam Deck LCD, SteamOS 3.8.28, kernel 6.18 (valve), RADV VANGOGH, driver `0x6801063`, GPU 1600 MHz, 15 W cap - Hookshot v2.1.0 AppImage (source `e561602e`), built on the Deck from my own `.nup` (v131072) **Method** - Headless runs (`HOS_HEADLESS=1`), `HOS_HANDHELD=1`, `HOS_OUTPUT_RES=1280x800`, `RX_VK_MESH_OPT=1`, `RX_VK_PRECOMPILE=0` - Save loaded by an input script; Kokiri Forest, open view outside Link's house (Saria's dialogue after leaving the house). Link does not move. - FPS = mean of the last 18 `vi: ... fps over the last 5.0 s` lines (90 s), after ~170 s of warm-up. Run-to-run spread of the baseline: 21.62-21.88 fps (5 runs). **1. Configuration and hangs (loading the save into Kokiri)** | Config | Result | |---|---| | default | `gfx_0.0.0 timeout`, GPU reset while loading | | `RX_VK_MESH_NOCULL=2c56dc1006942f74` (the 2.1.0 workaround) | `gfx_0.0.0 timeout`, GPU reset while loading | | `RX_VK_TASK_MESH_FALLBACK=1` | standing: OK, 21.6 fps; walking: GPU reset after a few minutes | | `RX_VK_MESH_OPT=1` | no hang (standing, walking inside the house, ~15 min outside in Kokiri) | | `RX_VK_MESH_NOCULL` + `RX_VK_MESH_OPT=1` | no hang, slightly slower than MESH_OPT alone | So on this Deck, NOCULL alone does not avoid the hang in 2.1.0; MESH_OPT does. **2. CPU and GPU take turns** Render resolution (menu row, `resolution=` in `hookshot_options.ini`) against frame time: | resolution | GPU time / frame | fps | frame time | |---|---|---|---| | 33% | 19.7 ms | 23.9 | 41.8 ms | | Auto (3D scale 0.75) | 25.0 ms | 21.8 | 45.9 ms | | 100% | 37.0 ms | 15.5 | 64.7 ms | Frame time is about GPU time + ~21 ms in every case: the GPU and the CPU work one after the other. `gpu_busy_percent` (amdgpu sysfs, 300 samples at 10 Hz) agrees: **55.7%** busy at Auto, about half the samples near 100% and the rest near 0. An all-thread sample (`HOS_SAMPLE_ALL`, `scripts/crit.py`) shows the CPU is not saturated either: on average fewer than 2 game threads run at once, sead::MainThread is blocked ~86% of the time (job waits in f_8007fe60 / the 20 µs `SleepThread` poll at lr `0x8009a478`, ~58k calls/s, and event waits), and the Presentation Thread waits in `queue_get` ~39% of the time. **3. `RX_VK_NO_READBACK_WAIT=1`: +16%** | | fps (runs) | GPU busy | |---|---|---| | default (MESH_OPT) | 21.62 / 21.81 / 21.88 | 55.7% | | `RX_VK_NO_READBACK_WAIT=1` | 25.33 / 25.12 / 25.37 | 66.9% | No GPU hang. `RX_VK_FLASH=1` with `RX_VK_SHOT_EVERY=1` over ~3 minutes of frames: no flash in either configuration. Screenshots at the same presents look the same: grass, fog and lighting. I only tested this one scene, so the CPU reads that the readback waits protect (#1375) may still matter elsewhere. Maybe the waits could be limited to the reads that need them, instead of waiting for every submission that wrote the page. **4. Things that did not change fps here** (each ±0.1-0.2 of the baseline) - `HOS_RESERVE_CORE=0`, `HOS_VCORES=0`, `HOS_CORES=8`, `HOS_POLL_SLEEP_NS=5000`, `HOS_PRESENT_POLL=1`, `HOS_PRESENT_NOWAIT=1`, `RX_VK_BATCH_IDLE=0`, `HOS_SPIN_US=0` - `HOS_PIN=Presentation=c0`, the Presentation Thread on the reserved core, which on Linux sits idle without async because `replay_pin_mask()` is Windows-only: replay submit went from **30.7 to 26.7 ms**, but fps stayed the same (21.7). The replay is not the frame's limit here. - Rebuilding `hookshot_vk.so` with `-O3` (21.9) or `-mtls-dialect=gnu2` (21.8). ThinLTO (`-flto=thin`) gave 22.2 alone, and nothing on top of NO_READBACK_WAIT (25.37). - `HOS_GRAPHICS_SCALE=0.5` and `HOS_RES_SCALE=0.5` did not change the 3D scale (GPU time unchanged). **5. `RX_VK_ASYNC=1` freezes at boot on Linux/RADV: cause and patch** With `RX_VK_ASYNC=1` the game stops after ~19 submits: no present, every thread idle. All-thread sample: sead::MainThread is in `n_nvnSyncWait` → `mkwvk::wait()` → `vkWaitSemaphores` with no timeout. The value it waits for belongs to work the replay thread has stopped at an event wait (`submission 11..14 stopped at command buffer 0's wait for event ...`), for the event the game signals after this wait. Or it is recorded but held in the batch (`RX_VK_BATCH`, on with RADV), which nothing flushes while the game waits. The 3 ms hold/drain in `wait()` is skipped by `!async_on()`. - `RX_VK_ASYNC=1 RX_VK_BATCH=0`: boots and plays, but at 11 fps, because unbatched submits cost ~15 ms a frame here. - The patch below (~25 lines, `gpu/vk/vk_replay.cpp`): in `wait()` with async on, it bumps `drain_waiters` and notifies `q_cv` so that the replay thread runs its stopped work (drain 2, as `wait_queue_empty` does), and it waits in 2 ms steps, flushing the batch between them. With it, ASYNC + batching boots and plays with no freeze. - Async is still slower on this Deck, though: **11 fps against 21.8 sync**, with ~27k forced waits in 4 min. OoT waits for the GPU several times a frame, and each wait now crosses threads. So the patch only fixes the freeze; it does not make async a win here. I can run more A/B tests on this Deck if useful (same scene, same script). <details><summary>The patch (gpu/vk/vk_replay.cpp, v2.1.0)</summary> ```diff --- a/gpu/vk/vk_replay.cpp +++ b/gpu/vk/vk_replay.cpp @@ -2134,6 +2134,7 @@ auto it = q_last.find(queue); return it != q_last.end() ? it->second : fence(); } +void async_wait_nudge(int d); // (RX_VK_ASYNC: a waiter asks the replay thread for its stopped work, below) int wait(uint64_t f, uint64_t timeout_ns) { if (completed() >= f) return 1; queue_flush_for(FR_WAIT); @@ -2181,7 +2182,26 @@ wi.pSemaphores = &timeline; wi.pValues = &f; queue_flush_for(FR_WAIT); - const VkResult res = vkWaitSemaphores(dev.device, &wi, timeout_ns); + VkResult res; + if (async_on() && timeout_ns) { + // (camilo-deck) RX_VK_ASYNC: the work this waits for can be stopped at an event wait on the replay thread (the event + // the game signals after this wait), or recorded but held in the batch (RX_VK_BATCH) that nothing flushes while the + // game waits: the game froze at its first frames. The replay thread lets its stopped work on (drain 2, as for + // wait_queue_empty) and the held batch goes out every 2 ms until the value is reached + async_wait_nudge(1); + const auto t0 = std::chrono::steady_clock::now(); + for (;;) { + const uint64_t waited = (uint64_t)std::chrono::duration_cast<std::chrono::nanoseconds>( + std::chrono::steady_clock::now() - t0).count(); + const uint64_t left = waited >= timeout_ns ? 0 : timeout_ns - waited; + res = vkWaitSemaphores(dev.device, &wi, std::min<uint64_t>(left, 2000000)); + if (res != VK_TIMEOUT || left <= 2000000) break; + queue_flush_for(FR_WAIT); + } + async_wait_nudge(-1); + } else { + res = vkWaitSemaphores(dev.device, &wi, timeout_ns); + } static int logged; if (res != VK_SUCCESS && timeout_ns > 1000000000ull && logged++ < 8) logf("vk: wait for fence %llu (done %llu, pushed %llu): %d", (unsigned long long)f, @@ -3840,6 +3860,11 @@ }; std::mutex q_mu; std::condition_variable q_cv, q_space, q_idle; +void async_wait_nudge(int d) { // (camilo-deck: wait's, RX_VK_ASYNC) + std::lock_guard lk(q_mu); + drain_waiters += d; + if (d > 0) q_cv.notify_all(); +} std::deque<Job> q_jobs; int q_presents = 0; bool q_busy = false; ``` </details> <!-- github-sync:c:6825821270 -->
Owner

@ieocin commented on GitHub · 2026-11-12 14:17 UTC · original

Blackscreen into crash, GPU reset (KDE plasmashell, steam, etc. crash & visual bugs)

GPU: RX 6600
OS: Linux (Bazzite)
hookshot version: 2.1.0
where it happens: after the intro cutscene title card cuts into black

hookshot_log.txt

> [@ieocin](https://github.com/ieocin) commented on GitHub · 2026-11-12 14:17 UTC · [original](https://github.com/NotRexed/Hookshot/issues/1000#issuecomment-6826073666) Blackscreen into crash, GPU reset (KDE plasmashell, steam, etc. crash & visual bugs) GPU: RX 6600 OS: Linux (Bazzite) hookshot version: 2.1.0 where it happens: after the intro cutscene title card cuts into black [hookshot_log.txt](https://github.com/user-attachments/files/34752079/hookshot_log.txt) <!-- github-sync:c:6826073666 -->
Owner

@camilobt commented on GitHub · 2026-11-12 15:15 UTC · original

Follow-up on the Deck readback waits: which readback costs the time

Same Steam Deck LCD and v2.1.0 setup as my comment above. I logged every readback wait (RX_VK_LOG_READBACK_WAITS=1, RX_VK_LOG_READBACK=4000). Then I built a diagnostic hookshot_vk.so that reads the range before and after each wait in invalidate() and counts how often the bytes changed. Scene: Kokiri Forest, standing.

Wait time by range (300 logged waits):

range waits time bytes changed by the wait
0x113b623000 / 0x113b628000 (+0x3980, alternating pair) 86 482 ms, 94% of all wait time, 5.6 ms avg, up to 13.7 ms ~48% of waits
10 other ranges, in 5 adjacent pairs (0x115bcde000/0x115bcf9580 +0x1b580, 0x117cf04000/0x117cf9f040 +0x9b040, ...) ~215 33 ms total, 0.01-0.5 ms each never (0 of ~2,000 waits per range)
  • The waits on the 10 large ranges look like false dependencies. The data is already final, maybe because the write-back marks both halves of a double-buffered binding. But they are cheap, so skipping only those would not change fps.
  • The pair that costs the time is a real dependency. It is read right after the submission that writes it (value == fence, the latest one), and its data changes. The first words are 0.1, 25000, 1.7778, ~1.0, 0, 0, 24999.9: near, far and 16:9 aspect, so it looks like a camera-related GPU result (visibility/culling?).
  • So the +16% from RX_VK_NO_READBACK_WAIT=1 comes almost entirely from letting the game read that pair about 2 frames late.

Backport of #2125 + #2222 + #2422 onto v2.1.0 (readback waits on, held submits sent during readback waits): 21.0 fps, GPU 53.9% busy, the same as plain 2.1.0. RX_VK_NO_READBACK_WAIT=1 on top of the backport: 25.4 fps. On this Deck the cost is the wait itself, not when the held work goes out.

Camera test (RX_VK_NO_READBACK_WAIT=1): Saria's dialogue, where the scripted camera cuts between shots. HOS_REALTIME_STEP=0, HOS_INPUT_FRAME_CLOCK=1, a shot every 20 presents. Without waits the scene ran at 26.4 fps, against 22.8 / 20.9 with them. Comparing shots of the same moment, I saw no missing or late geometry: grass, trees, fairies and houses are all there. But two runs with waits already diverged (dialogue progress differs), so this is not a frame-exact comparison. I can't rule out a one- or two-frame pop-in at cuts.

If that pair is something the game can read one frame late, special-casing it would give the Deck about +16% while keeping the wait for the exposure meter and everything else. I can test a build that skips the wait for one range if you tell me what it is.

> [@camilobt](https://github.com/camilobt) commented on GitHub · 2026-11-12 15:15 UTC · [original](https://github.com/NotRexed/Hookshot/issues/1000#issuecomment-6827545644) ### Follow-up on the Deck readback waits: which readback costs the time Same Steam Deck LCD and v2.1.0 setup as my comment above. I logged every readback wait (`RX_VK_LOG_READBACK_WAITS=1`, `RX_VK_LOG_READBACK=4000`). Then I built a diagnostic `hookshot_vk.so` that reads the range before and after each wait in `invalidate()` and counts how often the bytes changed. Scene: Kokiri Forest, standing. **Wait time by range** (300 logged waits): | range | waits | time | bytes changed by the wait | |---|---|---|---| | `0x113b623000` / `0x113b628000` (+0x3980, alternating pair) | 86 | 482 ms, **94% of all wait time**, 5.6 ms avg, up to 13.7 ms | **~48% of waits** | | 10 other ranges, in 5 adjacent pairs (`0x115bcde000`/`0x115bcf9580` +0x1b580, `0x117cf04000`/`0x117cf9f040` +0x9b040, ...) | ~215 | 33 ms total, 0.01-0.5 ms each | **never** (0 of ~2,000 waits per range) | - The waits on the 10 large ranges look like false dependencies. The data is already final, maybe because the write-back marks both halves of a double-buffered binding. But they are cheap, so skipping only those would not change fps. - The pair that costs the time is a real dependency. It is read right after the submission that writes it (`value == fence`, the latest one), and its data changes. The first words are `0.1, 25000, 1.7778, ~1.0, 0, 0, 24999.9`: near, far and 16:9 aspect, so it looks like a camera-related GPU result (visibility/culling?). - So the +16% from `RX_VK_NO_READBACK_WAIT=1` comes almost entirely from letting the game read that pair about 2 frames late. **Backport of #2125 + #2222 + #2422 onto v2.1.0** (readback waits on, held submits sent during readback waits): 21.0 fps, GPU 53.9% busy, the same as plain 2.1.0. `RX_VK_NO_READBACK_WAIT=1` on top of the backport: 25.4 fps. On this Deck the cost is the wait itself, not when the held work goes out. **Camera test** (`RX_VK_NO_READBACK_WAIT=1`): Saria's dialogue, where the scripted camera cuts between shots. `HOS_REALTIME_STEP=0`, `HOS_INPUT_FRAME_CLOCK=1`, a shot every 20 presents. Without waits the scene ran at 26.4 fps, against 22.8 / 20.9 with them. Comparing shots of the same moment, I saw no missing or late geometry: grass, trees, fairies and houses are all there. But two runs *with* waits already diverged (dialogue progress differs), so this is not a frame-exact comparison. I can't rule out a one- or two-frame pop-in at cuts. If that pair is something the game can read one frame late, special-casing it would give the Deck about +16% while keeping the wait for the exposure meter and everything else. I can test a build that skips the wait for one range if you tell me what it is. <!-- github-sync:c:6827545644 -->
Owner

@mooki000 commented on GitHub · 2026-11-12 15:18 UTC · original

Tracker upkeep note (merged pull requests and code checked against main 51da0464; no new test run was made for it).

Several old summary entries can be marked completed on main 51da0464: #1012 packages the missing AppImage header, #1839 fixes SDL2's COSMIC/libdecor startup deadlock, #1936 supplies the supported container build on non-Ubuntu hosts, #2111 explains denied udmabuf access, #2340 stops refused NVIDIA dma-buf import attempts, and #1965 enables the task/mesh optimizer on RADV. #2362 additionally makes Linux AMD Automatic choose full Compute. These are bounded fixes, not proof that every Deck/RADV hang, memory-pressure exit or NVIDIA crash is gone. In particular #2411's memfd-discard fault remains separate, and #2431 deliberately waits behind it. Please update those stale subcases without closing this tracker; no new game run was made for this note.

> [@mooki000](https://github.com/mooki000) commented on GitHub · 2026-11-12 15:18 UTC · [original](https://github.com/NotRexed/Hookshot/issues/1000#issuecomment-6827619526) **Tracker upkeep note** (merged pull requests and code checked against main `51da0464`; no new test run was made for it). Several old summary entries can be marked completed on main `51da0464`: #1012 packages the missing AppImage header, #1839 fixes SDL2's COSMIC/libdecor startup deadlock, #1936 supplies the supported container build on non-Ubuntu hosts, #2111 explains denied udmabuf access, #2340 stops refused NVIDIA dma-buf import attempts, and #1965 enables the task/mesh optimizer on RADV. #2362 additionally makes Linux AMD Automatic choose full Compute. These are bounded fixes, not proof that every Deck/RADV hang, memory-pressure exit or NVIDIA crash is gone. In particular #2411's memfd-discard fault remains separate, and #2431 deliberately waits behind it. Please update those stale subcases without closing this tracker; no new game run was made for this note. <!-- github-sync:c:6827619526 -->
Owner

@hclaria commented on GitHub · 2026-11-12 15:30 UTC · original

Steam Deck: three system settings that removed most of the long frame-rate drops for me (swap order, a memory protection, huge pages)

Edit, same day: use MemoryLow=6G, not 8G. With 8G, loading a save took 80 s on this Deck; with 6G, same game and same renderer, 12 s (12 to 15 s before the protection was set). The game grows to about 10 GB while a save loads and the GPU driver asks for memory at the same time; at 8G the kernel had almost nothing it could take quickly: a 64 MB allocation took 3.4 s, and 180,000 to 240,000 pages went to swap per 30 s against 650,000 to 980,000 without the protection. With 6G the protection still holds in play: the game keeps 5.7 to 8.2 GB resident, and swap-outs fall to 6,000 to 7,000 pages per 30 s once the save is loaded. The commands below now say 6G; the numbers in section 2 were measured with 8G.

Sharing measurements from one Steam Deck, because the default SteamOS memory setup works against this game and the fix is outside Hookshot. Related to the memory reports in #993.

Setup. Steam Deck OLED (Van Gogh 0x1435, 16 GB), SteamOS 3.9.5, kernel 7.2.7-valve2, Mesa 26.2.0-devel (RADV). Game built from main at c544828f. Play sessions used a renderer built from c544828f with #2789, #2644, #2774, #2731, #2767 and #2649 merged on top; the headless A/B below used the unchanged c544828f renderer. Not default switches: HOS_HANDHELD=1, RX_VK_LOW_SPEC=1, RX_VK_VRAM_MB=2000, RX_VK_TEX_MAX_MB=128, RX_VK_TEX_MAX_DIM=1024, RX_VK_TEX_SKIP_MB=4, RX_VK_FRAMEGEN_MULT=2, RX_VK_FSR_FG=0. The swap file had already been enlarged from SteamOS's 1 GB to 16 GB.

The game's footprint here is about 15.6 GB (its cgroup: ~4 GB resident plus ~11.6 GB swapped at one point), so several GB always live in swap on a 16 GB Deck. What matters is how.

1. zram before the disk swap file costs RAM instead of saving it. SteamOS puts a 7.2 GB zram device at priority 100 and /home/swapfile at -1. The game's cold pages compress badly. After 20 hours of uptime (/sys/block/zram0/mm_stat, /proc/vmstat): zram's peak memory use was 4.48 GB for at most 7.2 GB stored, 6.7 million pages had been stored uncompressed (huge_pages_since), 192 GB had been swapped out and 46 GB back in.

Swap file first (swapon -p 200 /home/swapfile), same scene, headless, standing still in Hyrule Field, 110 s measured:

zram first swap file first
game resident 4.07 GB 8.25 GB
game in swap 6.27 GB 0.09 GB
pages swapped out / in during the run 1,704,818 / 80,321 31,664 / 622
major faults 79,134 2,441
fps 21.77 21.70

The frame rate of a still scene does not change. In play the long collapses went away.

2. The kernel then still evicted the game with gigabytes free. In play, with the swap file first: game resident 2.7 GB, 11.1 GB in swap, 4.0 GB of RAM free. /proc/buddyinfo showed 3.4 GB free and no free block of order 7 or more. Over 4 minutes kswapd ran 1,861 times (pageoutrun) and reclaimed 4.14 million pages (pgsteal_kswapd): 2,225 pages a run, which is compact_gap for an order-10 request (2,048). So something asks for 4 MB blocks about 8 times a second, memory is too fragmented to give them, and each try evicts ~8 MB. I did not trace the caller; the GPU driver's page pool is my guess, and the pinned dma-buf imports may be what keeps memory fragmented. The cost was swap-in storms: 339,000 pages read back in 30 s and 5.5 to 6.2 fps for about 35 s at the Kakariko windmill, in a scene of 1,100 to 1,450 draws with nothing compiling.

systemctl set-property --runtime user.slice MemoryLow=8G stopped it (8G is what I measured here; 6G is the value to use, see the edit at the top): pages swapped out went from 100,000 to 580,000 per 30 s to 9,000 to 17,000, then 0 for the next minutes; memory pressure (/proc/pressure/memory, full avg10) from 5.5 % to 0.0 to 0.5 %.

3. Transparent huge pages off (always to madvise, khugepaged/defrag 0). The amount evicted did not change, but windows of 120 presents under 12 fps went from 7 in 9 minutes to 2 in 6.5 minutes. Weaker evidence: one session each, not exactly the same route.

All three together, 4 minutes through Castle Town market, 30 windows of 120 presents at ~2,150 draws: mean 16.8 fps, one window under 12 fps (8.5, on arrival in an area), 96,000 pages swapped out in total, against 4.1 million in 4 minutes before.

Commands (root; the last three do not survive a reboot as written):

swapoff /home/swapfile && swapon -p 200 /home/swapfile
systemctl set-property --runtime user.slice MemoryLow=6G
echo madvise > /sys/kernel/mm/transparent_hugepage/enabled
echo 0 > /sys/kernel/mm/transparent_hugepage/khugepaged/defrag

The swap priority can be kept across reboots with a drop-in for home-swapfile.swap holding [Swap] and Priority=200, and the protection by leaving --runtime out.

To check a Deck: swapon --show, cat /sys/block/zram0/mm_stat (third field: bytes of RAM zram uses now, fifth: its peak), cat /proc/pressure/memory.

Limits. One Deck, short sessions, a renderer with open PRs in play. The settings are system-wide. Swap on the SSD means more writes to it. The 6 GB figure fits 16 GB of RAM and this GPU memory use; 8 GB was too tight (the edit at the top), and I did not try other values.

If it is useful I can send a troubleshooting row for the README, and a Linux line for the boot memory notice when a zram device outranks a disk swap. Huge pages could also be turned off for the game's process alone (prctl(PR_SET_THP_DISABLE)), which I have not tried yet.

> [@hclaria](https://github.com/hclaria) commented on GitHub · 2026-11-12 15:30 UTC · [original](https://github.com/NotRexed/Hookshot/issues/1000#issuecomment-6827935141) **Steam Deck: three system settings that removed most of the long frame-rate drops for me (swap order, a memory protection, huge pages)** **Edit, same day: use `MemoryLow=6G`, not `8G`.** With 8G, loading a save took 80 s on this Deck; with 6G, same game and same renderer, 12 s (12 to 15 s before the protection was set). The game grows to about 10 GB while a save loads and the GPU driver asks for memory at the same time; at 8G the kernel had almost nothing it could take quickly: a 64 MB allocation took 3.4 s, and 180,000 to 240,000 pages went to swap per 30 s against 650,000 to 980,000 without the protection. With 6G the protection still holds in play: the game keeps 5.7 to 8.2 GB resident, and swap-outs fall to 6,000 to 7,000 pages per 30 s once the save is loaded. The commands below now say 6G; the numbers in section 2 were measured with 8G. Sharing measurements from one Steam Deck, because the default SteamOS memory setup works against this game and the fix is outside Hookshot. Related to the memory reports in #993. **Setup.** Steam Deck OLED (Van Gogh `0x1435`, 16 GB), SteamOS 3.9.5, kernel 7.2.7-valve2, Mesa 26.2.0-devel (RADV). Game built from main at `c544828f`. Play sessions used a renderer built from `c544828f` with #2789, #2644, #2774, #2731, #2767 and #2649 merged on top; the headless A/B below used the unchanged `c544828f` renderer. Not default switches: `HOS_HANDHELD=1`, `RX_VK_LOW_SPEC=1`, `RX_VK_VRAM_MB=2000`, `RX_VK_TEX_MAX_MB=128`, `RX_VK_TEX_MAX_DIM=1024`, `RX_VK_TEX_SKIP_MB=4`, `RX_VK_FRAMEGEN_MULT=2`, `RX_VK_FSR_FG=0`. The swap file had already been enlarged from SteamOS's 1 GB to 16 GB. The game's footprint here is about 15.6 GB (its cgroup: ~4 GB resident plus ~11.6 GB swapped at one point), so several GB always live in swap on a 16 GB Deck. What matters is how. **1. zram before the disk swap file costs RAM instead of saving it.** SteamOS puts a 7.2 GB zram device at priority 100 and `/home/swapfile` at -1. The game's cold pages compress badly. After 20 hours of uptime (`/sys/block/zram0/mm_stat`, `/proc/vmstat`): zram's peak memory use was 4.48 GB for at most 7.2 GB stored, 6.7 million pages had been stored uncompressed (`huge_pages_since`), 192 GB had been swapped out and 46 GB back in. Swap file first (`swapon -p 200 /home/swapfile`), same scene, headless, standing still in Hyrule Field, 110 s measured: | | zram first | swap file first | |---|---|---| | game resident | 4.07 GB | 8.25 GB | | game in swap | 6.27 GB | 0.09 GB | | pages swapped out / in during the run | 1,704,818 / 80,321 | 31,664 / 622 | | major faults | 79,134 | 2,441 | | fps | 21.77 | 21.70 | The frame rate of a still scene does not change. In play the long collapses went away. **2. The kernel then still evicted the game with gigabytes free.** In play, with the swap file first: game resident 2.7 GB, 11.1 GB in swap, 4.0 GB of RAM free. `/proc/buddyinfo` showed 3.4 GB free and no free block of order 7 or more. Over 4 minutes kswapd ran 1,861 times (`pageoutrun`) and reclaimed 4.14 million pages (`pgsteal_kswapd`): 2,225 pages a run, which is `compact_gap` for an order-10 request (2,048). So something asks for 4 MB blocks about 8 times a second, memory is too fragmented to give them, and each try evicts ~8 MB. I did not trace the caller; the GPU driver's page pool is my guess, and the pinned dma-buf imports may be what keeps memory fragmented. The cost was swap-in storms: 339,000 pages read back in 30 s and 5.5 to 6.2 fps for about 35 s at the Kakariko windmill, in a scene of 1,100 to 1,450 draws with nothing compiling. `systemctl set-property --runtime user.slice MemoryLow=8G` stopped it (8G is what I measured here; 6G is the value to use, see the edit at the top): pages swapped out went from 100,000 to 580,000 per 30 s to 9,000 to 17,000, then 0 for the next minutes; memory pressure (`/proc/pressure/memory`, full avg10) from 5.5 % to 0.0 to 0.5 %. **3. Transparent huge pages off (`always` to `madvise`, `khugepaged/defrag` 0).** The amount evicted did not change, but windows of 120 presents under 12 fps went from 7 in 9 minutes to 2 in 6.5 minutes. Weaker evidence: one session each, not exactly the same route. **All three together**, 4 minutes through Castle Town market, 30 windows of 120 presents at ~2,150 draws: mean 16.8 fps, one window under 12 fps (8.5, on arrival in an area), 96,000 pages swapped out in total, against 4.1 million in 4 minutes before. **Commands** (root; the last three do not survive a reboot as written): ``` swapoff /home/swapfile && swapon -p 200 /home/swapfile systemctl set-property --runtime user.slice MemoryLow=6G echo madvise > /sys/kernel/mm/transparent_hugepage/enabled echo 0 > /sys/kernel/mm/transparent_hugepage/khugepaged/defrag ``` The swap priority can be kept across reboots with a drop-in for `home-swapfile.swap` holding `[Swap]` and `Priority=200`, and the protection by leaving `--runtime` out. To check a Deck: `swapon --show`, `cat /sys/block/zram0/mm_stat` (third field: bytes of RAM zram uses now, fifth: its peak), `cat /proc/pressure/memory`. **Limits.** One Deck, short sessions, a renderer with open PRs in play. The settings are system-wide. Swap on the SSD means more writes to it. The 6 GB figure fits 16 GB of RAM and this GPU memory use; 8 GB was too tight (the edit at the top), and I did not try other values. If it is useful I can send a troubleshooting row for the README, and a Linux line for the boot memory notice when a zram device outranks a disk swap. Huge pages could also be turned off for the game's process alone (`prctl(PR_SET_THP_DISABLE)`), which I have not tried yet. <!-- github-sync:c:6827935141 -->
Owner

@eleyoy commented on GitHub · 2026-11-12 15:50 UTC · original

A report for the RADV GPU hang section: VK_ERROR_DEVICE_LOST on a Van Gogh APU (ROG Xbox Ally, Ryzen Z2 A), with the kernel side of it.

Same signature as #2245, on a different Van Gogh device. Three things here may be new: the kernel's own verdict on the hang, a measurement that rules out the lockup_timeout theory, and the reason the #1300 Steam Deck workaround does not reach this title even on the same GPU.

I no longer have hookshot_log.txt — the install was removed before I thought to keep it — but the kernel log of the crashed boot survived and is attached. The game lines below are the ones I recorded at the time.

System

Device ASUS ROG Xbox Ally (RC73YA)
APU AMD Ryzen Z2 A — RADV VANGOGH, 6144 MB VRAM fixed in BIOS
OS Bazzite, kernel 7.3.3-ogc1.1.fc45
Mesa 26.2.6
Hookshot v2.1.0 (source e561602e)
Game OoT, language es-419, built locally from the AppImage
vk: AMD Ryzen Z2 A (RADV VANGOGH), Vulkan 1.4, driver 0x6802006; mesh shaders yes, host memory import yes, pipeline libraries yes
vk: mesh shaders row: Automatic (native)

Symptom

Exactly as in #2245: the game starts, the file-select works, the opening cutscene plays, and the handover to gameplay loses the device. Reproduced three times out of three.

radv/amdgpu: The CS has been cancelled because the context is lost. This context is innocent.
vk: batched submit 9638 failed (-4)
vk: device lost: reading the fault info (RX_VK_CHECKPOINTS=1 for markers)
vk: FATAL: the GPU device was lost (VK_ERROR_DEVICE_LOST)

The last frame before the loss was a heavy upload frame:

vk: slow upload 2727.2 ms: #524 0x1142540000 512x512x1 x1 levels 1 NVN 0x29, 2048 of 2048 KB
vk: slow submit: 2739.6 ms: texture lookups 2728.9 uploads 2728.6 dispatch 2737.4
vk: a frame's uploads took 2878 ms: ASTC on the GPU 37 (128.0 MB, 133 ms); on the CPU 69 (40.1 MB, 2745 ms)
vk: a capture's wait for write-back 66677 timed out (done 66673)

What the kernel says

This is the part I have not seen posted in the Linux reports. journalctl -k for the crashed boot:

amdgpu 0000:04:00.0: Dumping IP State
amdgpu 0000:04:00.0: [drm] AMDGPU device coredump file has been created
amdgpu 0000:04:00.0: ring gfx_0.0.0 timeout, signaled seq=504077, emitted seq=504079
amdgpu 0000:04:00.0:  Process hookshot pid 37113 thread sead::MainThrea pid 37119
amdgpu 0000:04:00.0: Starting gfx_0.0.0 ring reset
amdgpu 0000:04:00.0: Ring gfx_0.0.0 reset failed
amdgpu 0000:04:00.0: GPU reset begin!. Source:  1
amdgpu 0000:04:00.0: MODE2 reset
amdgpu 0000:04:00.0: GPU reset succeeded, trying to resume
amdgpu 0000:04:00.0: GPU reset(2) succeeded!
amdgpu 0000:04:00.0: [drm] device wedged, but no recovery needed

Two details worth noting:

  • It is a gfx ring timeout with no VM fault and no page fault anywhere in the log. The job simply never signalled: emitted seq=504079, signaled seq=504077. That is consistent with a shader that does not terminate, not with an out-of-bounds access.
  • The ring reset failed, so amdgpu escalated to a full MODE2 device reset. On this handheld that takes the session down with it; the machine had to be power-cycled.

The lockup_timeout theory does not hold

Some reports suggest the kernel may be giving up too early on a long submission. On this system that is not what happened:

  • amdgpu's bare-metal default for non-compute rings is 10000 ms. The parameter is untouched here (/proc/cmdline carries only amdgpu.ppfeaturemask=0xfff7ffff).
  • The slowest submit Hookshot logged in the entire run was 2739 ms, well inside that budget.

So the hung job did not merely overrun a tight deadline — it never completed at all. Raising lockup_timeout would delay the reset, not prevent it.

RX_VK_MESH_NOCULL=1 does not reach this title's task shader

#1300 added RX_VK_MESH_NOCULL for a Steam Deck task-shader hang. The Steam Deck and this device are both Van Gogh, so this looked like the same bug. It is not reachable from here:

vk: task code 1813f9ceef04a63f: culling pattern not found, left as it is (RX_VK_MESH_NOCULL)

The whole run compiles exactly one task code, and the pattern the workaround looks for is not present in it. With the variable set, the build still produced the unmodified shader and the configuration is byte-for-byte the one that hangs.

If the culling pattern is title-specific, OoT's task shader appears to use a different shape than the one #1300 targets, and the workaround silently does nothing rather than reporting that it cannot help. The log line is clear enough once you look for it, but nothing surfaces it to the user.

mesh_shaders=2 (Compute) does avoid the hang

Confirmed over a long session: file select, cutscene, handover, and extended gameplay with zero device losses. Two costs worth recording:

  • Pipeline count triples. Native: 20463 pipelines. Compute: 67099 predicted. On this hardware the first build of the compute path is a one-to-two hour job, and it is easy to mistake for a hang — the ETA climbs for a long while before it falls.
  • Large performance cost, though on this APU the port is CPU-bound either way (below).

Performance notes on the Z2 A, in case they are useful

Steady ~19-20 fps in normal outdoor areas, with the GPU idle:

vk: 10200 presents, 20.2 fps; a frame: 2413 draws (0 skipped), 118 dispatches, 205 passes,
141 barriers, 6 submits, GPU-bound wait 0.3 ms; 10898 pipelines, 1054 textures (2416 MB)

GPU-bound wait 0.3 ms with the CPU pinned at its 3799 MHz ceiling: the limit is draw submission on four Zen 2 cores, not the GPU. Lowering resolution or quality preset changes nothing measurable, and the power limit is not the constraint either.

One option made a large difference and is off by default:

sampler_cache=0 sampler_cache=1
descriptors 49.8 ms 12.6 ms
texture lookups 43.8 ms 9.1 ms

Same scene class, from slow submit lines. If there is no correctness reason to keep it off, it may be worth defaulting on — or at least worth mentioning in the handheld guidance.

Suggestions

  1. When RX_VK_MESH_NOCULL is requested but the pattern is not found, consider surfacing that to the user rather than only to the log — it currently looks like the workaround is active when it is not.
  2. The wiki's device-lost steps (more VRAM, newer Adrenalin, RX_VK_UNEVEN_BC=0) are Windows-shaped. For Linux/RADV, mesh_shaders=2 is the one thing that worked here, and the kernel ring-timeout signature above is a quick way for a reporter to confirm they have this bug rather than a different one.
  3. The compute path's first build being 3.3x the pipelines is worth a note next to the setting, so handheld users do not abandon it mid-build.

Happy to run further tests on this hardware, including with RX_VK_CHECKPOINTS=1 or a debug build. The install has been removed since, but I can rebuild it if a fresh hookshot_log.txt or a devcoredump would help.

Appendix: the kernel log around the hang

journalctl -k for the crashed boot, from the first amdgpu message to the end of the recovery. Pasted rather than attached because it is short.

Nov 11 22:43:32.968156 bazzite kernel: amdgpu 0000:04:00.0: Dumping IP State
Nov 11 22:43:32.969330 bazzite kernel: amdgpu 0000:04:00.0: Dumping IP State Completed
Nov 11 22:43:32.969670 bazzite kernel: amdgpu 0000:04:00.0: [drm] AMDGPU device coredump file has been created
Nov 11 22:43:32.969913 bazzite kernel: amdgpu 0000:04:00.0: [drm] Check your /sys/class/drm/card1/device/devcoredump/data
Nov 11 22:43:32.970182 bazzite kernel: amdgpu 0000:04:00.0: ring gfx_0.0.0 timeout, signaled seq=504077, emitted seq=504079
Nov 11 22:43:32.970457 bazzite kernel: amdgpu 0000:04:00.0:  Process hookshot pid 37113 thread sead::MainThrea pid 37119
Nov 11 22:43:32.970701 bazzite kernel: amdgpu 0000:04:00.0: Starting gfx_0.0.0 ring reset
Nov 11 22:43:33.143226 bazzite kernel: amdgpu 0000:04:00.0: Ring gfx_0.0.0 reset failed
Nov 11 22:43:33.143687 bazzite kernel: amdgpu 0000:04:00.0: GPU reset begin!. Source:  1
Nov 11 22:43:33.274266 bazzite kernel: amdgpu 0000:04:00.0: MODE2 reset
Nov 11 22:43:33.284168 bazzite kernel: amdgpu 0000:04:00.0: GPU reset succeeded, trying to resume
Nov 11 22:43:33.284603 bazzite kernel: amdgpu 0000:04:00.0: [drm] PCIE GART of 1024M enabled (table at 0x000000F57FC00000).
Nov 11 22:43:33.284832 bazzite kernel: amdgpu 0000:04:00.0: PSP is resuming...
Nov 11 22:43:33.307185 bazzite kernel: amdgpu 0000:04:00.0: reserve 0xa00000 from 0xf57e000000 for PSP TMR
Nov 11 22:43:34.145324 bazzite kernel: amdgpu 0000:04:00.0: SMU is resuming...
Nov 11 22:43:34.145882 bazzite kernel: amdgpu 0000:04:00.0: SMU is resumed successfully!
Nov 11 22:43:34.146248 bazzite kernel: amdgpu 0000:04:00.0: kiq ring mec 2 pipe 1 q 0
Nov 11 22:43:34.159528 bazzite kernel: amdgpu 0000:04:00.0: [drm] DMUB hardware initialized: version=0x03000013
Nov 11 22:43:34.279156 bazzite kernel: amdgpu 0000:04:00.0: [drm] Failed to enable ASSR, DTM TA is not initialized.
Nov 11 22:43:34.334154 bazzite kernel: [drm] Failed to add display topology, DTM TA is not initialized.
Nov 11 22:43:34.334240 bazzite kernel: amdgpu 0000:04:00.0: ring gfx_0.0.0 uses VM inv eng 0 on hub 0
Nov 11 22:43:34.334669 bazzite kernel: amdgpu 0000:04:00.0: ring gfx_0.1.0 uses VM inv eng 1 on hub 0
Nov 11 22:43:34.334917 bazzite kernel: amdgpu 0000:04:00.0: ring comp_1.0.0 uses VM inv eng 4 on hub 0
Nov 11 22:43:34.335174 bazzite kernel: amdgpu 0000:04:00.0: ring comp_1.1.0 uses VM inv eng 5 on hub 0
Nov 11 22:43:34.335413 bazzite kernel: amdgpu 0000:04:00.0: ring comp_1.2.0 uses VM inv eng 6 on hub 0
Nov 11 22:43:34.335649 bazzite kernel: amdgpu 0000:04:00.0: ring comp_1.3.0 uses VM inv eng 7 on hub 0
Nov 11 22:43:34.335882 bazzite kernel: amdgpu 0000:04:00.0: ring comp_1.0.1 uses VM inv eng 8 on hub 0
Nov 11 22:43:34.336118 bazzite kernel: amdgpu 0000:04:00.0: ring comp_1.1.1 uses VM inv eng 9 on hub 0
Nov 11 22:43:34.336373 bazzite kernel: amdgpu 0000:04:00.0: ring comp_1.2.1 uses VM inv eng 10 on hub 0
Nov 11 22:43:34.336605 bazzite kernel: amdgpu 0000:04:00.0: ring comp_1.3.1 uses VM inv eng 11 on hub 0
Nov 11 22:43:34.336893 bazzite kernel: amdgpu 0000:04:00.0: ring kiq_0.2.1.0 uses VM inv eng 12 on hub 0
Nov 11 22:43:34.337204 bazzite kernel: amdgpu 0000:04:00.0: ring sdma0 uses VM inv eng 13 on hub 0
Nov 11 22:43:34.337432 bazzite kernel: amdgpu 0000:04:00.0: ring vcn_dec_0 uses VM inv eng 0 on hub 8
Nov 11 22:43:34.337663 bazzite kernel: amdgpu 0000:04:00.0: ring vcn_enc_0.0 uses VM inv eng 1 on hub 8
Nov 11 22:43:34.337876 bazzite kernel: amdgpu 0000:04:00.0: ring vcn_enc_0.1 uses VM inv eng 4 on hub 8
Nov 11 22:43:34.338099 bazzite kernel: amdgpu 0000:04:00.0: ring jpeg_dec uses VM inv eng 5 on hub 8
Nov 11 22:43:34.338349 bazzite kernel: amdgpu 0000:04:00.0: GPU reset(2) succeeded!
Nov 11 22:43:34.338635 bazzite kernel: amdgpu 0000:04:00.0: [drm] device wedged, but no recovery needed
Nov 11 22:43:36.246151 bazzite kernel: input: Microsoft X-Box 360 pad 0 as /devices/virtual/input/input35
Nov 11 22:44:05.145208 bazzite kernel: show_signal_msg: 71 callbacks suppressed
Nov 11 22:44:05.145253 bazzite kernel: _run[35189]: segfault at 3bd9dfa0 ip 000000003bd9dfa0 sp 00007fc335335408 error 15 likely on CPU 2 (core 2, socket 0)
Nov 11 22:44:05.145267 bazzite kernel: Code: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 00 00 00 00 81 00 00 00 00 00 00 00 <40> 13 dc 3b 00 00 00 00 38 eb 0d 82 c3 7f 00 00 80 a1 a2 04 00 00
Nov 11 22:44:06.560561 bazzite kernel: fbcon: Taking over console
Nov 11 22:44:07.144166 bazzite kernel: amdgpu 0000:04:00.0: [drm] Failed to enable ASSR, DTM TA is not initialized.
Nov 11 22:44:07.211172 bazzite kernel: [drm] Failed to add display topology, DTM TA is not initialized.
Nov 11 22:44:07.211242 bazzite kernel: Console: switching to colour frame buffer device 240x67
Nov 11 22:44:08.662404 bazzite kernel: audit: type=1305 audit(1794451448.660:4890): op=set audit_pid=0 old=1189 auid=4294967295 ses=4294967295 subj=system_u:system_r:auditd_t:s0 res=1
Nov 11 22:44:08.668295 bazzite kernel: audit: type=1131 audit(1794451448.666:4891): pid=1 uid=0 auid=4294967295 ses=4294967295 subj=system_u:system_r:init_t:s0 msg='unit=auditd comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success'
Nov 11 22:44:08.668411 bazzite kernel: audit: type=1131 audit(1794451448.666:4892): pid=1 uid=0 auid=4294967295 ses=4294967295 subj=system_u:system_r:init_t:s0 msg='unit=systemd-tmpfiles-setup comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success'
> [@eleyoy](https://github.com/eleyoy) commented on GitHub · 2026-11-12 15:50 UTC · [original](https://github.com/NotRexed/Hookshot/issues/1000#issuecomment-6828443665) **A report for the RADV GPU hang section: VK_ERROR_DEVICE_LOST on a Van Gogh APU (ROG Xbox Ally, Ryzen Z2 A), with the kernel side of it.** Same signature as #2245, on a different Van Gogh device. Three things here may be new: the kernel's own verdict on the hang, a measurement that rules out the `lockup_timeout` theory, and the reason the #1300 Steam Deck workaround does not reach this title even on the same GPU. I no longer have `hookshot_log.txt` — the install was removed before I thought to keep it — but the kernel log of the crashed boot survived and is attached. The game lines below are the ones I recorded at the time. ## System | | | |---|---| | Device | ASUS ROG Xbox Ally (RC73YA) | | APU | AMD Ryzen Z2 A — RADV VANGOGH, 6144 MB VRAM fixed in BIOS | | OS | Bazzite, kernel 7.3.3-ogc1.1.fc45 | | Mesa | 26.2.6 | | Hookshot | v2.1.0 (source e561602e) | | Game | OoT, language es-419, built locally from the AppImage | ``` vk: AMD Ryzen Z2 A (RADV VANGOGH), Vulkan 1.4, driver 0x6802006; mesh shaders yes, host memory import yes, pipeline libraries yes vk: mesh shaders row: Automatic (native) ``` ## Symptom Exactly as in #2245: the game starts, the file-select works, the opening cutscene plays, and the handover to gameplay loses the device. Reproduced three times out of three. ``` radv/amdgpu: The CS has been cancelled because the context is lost. This context is innocent. vk: batched submit 9638 failed (-4) vk: device lost: reading the fault info (RX_VK_CHECKPOINTS=1 for markers) vk: FATAL: the GPU device was lost (VK_ERROR_DEVICE_LOST) ``` The last frame before the loss was a heavy upload frame: ``` vk: slow upload 2727.2 ms: #524 0x1142540000 512x512x1 x1 levels 1 NVN 0x29, 2048 of 2048 KB vk: slow submit: 2739.6 ms: texture lookups 2728.9 uploads 2728.6 dispatch 2737.4 vk: a frame's uploads took 2878 ms: ASTC on the GPU 37 (128.0 MB, 133 ms); on the CPU 69 (40.1 MB, 2745 ms) vk: a capture's wait for write-back 66677 timed out (done 66673) ``` ## What the kernel says This is the part I have not seen posted in the Linux reports. `journalctl -k` for the crashed boot: ``` amdgpu 0000:04:00.0: Dumping IP State amdgpu 0000:04:00.0: [drm] AMDGPU device coredump file has been created amdgpu 0000:04:00.0: ring gfx_0.0.0 timeout, signaled seq=504077, emitted seq=504079 amdgpu 0000:04:00.0: Process hookshot pid 37113 thread sead::MainThrea pid 37119 amdgpu 0000:04:00.0: Starting gfx_0.0.0 ring reset amdgpu 0000:04:00.0: Ring gfx_0.0.0 reset failed amdgpu 0000:04:00.0: GPU reset begin!. Source: 1 amdgpu 0000:04:00.0: MODE2 reset amdgpu 0000:04:00.0: GPU reset succeeded, trying to resume amdgpu 0000:04:00.0: GPU reset(2) succeeded! amdgpu 0000:04:00.0: [drm] device wedged, but no recovery needed ``` Two details worth noting: - It is a **gfx ring timeout with no VM fault and no page fault** anywhere in the log. The job simply never signalled: `emitted seq=504079`, `signaled seq=504077`. That is consistent with a shader that does not terminate, not with an out-of-bounds access. - The **ring reset failed**, so amdgpu escalated to a full MODE2 device reset. On this handheld that takes the session down with it; the machine had to be power-cycled. ## The `lockup_timeout` theory does not hold Some reports suggest the kernel may be giving up too early on a long submission. On this system that is not what happened: - amdgpu's bare-metal default for non-compute rings is **10000 ms**. The parameter is untouched here (`/proc/cmdline` carries only `amdgpu.ppfeaturemask=0xfff7ffff`). - The slowest submit Hookshot logged in the entire run was **2739 ms**, well inside that budget. So the hung job did not merely overrun a tight deadline — it never completed at all. Raising `lockup_timeout` would delay the reset, not prevent it. ## `RX_VK_MESH_NOCULL=1` does not reach this title's task shader #1300 added `RX_VK_MESH_NOCULL` for a Steam Deck task-shader hang. The Steam Deck and this device are both Van Gogh, so this looked like the same bug. It is not reachable from here: ``` vk: task code 1813f9ceef04a63f: culling pattern not found, left as it is (RX_VK_MESH_NOCULL) ``` The whole run compiles **exactly one task code**, and the pattern the workaround looks for is not present in it. With the variable set, the build still produced the unmodified shader and the configuration is byte-for-byte the one that hangs. If the culling pattern is title-specific, OoT's task shader appears to use a different shape than the one #1300 targets, and the workaround silently does nothing rather than reporting that it cannot help. The log line is clear enough once you look for it, but nothing surfaces it to the user. ## `mesh_shaders=2` (Compute) does avoid the hang Confirmed over a long session: file select, cutscene, handover, and extended gameplay with **zero device losses**. Two costs worth recording: - **Pipeline count triples.** Native: `20463` pipelines. Compute: `67099` predicted. On this hardware the first build of the compute path is a one-to-two hour job, and it is easy to mistake for a hang — the ETA climbs for a long while before it falls. - **Large performance cost**, though on this APU the port is CPU-bound either way (below). ## Performance notes on the Z2 A, in case they are useful Steady ~19-20 fps in normal outdoor areas, with the GPU idle: ``` vk: 10200 presents, 20.2 fps; a frame: 2413 draws (0 skipped), 118 dispatches, 205 passes, 141 barriers, 6 submits, GPU-bound wait 0.3 ms; 10898 pipelines, 1054 textures (2416 MB) ``` `GPU-bound wait 0.3 ms` with the CPU pinned at its 3799 MHz ceiling: the limit is draw submission on four Zen 2 cores, not the GPU. Lowering resolution or quality preset changes nothing measurable, and the power limit is not the constraint either. One option made a large difference and is off by default: | | `sampler_cache=0` | `sampler_cache=1` | |---|---|---| | `descriptors` | 49.8 ms | 12.6 ms | | `texture lookups` | 43.8 ms | 9.1 ms | Same scene class, from `slow submit` lines. If there is no correctness reason to keep it off, it may be worth defaulting on — or at least worth mentioning in the handheld guidance. ## Suggestions 1. When `RX_VK_MESH_NOCULL` is requested but the pattern is not found, consider surfacing that to the user rather than only to the log — it currently looks like the workaround is active when it is not. 2. The wiki's device-lost steps (more VRAM, newer Adrenalin, `RX_VK_UNEVEN_BC=0`) are Windows-shaped. For Linux/RADV, `mesh_shaders=2` is the one thing that worked here, and the kernel ring-timeout signature above is a quick way for a reporter to confirm they have this bug rather than a different one. 3. The compute path's first build being 3.3x the pipelines is worth a note next to the setting, so handheld users do not abandon it mid-build. Happy to run further tests on this hardware, including with `RX_VK_CHECKPOINTS=1` or a debug build. The install has been removed since, but I can rebuild it if a fresh `hookshot_log.txt` or a `devcoredump` would help. ## Appendix: the kernel log around the hang `journalctl -k` for the crashed boot, from the first amdgpu message to the end of the recovery. Pasted rather than attached because it is short. ``` Nov 11 22:43:32.968156 bazzite kernel: amdgpu 0000:04:00.0: Dumping IP State Nov 11 22:43:32.969330 bazzite kernel: amdgpu 0000:04:00.0: Dumping IP State Completed Nov 11 22:43:32.969670 bazzite kernel: amdgpu 0000:04:00.0: [drm] AMDGPU device coredump file has been created Nov 11 22:43:32.969913 bazzite kernel: amdgpu 0000:04:00.0: [drm] Check your /sys/class/drm/card1/device/devcoredump/data Nov 11 22:43:32.970182 bazzite kernel: amdgpu 0000:04:00.0: ring gfx_0.0.0 timeout, signaled seq=504077, emitted seq=504079 Nov 11 22:43:32.970457 bazzite kernel: amdgpu 0000:04:00.0: Process hookshot pid 37113 thread sead::MainThrea pid 37119 Nov 11 22:43:32.970701 bazzite kernel: amdgpu 0000:04:00.0: Starting gfx_0.0.0 ring reset Nov 11 22:43:33.143226 bazzite kernel: amdgpu 0000:04:00.0: Ring gfx_0.0.0 reset failed Nov 11 22:43:33.143687 bazzite kernel: amdgpu 0000:04:00.0: GPU reset begin!. Source: 1 Nov 11 22:43:33.274266 bazzite kernel: amdgpu 0000:04:00.0: MODE2 reset Nov 11 22:43:33.284168 bazzite kernel: amdgpu 0000:04:00.0: GPU reset succeeded, trying to resume Nov 11 22:43:33.284603 bazzite kernel: amdgpu 0000:04:00.0: [drm] PCIE GART of 1024M enabled (table at 0x000000F57FC00000). Nov 11 22:43:33.284832 bazzite kernel: amdgpu 0000:04:00.0: PSP is resuming... Nov 11 22:43:33.307185 bazzite kernel: amdgpu 0000:04:00.0: reserve 0xa00000 from 0xf57e000000 for PSP TMR Nov 11 22:43:34.145324 bazzite kernel: amdgpu 0000:04:00.0: SMU is resuming... Nov 11 22:43:34.145882 bazzite kernel: amdgpu 0000:04:00.0: SMU is resumed successfully! Nov 11 22:43:34.146248 bazzite kernel: amdgpu 0000:04:00.0: kiq ring mec 2 pipe 1 q 0 Nov 11 22:43:34.159528 bazzite kernel: amdgpu 0000:04:00.0: [drm] DMUB hardware initialized: version=0x03000013 Nov 11 22:43:34.279156 bazzite kernel: amdgpu 0000:04:00.0: [drm] Failed to enable ASSR, DTM TA is not initialized. Nov 11 22:43:34.334154 bazzite kernel: [drm] Failed to add display topology, DTM TA is not initialized. Nov 11 22:43:34.334240 bazzite kernel: amdgpu 0000:04:00.0: ring gfx_0.0.0 uses VM inv eng 0 on hub 0 Nov 11 22:43:34.334669 bazzite kernel: amdgpu 0000:04:00.0: ring gfx_0.1.0 uses VM inv eng 1 on hub 0 Nov 11 22:43:34.334917 bazzite kernel: amdgpu 0000:04:00.0: ring comp_1.0.0 uses VM inv eng 4 on hub 0 Nov 11 22:43:34.335174 bazzite kernel: amdgpu 0000:04:00.0: ring comp_1.1.0 uses VM inv eng 5 on hub 0 Nov 11 22:43:34.335413 bazzite kernel: amdgpu 0000:04:00.0: ring comp_1.2.0 uses VM inv eng 6 on hub 0 Nov 11 22:43:34.335649 bazzite kernel: amdgpu 0000:04:00.0: ring comp_1.3.0 uses VM inv eng 7 on hub 0 Nov 11 22:43:34.335882 bazzite kernel: amdgpu 0000:04:00.0: ring comp_1.0.1 uses VM inv eng 8 on hub 0 Nov 11 22:43:34.336118 bazzite kernel: amdgpu 0000:04:00.0: ring comp_1.1.1 uses VM inv eng 9 on hub 0 Nov 11 22:43:34.336373 bazzite kernel: amdgpu 0000:04:00.0: ring comp_1.2.1 uses VM inv eng 10 on hub 0 Nov 11 22:43:34.336605 bazzite kernel: amdgpu 0000:04:00.0: ring comp_1.3.1 uses VM inv eng 11 on hub 0 Nov 11 22:43:34.336893 bazzite kernel: amdgpu 0000:04:00.0: ring kiq_0.2.1.0 uses VM inv eng 12 on hub 0 Nov 11 22:43:34.337204 bazzite kernel: amdgpu 0000:04:00.0: ring sdma0 uses VM inv eng 13 on hub 0 Nov 11 22:43:34.337432 bazzite kernel: amdgpu 0000:04:00.0: ring vcn_dec_0 uses VM inv eng 0 on hub 8 Nov 11 22:43:34.337663 bazzite kernel: amdgpu 0000:04:00.0: ring vcn_enc_0.0 uses VM inv eng 1 on hub 8 Nov 11 22:43:34.337876 bazzite kernel: amdgpu 0000:04:00.0: ring vcn_enc_0.1 uses VM inv eng 4 on hub 8 Nov 11 22:43:34.338099 bazzite kernel: amdgpu 0000:04:00.0: ring jpeg_dec uses VM inv eng 5 on hub 8 Nov 11 22:43:34.338349 bazzite kernel: amdgpu 0000:04:00.0: GPU reset(2) succeeded! Nov 11 22:43:34.338635 bazzite kernel: amdgpu 0000:04:00.0: [drm] device wedged, but no recovery needed Nov 11 22:43:36.246151 bazzite kernel: input: Microsoft X-Box 360 pad 0 as /devices/virtual/input/input35 Nov 11 22:44:05.145208 bazzite kernel: show_signal_msg: 71 callbacks suppressed Nov 11 22:44:05.145253 bazzite kernel: _run[35189]: segfault at 3bd9dfa0 ip 000000003bd9dfa0 sp 00007fc335335408 error 15 likely on CPU 2 (core 2, socket 0) Nov 11 22:44:05.145267 bazzite kernel: Code: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 00 00 00 00 81 00 00 00 00 00 00 00 <40> 13 dc 3b 00 00 00 00 38 eb 0d 82 c3 7f 00 00 80 a1 a2 04 00 00 Nov 11 22:44:06.560561 bazzite kernel: fbcon: Taking over console Nov 11 22:44:07.144166 bazzite kernel: amdgpu 0000:04:00.0: [drm] Failed to enable ASSR, DTM TA is not initialized. Nov 11 22:44:07.211172 bazzite kernel: [drm] Failed to add display topology, DTM TA is not initialized. Nov 11 22:44:07.211242 bazzite kernel: Console: switching to colour frame buffer device 240x67 Nov 11 22:44:08.662404 bazzite kernel: audit: type=1305 audit(1794451448.660:4890): op=set audit_pid=0 old=1189 auid=4294967295 ses=4294967295 subj=system_u:system_r:auditd_t:s0 res=1 Nov 11 22:44:08.668295 bazzite kernel: audit: type=1131 audit(1794451448.666:4891): pid=1 uid=0 auid=4294967295 ses=4294967295 subj=system_u:system_r:init_t:s0 msg='unit=auditd comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success' Nov 11 22:44:08.668411 bazzite kernel: audit: type=1131 audit(1794451448.666:4892): pid=1 uid=0 auid=4294967295 ses=4294967295 subj=system_u:system_r:init_t:s0 msg='unit=systemd-tmpfiles-setup comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success' ``` <!-- github-sync:c:6828443665 -->
Owner

@hclaria commented on GitHub · 2026-11-12 16:07 UTC · original

Steam Deck OLED: @camilobt's readback finding tested in play. It holds, and the game is clearly better with it

@camilobt I tested your lead on a second Deck, in play with the camera moving. It is solid: this is the biggest frame-rate improvement I have had on the Deck so far.

Setup. Steam Deck OLED (Van Gogh 0x1435, 16 GB), SteamOS 3.9.5, kernel 7.2.7-valve2, Mesa 26.2.0-devel (RADV). Game built from main at c544828f. Renderer: c544828f with #2789, #2644, #2774, #2731, #2767 and #2649 merged, with and without the test patch below. Switches and memory settings as in my comment above.

The same pair is here. Two ranges of 0x3980 bytes, 0x5000 apart, read in turn (0x113b1c3000 / 0x113b1c8000 in one area). Without the patch, 444 of 3,000 readbacks waited for their write-back, 4.42 ms each.

What I ran. A small test patch around invalidate() in gpu/vk/vk_replay.cpp: RX_VK_READBACK_LATE=newest skips the wait when the range's write-back value is the newest value handed out (v >= fence() on entry), which is your "read right after the submission that writes it". Unlike RX_VK_NO_READBACK_WAIT=1 it keeps wb_pages_note, memory_note_readback and the catch-up, and a range whose writer is an older submission still waits.

One difference from your v2.1.0 numbers: on this build the large ranges (+0x9b040, +0x8b040, +0x1b580) also have the newest submission as their writer (75 of 75 calls each), so the rule lets them through as well. Between 440 and 1,100 of 3,000 readbacks, depending on the area, are then read without their wait, and what is left waits 0.02 to 0.2 ms.

In play, not headless. One session of 12 minutes with the patch (several areas, camera moving), against the session before it on the same renderer without the patch. Windows of 120 presents, grouped by draws a frame:

draws a frame without (windows) RX_VK_READBACK_LATE=newest (windows)
1,000 to 1,500 21.3 fps (3) 29.8 fps (91)
1,500 to 2,000 17.8 fps (16) 21.7 fps (15)
2,000 to 2,400 18.2 fps (34) 18.9 fps (9)
2,400 to 2,700 17.4 fps (10) 19.8 fps (11)
over 2,700 15.2 fps (9) 14.7 fps (8)
  • I saw no exposure flash and no flicker, with the camera moving. No GPU hang, no device lost.
  • The gain is in light and medium scenes. Over 2,000 draws it is small, and over 2,700 there is none: the GPU is the limit there.
  • Four windows under 12 fps against one, all on arriving in an area while pages came back from swap (the memory side of my comment above). I cannot tell yet whether the patch plays a part in that.

Limits. One Deck, one session each, two different routes, few windows in some rows. I do not know what the pair holds either. The texture half of invalidate() (the 1x1 luminance textures of #2462) is not touched.

The finding is yours, so the PR is yours to open if you want one. Take the patch below as a starting point or leave it. I am glad to run any build of yours on this OLED and report the numbers.

The test patch (gpu/vk/vk_replay.cpp, on main c544828f with the six PRs above)
diff --git a/gpu/vk/vk_replay.cpp b/gpu/vk/vk_replay.cpp
index f1e94d13..d98a1c58 100644
--- a/gpu/vk/vk_replay.cpp
+++ b/gpu/vk/vk_replay.cpp
@@ -2470,6 +2470,78 @@ bool readback_wait_value(uint64_t v) {
              (unsigned long long)q_values.load());
     return false;
 }
+/// (deck test) RX_VK_READBACK_LATE=newest[,<hex size>...]: a readback that does not wait for its write-back. `newest`:
+/// the range is read right after the submission that writes it (its value is the newest one handed out), so the game
+/// cannot count on that work being done; a size: the ranges of that many bytes. The CPU reads what guest memory holds.
+/// OoT on a Steam Deck: one pair of 0x3980-byte ranges is 94 % of the readbacks' wait (issue 1000, camilobt)
+bool readback_late(uint64_t size, bool newest) {
+    struct Cfg {
+        bool newest = false;
+        std::vector<uint64_t> sizes;
+    };
+    static const Cfg cfg = [] {
+        Cfg c;
+        const char* e = getenv("RX_VK_READBACK_LATE");
+        for (const char* p = e; p && *p;) {
+            if (!strncmp(p, "newest", 6)) c.newest = true;
+            else if (const uint64_t n = strtoull(p, nullptr, 16)) c.sizes.push_back(n);
+            p = strchr(p, ',');
+            if (p) p++;
+        }
+        if (e) logf("vk: RX_VK_READBACK_LATE=%s: newest %d, %d sizes", e, (int)c.newest, (int)c.sizes.size());
+        return c;
+    }();
+    if (newest && cfg.newest) return true;
+    for (const uint64_t s : cfg.sizes)
+        if (s == size) return true;
+    return false;
+}
+/// (deck test) the readbacks by range, for the log every 3000 calls: how many waited and for how long, how many had the
+/// newest submission as their writer, how many were read without their wait
+struct RbRange {
+    uint64_t gpu, size;
+    int64_t calls, waits, ns, newest, late;
+};
+std::mutex rb_ranges_mu;
+std::vector<RbRange> rb_ranges;
+void rb_range_note(uint64_t gpu, uint64_t size, bool waited, int64_t ns, bool newest, bool late) {
+    std::lock_guard lk(rb_ranges_mu);
+    for (auto& r : rb_ranges)
+        if (r.gpu == gpu && r.size == size) {
+            r.calls++;
+            r.waits += waited;
+            r.ns += ns;
+            r.newest += newest;
+            r.late += late;
+            return;
+        }
+    if (rb_ranges.size() < 256) rb_ranges.push_back({gpu, size, 1, waited, ns, newest, late});
+}
+void rb_ranges_log() {
+    static std::atomic<int> logged{0};
+    std::vector<RbRange> top;
+    {
+        std::lock_guard lk(rb_ranges_mu);
+        top = rb_ranges;
+        rb_ranges.clear();
+    }
+    if (logged++ >= 400) return;
+    std::sort(top.begin(), top.end(), [](const RbRange& a, const RbRange& b) {
+        return a.ns + a.late * 5000000 > b.ns + b.late * 5000000;
+    });
+    int64_t late = 0;
+    for (const auto& r : top) late += r.late;
+    std::string s;
+    for (size_t i = 0; i < top.size() && i < 8; i++) {
+        char b[200];
+        snprintf(b, sizeof b, " | %#llx +%#llx: %lld calls, %lld waited %.1f ms, %lld newest, %lld late",
+                 (unsigned long long)top[i].gpu, (unsigned long long)top[i].size, (long long)top[i].calls,
+                 (long long)top[i].waits, top[i].ns / 1e6, (long long)top[i].newest, (long long)top[i].late);
+        s += b;
+    }
+    logf("vk: readback ranges at present %lld: %d ranges, %lld read late%s", (long long)presents_now, (int)top.size(),
+         (long long)late, s.c_str());
+}
 void invalidate(uint64_t gpu, uint64_t size) {
     static const bool log_inv = env_on("RX_VK_LOG_INVALIDATE");
     static std::atomic<int> logged{0};
@@ -2551,7 +2623,9 @@ void invalidate(uint64_t gpu, uint64_t size) {
                 if (!part_rec.empty()) l_sent = part_rec.rbegin()->second;
                 vkGetSemaphoreCounterValue(dev.device, rec_timeline, &l_done);
             }
-            if (v > completed()) {
+            const bool pending = v > completed(), newest = pending && v >= f0;
+            const bool late = pending && readback_late(size, newest);   // (deck test: read without the wait)
+            if (pending && !late) {
                 int ok = 0;
                 // (and not when a part after it reads guest memory in place, on a card whose pools are not all mirrored
                 // or whose mirrors take pages no capture holds: the game, let go after the first part, would write what
@@ -2579,7 +2653,11 @@ void invalidate(uint64_t gpu, uint64_t size) {
                          (unsigned long long)f0, (unsigned long long)c0, (int)behind0, (unsigned long long)l_part,
                          (unsigned long long)l_last, (unsigned long long)whole, (unsigned long long)l_sent, (unsigned long long)l_done);
             }
+            rb_range_note(gpu, size, w,
+                          w ? std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::steady_clock::now() - w0).count() : 0,
+                          newest, late);
             if (++calls % 3000 == 0) {
+                rb_ranges_log();
                 const int64_t n = waited.exchange(0);
                 logf("vk: readbacks of GPU results: %lld of 3000 waited for their write-back, %.2f ms each; %lld looked at the "
                      "stopped queues first, %lld waited for their submission's last part (guest memory read in place after theirs)",
> [@hclaria](https://github.com/hclaria) commented on GitHub · 2026-11-12 16:07 UTC · [original](https://github.com/NotRexed/Hookshot/issues/1000#issuecomment-6828861552) **Steam Deck OLED: @camilobt's readback finding tested in play. It holds, and the game is clearly better with it** @camilobt I tested your lead on a second Deck, in play with the camera moving. It is solid: this is the biggest frame-rate improvement I have had on the Deck so far. **Setup.** Steam Deck OLED (Van Gogh `0x1435`, 16 GB), SteamOS 3.9.5, kernel 7.2.7-valve2, Mesa 26.2.0-devel (RADV). Game built from main at `c544828f`. Renderer: `c544828f` with #2789, #2644, #2774, #2731, #2767 and #2649 merged, with and without the test patch below. Switches and memory settings as in [my comment above](https://git.magicbean.dev/MagicBeanDev/Hookshot/issues/1000). **The same pair is here.** Two ranges of `0x3980` bytes, `0x5000` apart, read in turn (`0x113b1c3000` / `0x113b1c8000` in one area). Without the patch, 444 of 3,000 readbacks waited for their write-back, 4.42 ms each. **What I ran.** A small test patch around `invalidate()` in `gpu/vk/vk_replay.cpp`: `RX_VK_READBACK_LATE=newest` skips the wait when the range's write-back value is the newest value handed out (`v >= fence()` on entry), which is your "read right after the submission that writes it". Unlike `RX_VK_NO_READBACK_WAIT=1` it keeps `wb_pages_note`, `memory_note_readback` and the catch-up, and a range whose writer is an older submission still waits. One difference from your v2.1.0 numbers: on this build the large ranges (`+0x9b040`, `+0x8b040`, `+0x1b580`) also have the newest submission as their writer (75 of 75 calls each), so the rule lets them through as well. Between 440 and 1,100 of 3,000 readbacks, depending on the area, are then read without their wait, and what is left waits 0.02 to 0.2 ms. **In play, not headless.** One session of 12 minutes with the patch (several areas, camera moving), against the session before it on the same renderer without the patch. Windows of 120 presents, grouped by draws a frame: | draws a frame | without (windows) | `RX_VK_READBACK_LATE=newest` (windows) | |---|---|---| | 1,000 to 1,500 | 21.3 fps (3) | 29.8 fps (91) | | 1,500 to 2,000 | 17.8 fps (16) | 21.7 fps (15) | | 2,000 to 2,400 | 18.2 fps (34) | 18.9 fps (9) | | 2,400 to 2,700 | 17.4 fps (10) | 19.8 fps (11) | | over 2,700 | 15.2 fps (9) | 14.7 fps (8) | - I saw no exposure flash and no flicker, with the camera moving. No GPU hang, no `device lost`. - The gain is in light and medium scenes. Over 2,000 draws it is small, and over 2,700 there is none: the GPU is the limit there. - Four windows under 12 fps against one, all on arriving in an area while pages came back from swap (the memory side of my comment above). I cannot tell yet whether the patch plays a part in that. **Limits.** One Deck, one session each, two different routes, few windows in some rows. I do not know what the pair holds either. The texture half of `invalidate()` (the 1x1 luminance textures of #2462) is not touched. The finding is yours, so the PR is yours to open if you want one. Take the patch below as a starting point or leave it. I am glad to run any build of yours on this OLED and report the numbers. <details><summary>The test patch (gpu/vk/vk_replay.cpp, on main c544828f with the six PRs above)</summary> ```diff diff --git a/gpu/vk/vk_replay.cpp b/gpu/vk/vk_replay.cpp index f1e94d13..d98a1c58 100644 --- a/gpu/vk/vk_replay.cpp +++ b/gpu/vk/vk_replay.cpp @@ -2470,6 +2470,78 @@ bool readback_wait_value(uint64_t v) { (unsigned long long)q_values.load()); return false; } +/// (deck test) RX_VK_READBACK_LATE=newest[,<hex size>...]: a readback that does not wait for its write-back. `newest`: +/// the range is read right after the submission that writes it (its value is the newest one handed out), so the game +/// cannot count on that work being done; a size: the ranges of that many bytes. The CPU reads what guest memory holds. +/// OoT on a Steam Deck: one pair of 0x3980-byte ranges is 94 % of the readbacks' wait (issue 1000, camilobt) +bool readback_late(uint64_t size, bool newest) { + struct Cfg { + bool newest = false; + std::vector<uint64_t> sizes; + }; + static const Cfg cfg = [] { + Cfg c; + const char* e = getenv("RX_VK_READBACK_LATE"); + for (const char* p = e; p && *p;) { + if (!strncmp(p, "newest", 6)) c.newest = true; + else if (const uint64_t n = strtoull(p, nullptr, 16)) c.sizes.push_back(n); + p = strchr(p, ','); + if (p) p++; + } + if (e) logf("vk: RX_VK_READBACK_LATE=%s: newest %d, %d sizes", e, (int)c.newest, (int)c.sizes.size()); + return c; + }(); + if (newest && cfg.newest) return true; + for (const uint64_t s : cfg.sizes) + if (s == size) return true; + return false; +} +/// (deck test) the readbacks by range, for the log every 3000 calls: how many waited and for how long, how many had the +/// newest submission as their writer, how many were read without their wait +struct RbRange { + uint64_t gpu, size; + int64_t calls, waits, ns, newest, late; +}; +std::mutex rb_ranges_mu; +std::vector<RbRange> rb_ranges; +void rb_range_note(uint64_t gpu, uint64_t size, bool waited, int64_t ns, bool newest, bool late) { + std::lock_guard lk(rb_ranges_mu); + for (auto& r : rb_ranges) + if (r.gpu == gpu && r.size == size) { + r.calls++; + r.waits += waited; + r.ns += ns; + r.newest += newest; + r.late += late; + return; + } + if (rb_ranges.size() < 256) rb_ranges.push_back({gpu, size, 1, waited, ns, newest, late}); +} +void rb_ranges_log() { + static std::atomic<int> logged{0}; + std::vector<RbRange> top; + { + std::lock_guard lk(rb_ranges_mu); + top = rb_ranges; + rb_ranges.clear(); + } + if (logged++ >= 400) return; + std::sort(top.begin(), top.end(), [](const RbRange& a, const RbRange& b) { + return a.ns + a.late * 5000000 > b.ns + b.late * 5000000; + }); + int64_t late = 0; + for (const auto& r : top) late += r.late; + std::string s; + for (size_t i = 0; i < top.size() && i < 8; i++) { + char b[200]; + snprintf(b, sizeof b, " | %#llx +%#llx: %lld calls, %lld waited %.1f ms, %lld newest, %lld late", + (unsigned long long)top[i].gpu, (unsigned long long)top[i].size, (long long)top[i].calls, + (long long)top[i].waits, top[i].ns / 1e6, (long long)top[i].newest, (long long)top[i].late); + s += b; + } + logf("vk: readback ranges at present %lld: %d ranges, %lld read late%s", (long long)presents_now, (int)top.size(), + (long long)late, s.c_str()); +} void invalidate(uint64_t gpu, uint64_t size) { static const bool log_inv = env_on("RX_VK_LOG_INVALIDATE"); static std::atomic<int> logged{0}; @@ -2551,7 +2623,9 @@ void invalidate(uint64_t gpu, uint64_t size) { if (!part_rec.empty()) l_sent = part_rec.rbegin()->second; vkGetSemaphoreCounterValue(dev.device, rec_timeline, &l_done); } - if (v > completed()) { + const bool pending = v > completed(), newest = pending && v >= f0; + const bool late = pending && readback_late(size, newest); // (deck test: read without the wait) + if (pending && !late) { int ok = 0; // (and not when a part after it reads guest memory in place, on a card whose pools are not all mirrored // or whose mirrors take pages no capture holds: the game, let go after the first part, would write what @@ -2579,7 +2653,11 @@ void invalidate(uint64_t gpu, uint64_t size) { (unsigned long long)f0, (unsigned long long)c0, (int)behind0, (unsigned long long)l_part, (unsigned long long)l_last, (unsigned long long)whole, (unsigned long long)l_sent, (unsigned long long)l_done); } + rb_range_note(gpu, size, w, + w ? std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::steady_clock::now() - w0).count() : 0, + newest, late); if (++calls % 3000 == 0) { + rb_ranges_log(); const int64_t n = waited.exchange(0); logf("vk: readbacks of GPU results: %lld of 3000 waited for their write-back, %.2f ms each; %lld looked at the " "stopped queues first, %lld waited for their submission's last part (guest memory read in place after theirs)", ``` </details> <!-- github-sync:c:6828861552 -->
Owner

@zackfairccff-bot commented on GitHub · 2026-11-12 16:11 UTC · original

Steam Deck LCD — ~35 configuration tests, v2.1.0 results, memory exhaustion and comparison with v2.0.14

I'm sharing my results after approximately 35 configuration attempts on a Steam Deck LCD, hoping to help other users avoid repeating experiments that haven't produced sustainable gameplay on my device.

Hardware and software

  • Steam Deck LCD, SteamOS / Linux
  • AMD Custom GPU 0405, RADV VANGOGH
  • Vulkan 1.4, driver "0x6801063"
  • 14,798 MiB system RAM reported by Linux
  • 8,422 MiB swap
  • Hookshot v2.1.0, source "e561602e"
  • Logged swapchain: 1280×720
  • Mesh shader mode: Automatic (native)

General configuration tested

One of my main configurations was:

HOS_HANDHELD=1
RX_VK_MESH_OPT=1
RX_VK_PER_QUEUE_FENCES=0
RX_VK_WAIT_GPU=0
RX_VK_BATCH_MAX=4
RX_VK_CHECKPOINTS=1

I also experimented with "RADV_PERFTEST=cswave32", "RX_VK_NO_READBACK_WAIT=1", texture/VRAM limits, LOW_SPEC, mesh fallback and related Vulkan settings across different runs.

These were exploratory tests, not controlled single-variable A/B benchmarks. I cannot attribute every FPS change to a specific flag.

An important detail: one log explicitly reports that "RADV_PERFTEST" was ignored when placed inside "hookshot_env.txt". This variable must be supplied through the process environment to be effective.

Results — v2.1.0

Test| Observations
33| Gameplay fell below 20 FPS and eventually recorded approximately 0.3 FPS
34| Approximately 25 FPS in a lighter scene (~800 draws/frame), followed by major degradation and eventually near-zero FPS
35| Short periods above 20 FPS in lighter scenes; gameplay later around 5–12 FPS

Test 34 was particularly revealing.

The external memory monitor showed:

  • Available RAM dropping to approximately 90–115 MiB
  • Swap reaching 8,422 / 8,422 MiB
  • Severe and sustained FPS deterioration

The game became effectively unplayable. The log ended after window closure, with exit code 0; this should not be described as a confirmed Vulkan device-loss crash.

In test 35, available RAM dropped from 6,283 MB to 1,409 MB. An external safety script terminated the process at its threshold. The script's swap-reading field was broken, so this test does not establish swap exhaustion.

The game also suffered from inconsistent frame pacing and graphics problems, including an incorrectly rendered Link in the equipment menu under some experimental configurations.

Comparison: v2.0.14 versus v2.1.0

I also installed and tested v2.0.14.

On my specific Steam Deck LCD, v2.1.0 gave me a better overall experience than v2.0.14.

Version 2.0.14 displayed Link correctly in the equipment menu, but several other graphics issues returned, and the overall gameplay experience was worse for me.

This is my direct experience, not a controlled same-scene FPS comparison. I'm aware that other Steam Deck LCD users have measured better results on v2.0.14, so I do not claim that v2.1.0 is universally faster.

Regarding camilobt's readback findings

The recent tests showing approximately +16% with "RX_VK_NO_READBACK_WAIT=1" are particularly interesting because I have also experimented with this setting.

However, my runs did not isolate it in a reliable A/B comparison. Moreover, the severe system-memory pressure remained a separate obstacle.

I would be cautious about presenting this flag as a universal fix, given the evidence that some of the skipped readbacks contain changing data.

What I think other Steam Deck users should know

  • Menu FPS and brief peaks of 25–30 FPS do not establish sustained playable performance.
  • Reducing rendering costs may help, but it has not solved my severe memory-pressure problem.
  • Changing many flags simultaneously makes it difficult to determine what actually improved performance.
  • A configuration that avoids a GPU crash may still have missing or incorrect geometry.
  • My results do not prove a memory leak, but the RAM/swap pressure is directly documented.
  • The most valuable next step would be controlled testing of newer Vulkan synchronization fixes and memory-management changes on the Steam Deck LCD.

I'm attaching the original logs from tests 33–35, including memory monitoring for tests 34 and 35.

I hope these results help narrow down the remaining problems and avoid redundant testing.

My current conclusion: Hookshot v2.1.0 can enter gameplay on my Steam Deck LCD and occasionally achieve around 25 FPS in less demanding scenes, but I have not yet reproduced stable, visually correct gameplay at - consistently acceptable FPS.!

Hookshot_SteamDeck_LCD_logs_33_35.zip

> [@zackfairccff-bot](https://github.com/zackfairccff-bot) commented on GitHub · 2026-11-12 16:11 UTC · [original](https://github.com/NotRexed/Hookshot/issues/1000#issuecomment-6828982186) Steam Deck LCD — ~35 configuration tests, v2.1.0 results, memory exhaustion and comparison with v2.0.14 I'm sharing my results after approximately 35 configuration attempts on a Steam Deck LCD, hoping to help other users avoid repeating experiments that haven't produced sustainable gameplay on my device. Hardware and software - Steam Deck LCD, SteamOS / Linux - AMD Custom GPU 0405, RADV VANGOGH - Vulkan 1.4, driver "0x6801063" - 14,798 MiB system RAM reported by Linux - 8,422 MiB swap - Hookshot v2.1.0, source "e561602e" - Logged swapchain: 1280×720 - Mesh shader mode: Automatic (native) General configuration tested One of my main configurations was: HOS_HANDHELD=1 RX_VK_MESH_OPT=1 RX_VK_PER_QUEUE_FENCES=0 RX_VK_WAIT_GPU=0 RX_VK_BATCH_MAX=4 RX_VK_CHECKPOINTS=1 I also experimented with "RADV_PERFTEST=cswave32", "RX_VK_NO_READBACK_WAIT=1", texture/VRAM limits, LOW_SPEC, mesh fallback and related Vulkan settings across different runs. These were exploratory tests, not controlled single-variable A/B benchmarks. I cannot attribute every FPS change to a specific flag. An important detail: one log explicitly reports that "RADV_PERFTEST" was ignored when placed inside "hookshot_env.txt". This variable must be supplied through the process environment to be effective. Results — v2.1.0 Test| Observations 33| Gameplay fell below 20 FPS and eventually recorded approximately 0.3 FPS 34| Approximately 25 FPS in a lighter scene (~800 draws/frame), followed by major degradation and eventually near-zero FPS 35| Short periods above 20 FPS in lighter scenes; gameplay later around 5–12 FPS Test 34 was particularly revealing. The external memory monitor showed: - Available RAM dropping to approximately 90–115 MiB - Swap reaching 8,422 / 8,422 MiB - Severe and sustained FPS deterioration The game became effectively unplayable. The log ended after window closure, with exit code 0; this should not be described as a confirmed Vulkan device-loss crash. In test 35, available RAM dropped from 6,283 MB to 1,409 MB. An external safety script terminated the process at its threshold. The script's swap-reading field was broken, so this test does not establish swap exhaustion. The game also suffered from inconsistent frame pacing and graphics problems, including an incorrectly rendered Link in the equipment menu under some experimental configurations. Comparison: v2.0.14 versus v2.1.0 I also installed and tested v2.0.14. On my specific Steam Deck LCD, v2.1.0 gave me a better overall experience than v2.0.14. Version 2.0.14 displayed Link correctly in the equipment menu, but several other graphics issues returned, and the overall gameplay experience was worse for me. This is my direct experience, not a controlled same-scene FPS comparison. I'm aware that other Steam Deck LCD users have measured better results on v2.0.14, so I do not claim that v2.1.0 is universally faster. Regarding camilobt's readback findings The recent tests showing approximately +16% with "RX_VK_NO_READBACK_WAIT=1" are particularly interesting because I have also experimented with this setting. However, my runs did not isolate it in a reliable A/B comparison. Moreover, the severe system-memory pressure remained a separate obstacle. I would be cautious about presenting this flag as a universal fix, given the evidence that some of the skipped readbacks contain changing data. What I think other Steam Deck users should know - Menu FPS and brief peaks of 25–30 FPS do not establish sustained playable performance. - Reducing rendering costs may help, but it has not solved my severe memory-pressure problem. - Changing many flags simultaneously makes it difficult to determine what actually improved performance. - A configuration that avoids a GPU crash may still have missing or incorrect geometry. - My results do not prove a memory leak, but the RAM/swap pressure is directly documented. - The most valuable next step would be controlled testing of newer Vulkan synchronization fixes and memory-management changes on the Steam Deck LCD. I'm attaching the original logs from tests 33–35, including memory monitoring for tests 34 and 35. I hope these results help narrow down the remaining problems and avoid redundant testing. My current conclusion: Hookshot v2.1.0 can enter gameplay on my Steam Deck LCD and occasionally achieve around 25 FPS in less demanding scenes, but I have not yet reproduced stable, visually correct gameplay at - consistently acceptable FPS.! ![Hookshot_SteamDeck_LCD_logs_33_35.zip](https://github.com/user-attachments/files/34758148/Hookshot_SteamDeck_LCD_logs_33_35.zip) <!-- github-sync:c:6828982186 -->
Owner

@dm451 commented on GitHub · 2026-11-12 18:22 UTC · original

Linux data point on a 16 GB AMD handheld: crashes and stutter in Hyrule Field, plus a frame-rate finding.

Setup: ROG Ally (Z1 Extreme, Radeon 780M), 16 GB with a 4 GB UMA frame buffer (11.6 GB usable), Mesa RADV, kernel 7.2, Hookshot v2.1.0 built from source in a container. My build carries a few local renderer changes; see the caveat at the end.

Crashes (out of memory)

  • With only the distribution's zram swap (5.7 GB), the kernel's OOM killer ended the game in Hyrule Field, 3 times in one session. Texture data compresses poorly, so zram fills up without freeing much.
  • Loading the field, the guest memory peaks around 7.3 GB. On top of that are the renderer (1–2 GB) and the imported GPU pools (2.2–2.7 GB of GTT).
  • A 16 GB swap file behind zram (zram priority 100, file 50) stopped the crashes.

Stutter (what is left)

  • Each load pushes 4–8 GB to swap, and the game stalls when it touches it again. The stalls show in the log as a frame's uploads took N ms; one 5 MB texture took 19.5 s.
  • In a 3-minute scripted walk from the same Hyrule Field save, zram first with the disk only as overflow stalled far less than disk first: lowest fps 24–27 vs 6–18, longest upload stall about 0.2 s vs about 1 s.
  • Did not help:
    • lower RX_VK_IMPORT_HIGH/RX_VK_IMPORT_LOW: there were no idle imports to give back;
    • HOS_MEMORY_MB below 9809: every value from 6656 to 9216 fails at boot ("memory pool without storage", or an indirect call into nothing).

Frame rate: the readback wait in invalidate()

  • On v2.1.0 the exposure-meter readback often arrived mid-replay and waited about 15 ms for the GPU to finish the frame just submitted. That put frames in series with the GPU: about 32 fps in Hyrule Field.
  • With RX_VK_NO_READBACK_WAIT=1 it ran at 42–45 fps. Every-frame captures in Hyrule Field (500 frames) and Kokiri Forest (600) showed no white flashes or other glitches.
  • Caveat: my build submits the replay from a separate ordered submit thread, which can change when the readback lands. I have not reproduced this on stock v2.1.0, and I see main has since reworked the readback settle and added RX_VK_READBACK_WAIT_MS. I'll retest on the next release and report back.
> [@dm451](https://github.com/dm451) commented on GitHub · 2026-11-12 18:22 UTC · [original](https://github.com/NotRexed/Hookshot/issues/1000#issuecomment-6832206211) Linux data point on a 16 GB AMD handheld: crashes and stutter in Hyrule Field, plus a frame-rate finding. **Setup:** ROG Ally (Z1 Extreme, Radeon 780M), 16 GB with a 4 GB UMA frame buffer (11.6 GB usable), Mesa RADV, kernel 7.2, Hookshot v2.1.0 built from source in a container. My build carries a few local renderer changes; see the caveat at the end. **Crashes (out of memory)** - With only the distribution's zram swap (5.7 GB), the kernel's OOM killer ended the game in Hyrule Field, 3 times in one session. Texture data compresses poorly, so zram fills up without freeing much. - Loading the field, the guest memory peaks around 7.3 GB. On top of that are the renderer (1–2 GB) and the imported GPU pools (2.2–2.7 GB of GTT). - A 16 GB swap file **behind** zram (zram priority 100, file 50) stopped the crashes. **Stutter (what is left)** - Each load pushes 4–8 GB to swap, and the game stalls when it touches it again. The stalls show in the log as `a frame's uploads took N ms`; one 5 MB texture took 19.5 s. - In a 3-minute scripted walk from the same Hyrule Field save, zram first with the disk only as overflow stalled far less than disk first: lowest fps 24–27 vs 6–18, longest upload stall about 0.2 s vs about 1 s. - **Did not help:** - lower `RX_VK_IMPORT_HIGH`/`RX_VK_IMPORT_LOW`: there were no idle imports to give back; - `HOS_MEMORY_MB` below 9809: every value from 6656 to 9216 fails at boot ("memory pool without storage", or an indirect call into nothing). **Frame rate: the readback wait in `invalidate()`** - On v2.1.0 the exposure-meter readback often arrived mid-replay and waited about 15 ms for the GPU to finish the frame just submitted. That put frames in series with the GPU: about 32 fps in Hyrule Field. - With `RX_VK_NO_READBACK_WAIT=1` it ran at 42–45 fps. Every-frame captures in Hyrule Field (500 frames) and Kokiri Forest (600) showed no white flashes or other glitches. - **Caveat:** my build submits the replay from a separate ordered submit thread, which can change when the readback lands. I have not reproduced this on stock v2.1.0, and I see `main` has since reworked the readback settle and added `RX_VK_READBACK_WAIT_MS`. I'll retest on the next release and report back. <!-- github-sync:c:6832206211 -->
Commenting is not possible because the repository is archived.
No milestone
No assignees
2 participants
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
MagicBeanDev/Hookshot#1000
No description provided.