Repository navigation
Conversation
Dead-code removal could drop the coordinate inputs of an image load while another result was still in use. Reuse the existing liveness test before walking into a producer and cover both channel orders with a synthetic Ampere regression. The rebuilt translator passes 83 targeted checks. On the same Kokiri Forest route, replacing just the two retranslated shaders reduced frame-to-frame color variation in the sampled grass and moss.
…#1299, seedds#1300, seedds#1343); chain lock and header regenerated Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016qteK29T18U8p1c9LsVY8g
|
This also fixes Ocarina's title movie. We found the same
Drafted with Claude; reviewed by me. |
|
Tested on a real device: the foliage jitter is gone. Ocarina of Time Without this PR, grass and plants in Kokiri Forest twitched constantly, as if in heavy wind. With it they are calm. Full report in #1265. Drafted with Claude; reviewed by me. |
Test report: Ocarina of Time (v131072 NUP), 2 hours on an M4 Pro with 48 GB — three crash types (one reproducible with the Ocarina), ground fog, Deku Tree floorsA report from a player, not a developer. About 2 hours of play, from the start until leaving Kokiri Forest. Logs from Hardware and software
Game
What was builtstan69b's
Generated-file conflicts kept oot-clean's side, then the translator was rebuilt as in stan69b's
The 2-hour session ran on this build plus one experimental host change (a What works well
Crash 1:
|
…er by preserving live shader inputs
…, seedds#1410, seedds#1411, seedds#1412, seedds#1413, seedds#1414, seedds#1329 on top of main's translator fixes): chain c9cf9613657e Publishes Ryujinx.Graphics.Shader, Ryujinx.Common, Spv.Generator and dmsh_xlate (osx-arm64, framework-dependent, the universal launcher kept) from the merged source; the PRs' own binaries were built without this tree's translator changes (float atomic adds, F2IP, the growing raw pool table). The lock and dmsh_chain.h are written again. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Tested on a real device (M4 Pro 14-core CPU / 20-core GPU, 48 GB, Ocarina of Time v131072, Mac app): the foliage jitter is gone. Before, every plant moved as if in constant heavy wind. Full report in #1265. Drafted with Claude; reviewed by me. |
|
Thank you. You found the same root cause as I did: dead-code removal dropping a coordinate of a multi-result instruction. The fix is on main (landed on main in b1d7c70 and 6121fd7), so I'm closing this. Final checks on the rebased tree (full shader build, walks, regression) are still running, so please report anything you see. |
) replaces the pull request heads Upstream landed Ocarina of Time in main (chain adec7d81d970: "holds 60 fps in Kokiri Forest, 4 GB less") and closed the pull requests it folded in, with reworded and partly different code. Mixing a pull request head with its landed version hunk by hunk silently broke things (two GlobalToStorage tables, a duplicate AF2ip, two mtk_pso definitions), so the rule here is one version per feature: - Pull requests upstream closed (seedds#1299, seedds#1300, seedds#1312, seedds#1343, seedds#1345, seedds#1353, seedds#1354, seedds#1359, seedds#1360, seedds#1373, seedds#1428, seedds#1430, seedds#1434): their hunks are taken out of our side before the three-way merge, so upstream's landed version stands alone. Gone with them: bindless pool table patching (reg_bump), the ghost table's per-submission hold, the growing raw pool table and its write-log sizing, seedds#1428's pool_buf spares (upstream's pool_table_take is the same idea), the ixc-based indirect mesh draw (upstream uses mdx), and their tests (t_pool_table, t_mesh_indirect, t_gmem_raw, finalized_bindless_pool, test_bnsh_nvn2, test_ndve). - Open pull requests that upstream's landing supersedes: seedds#1394 (upstream's mtl_pool_addressed) and seedds#1393 pool_skip_retired (upstream's budgeted pool walk; the profile does not use it) are dropped with their tests and docs. seedds#1368's mesh pipeline prewarm is dropped too: upstream kept the background build in nvn_geometry.inc, and the prewarm's mtk_build / mtk_claim / g_warm_mps went with it. - Kept, as upstream does not have them: NXForge's own features (GPU watchdog, present filters and anti-aliasing, aniso floor, quick settings, pipeline archive compaction, upload breakdown, memory report lines) and the still open pull requests seedds#1304, seedds#1305, seedds#1308, seedds#1320, seedds#1331, seedds#1332, seedds#1355, seedds#1356, seedds#1369, seedds#1376, seedds#1377, seedds#1379, seedds#1382, seedds#1390, seedds#1391, seedds#1392, seedds#1414, seedds#1420, seedds#1436, seedds#1439, seedds#1446, seedds#1453. - Combined where both sides changed the same lines: GW_N 1 << 16 with seedds#1320's wide-write intervals (GW_PAGES = SBW_WPAGES, 128 slots), the CPU upload log with upstream's linear upload route, arch_open_end before the compaction limit, cbn_prog in geo_gs_one (seedds#1382). - Translator: upstream's sources and binaries, plus seedds#1414's InstEmitAmpereMem diff and the LDSM SubgroupBarrier in InstEmitAmpereTensor.cs. The binaries and dmsh_chain.lock are upstream's until the Mac rebuilds them (dotnet publish, tool_lock --update-lock, dmsh_chain --header); dmsh_chain.h is regenerated for now. - RED_ONCE keys: upstream took 153 and 154, so the present anti-aliasing lines move to 156 and 157 and seedds#1420's packaged-entry line to 158 (array 159). - Host: hle_net.c and t_net_eventfd.c are upstream's (its eventfd poll waits out the whole timeout, which our 5d7920c fixed another way). - Kept ours: dm/tools/romfs_image.py and its test, so the 26 GB RomFS image is not packed again. dm/tools tests on Linux: same failures as on 875449e (Linux-only quirks), plus test_nlg4 and test_dmsh_pool_arrays, which fail on upstream main too. Not yet built on the Mac. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016qteK29T18U8p1c9LsVY8g
What and why
Ryujinx's dead-code removal could detach the inputs of a multi-result instruction when only one of its results lost its last use. If another result remained live, the instruction survived but its coordinate calculations could be removed. This produced image reads with uninitialized coordinates in two compute shaders used by Ocarina of Time's foliage simulation.
Use the existing
IsUnusedcheck before recursing into a producer. It checks every destination and preserves instructions with side effects. Cleanup still recurses into fully dead producers.Checked
7249ee9, a synthetic Ampere image load loses its coordinates with the original bundled translator in both tested channel orders. The patched bundled translator passes both, along with the fully dead load and atomic controls. All 83 targeted checks passed, including the Ampere translation tests, AnyCPU and chain-header checks. The tool lock matches the bundled tools.7249ee9; a full game run and multi-game regression on that upstream base, and comparison with Switch 2, remain pending.Docs
Updated the shader reference entry and regenerated the symptom index. Regenerated the shader tool lock and chain header for the rebuilt translator.