[AMD RX 9070 XT] Bushes and grass disappear up close (mesh stage), visible from far away #696
Labels
No labels
accessibility
autorelease: pending
autorelease: tagged
bug
dependencies
documentation
duplicate
enhancement
github_actions
good first issue
help wanted
invalid
question
testing wanted
wontfix
No milestone
No assignees
1 participant
Due date
No due date set.
Dependencies
No dependencies set
Reference
MagicBeanDev/Hookshot#696
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Builder version
v2.0.2
How you built
Hookshot Builder app (Windows)
Game files given to it
A .nup
The error
Visual Studio or Build Tools version, and Windows SDK version
No response
Operating system and free space on the output drive
Windows 11 PRO, 800 GB Free
Before you send it
Same symptom on AMD Radeon RX 6650 XT (Vulkan 1.4, driver 0x800161), Windows 11, hookshot v2.0.2 (source 998ef8f9), 1600x900. Bushes/grass are visible from far away but disappear as I get close; only branches remain, the leaves vanish.
My logs (3 sessions) show the same
storage buffer NOT bound (reads zeros)for stage 7 atc5+0x60,c5+0x1d0andc5+0x228, e.g. programs 68642bb810ee3e7c, 6b4dea601798c255, 51183fe750d5d0c8, 4f0c0b40ab3a32cd, 739acd678ae08655, d905f52b7517c681. The "addresses" look like floats (0x3f822b64, 0x44ca2618), so this matches the guess that float constants are being read as buffer addresses.Other things in my logs: this GPU does not sample ASTC (decoded on upload), and a
device-lost-fixbuild reports ~31 "does not lower" shader failures. I'll add a video of the issue below. Happy to test builds or env vars.Analysis created with Claude; it may contain errors
https://youtu.be/YXcEmNwKbms
Possible lead for the "NOT bound (reads zeros)" foliage bug. zortos293/Lichii#410 (merged 2026-11-07, "bind loaded pointers that compete with a paired cbuf pointer (OoT near foliage)") changes
src/shader_recompiler/ir_opt/global_memory_to_storage_buffer_pass.cpp. Per its description,CollectStorageBufferspaired a global access with a cbuf pointer too early; when the address is really a pointer loaded through that cbuf, the loaded path was read out of bounds as zeros, so near-leaf passes got all-zero records and trees lost their leaves within ~20 m. That matches the symptom here (far foliage fine, near leaves gone) and the file mentioned in #667.It is also listed in Frizti/Fritchii#8. I have not applied it to Hookshot or checked that Hookshot's pass has the same structure, so this is only a lead, not a confirmed cause.
Analysis created with Claude; it may contain errors.
Same glowing stems here on Linux/RADV (RX 9070 XT, Mesa 26.2.4, Bazzite; current main plus #448/#487/#593/#423), so it isn't OS- or driver-specific. I spent a while narrowing it down; posting what I found in case it saves someone time.
The five
storage buffer NOT boundprograms are not the cause. Those come from the unbiased storage-buffer search walking down an index (through a select's condition) to a flags word in c5 (*c0[0x780] + index*16, the pointer loaded from memory). I changed that search to follow only additions; the NOT-bound lines went away, the glow did not.What draws the stems (found by hiding programs live with
RX_VK_SKIP_FILE):5ba7cf23d6857836(mesh) is a depth pre-pass: colour write mask 0, depth write on; its fragment is an alpha test that writes white.89ca750f9852b7ca(mesh) is the colour pass over the same indirect draws, depth test EQUAL. Hiding it alone turns the stems plain white.What the glow is: the stem's own colour, far too bright, with bloom. It follows the stems' world orientation (not the camera) and changes as the wind moves them; a purple flower nearby held glowing/normal for about a second at a time. With
RX_VK_MIRROR=1the wrong colours change (green and orange/red patches), so it depends on how memory reaches the GPU.Where
89ca750f's fragment gets its light: per-object light lists — indices atc0[0x510](offset fromc3[0x950]), 96-byte records atc0[0x520](+ index*96 + 32, four 128-bit reads), header throughc3[0x948].c0[0x520]is the light buffer from Fritchii's fixes in3858629(water textures from light records' handles; light probes ~130 MB past the pointer), so I suspect one of those two classes: a texture handle taken from a light record, or light/probe data read past its binding.Ruled out (one at a time): undefined mesh output components, depth-EQUAL precision (EQUAL → LEQUAL with bias), NaN (applied the NaN guard to mesh fragments too), all of
89ca750f's memory accesses left to the run-time search,RX_VK_PARALLELoff,RX_VK_KEEP_FINALIZED_MB=0(#593),RX_VK_NO_MESH_FIRSTS=1, skipped draws.Happy to test on RADV.
Tracked in #994, follow there. That issue collects every report of floating trees and missing or vanishing vegetation, and this one is linked from it with its GPU, version and log details. It is a known issue in v2.0.6 and not fixed yet. The bright stems are fixed in v2.0.6 (PR #759); the plants vanishing up close are what the tracker follows. If it still happens on v2.0.6 (https://github.com/NotRexed/Hookshot/releases/tag/v2.0.6; Update next to Play in the launcher), please add a comment there with your
hookshot_log.txt.