Skip to content

fix(vk): handle RDNA 1 wave32 and wave64 shader stages - #1657

Merged
hckrman101 merged 1 commit into
NotRexed:mainfrom
brunobaccari:fix/rdna1-wave32-wave64
Nov 11, 2026
Merged

hckrman101 merged 1 commit into
NotRexed:mainfrom
brunobaccari:fix/rdna1-wave32-wave64

Conversation

@brunobaccari

@brunobaccari brunobaccari commented Nov 10, 2026 •

Copy link
Copy Markdown
Contributor

Unpinned SPIR-V 1.6 stages may use a subgroup wider than the device's default, so the translator must use the supported maximum to preserve 32-lane guest warp boundaries. Quad-only fragment operations must also keep their existing path instead of inheriting AMD's fragment shuffle broadcast workaround.

Rebased onto f8efe057 (current main). Main has since incorporated the stage-specific profiles and AMD fragment workaround from #1507; this PR preserves that implementation and carries only the remaining changes:

  • Use subgroup_max for the unpinned base profile, including devices whose default is 32 but maximum is 64. Existing compute and graphics stage pinning stays intact.
  • Keep quad broadcast emulation separate from the fragment shuffle workaround; INDEX/UP/DOWN/BFLY retain their existing behavior.
  • Include the presence of RX_VK_WARP64 in the cache stamp, since an explicit override can select a different graphics profile even when the base width is unchanged. This invalidates incompatible translated-program caches.
  • Adapt the regression test to the current per-test RUN_ALL_ARGS declarations, with 11 isolated device/override scenarios. Preserve the existing AMD fragment test.

The subgroup rule follows the Vulkan specification. Device selection remains capability-based, covering the RX 5500 XT / RX 5600 XT / RX 5700 XT family without a name allowlist.

Validation for this rebase:

  • Full Windows game-free runner: 320 passed, 8 failed, 25 skipped. Six failures reproduced on clean f8efe057 with the same toolchain: FPX, recorder sync, display startup fixture, precompile compute guard, NUP symlink privileges and missing zstd for bake_ds.
  • The other two failures were transient Windows locks on fixture executables (screensaver and temporal history); both passed on the base and on retest. The two AMD checks and these two checks passed together with --strict on final commit 363038d: 4 passed, 0 failed, 0 skipped.
  • Independent diff review and git diff --check passed. The six rebase conflicts are resolved. No new game binary or hardware run is claimed for this rebased revision.

Related: #1001; also relevant to the broader #996, #1000 and #995 trackers, without claiming to resolve them in full. Memory retention, pipeline scheduling, resolution, image quality and frame generation are outside this PR.

Historical hardware context: an earlier local experimental build showed 20 FPS in Link's house on the RX 5500 XT at 2560x1440, 100% scale, without upscaling or frame generation. The screenshot below is not a benchmark of this rebased revision. RX 5600 XT, RX 5700 XT and Linux/RADV still need hardware testing.

image

Credits: follows Robin Irfan's AMD warp work and butterfly/quad correction, including the Lichii #273 fragment workaround credited to jonmakegames. This PR carries only the remaining subgroup/fragment pieces needed on current main.

Use the actual Vulkan shader stage to choose the guest-warp profile, preserving
32-lane compute pinning and partitioning unpinned 64-lane graphics waves.
Enable the AMD proprietary fragment shuffle broadcast fallback, retain the
quad path and include the subgroup profile in translated-program cache keys.

Based on Robin Irfan's AMD subgroup work in b17e373
and butterfly correction in 5c2004f,
including the fragment workaround attributed there to Lichii NotRexed#273.

Assisted-by: OpenAI Codex
Co-Authored-By: Codex <codex@openai.com>
Co-Authored-By: Robin Irfan <87516521+rakefire-impala@users.noreply.github.com>
@brunobaccari
brunobaccari force-pushed the fix/rdna1-wave32-wave64 branch from afa5ea9 to 363038d Compare November 11, 2026 01:07
@brunobaccari

Copy link
Copy Markdown
Contributor Author

@hckrman101 rebased

@hckrman101
hckrman101 merged commit fc8c858 into NotRexed:main Nov 11, 2026
4 of 11 checks passed
NotRexed pushed a commit that referenced this pull request Nov 11, 2026
🤖 I have created a release *beep* *boop*
---


##
[2.1.0-rc.2](v2.1.0-rc.1...v2.1.0-rc.2)
(2026-11-11)


### Features

* **vk:** GPU- and settings-independent pipeline state list (HKSTATE2)
([#2046](#2046))
([667ba79](667ba79))


### Bug Fixes

* **vk:** handle RDNA 1 wave32 and wave64 shader stages
([#1657](#1657))
([fc8c858](fc8c858))


### Build System

* **release:** a contributed pipeline list from an AMD card with FSR 4,
1273 pipelines
([#2044](#2044))
([f8efe05](f8efe05))


### Continuous Integration

* **release:** list every commit type in the changelog
([#2055](#2055))
([737e4f5](737e4f5))


### Tests

* **display:** the startup fixture stubs driver_cache_room (main is red
since [#2033](#2033))
([#2051](#2051))
([d47206e](d47206e))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
madebyjordan added a commit to madebyjordan/Longshot that referenced this pull request Nov 11, 2026
48 commits of Hookshot's, by hand (docs/merging-hookshot.md): its release candidates (release-please, Promote, the nightly),
the update track, the pipeline state list in separate sources and its version 2 records, one start-up bar. 17 files clashed:

.github/workflows/release.yml: Hookshot's new workflow, still started by hand only (dev's side: no push starts it). With no
push, release-please opens no release pull request and makes no release candidate; by hand it is now Promote, which stops
when there is no published release candidate. Its publish job names LongshotBuilder.exe.
.github/workflows/windows-builder.yml, linux-appimage.yml: Hookshot's new jobs (called by the Release workflow, the nightly,
SHA256SUMS, the build provenance) with Longshot's file names, and the checks still on pushes to dev. Nothing is published
that was not before: the Windows release job stays on only with vars.CI_RELEASE_WINDOWS = 'true' (as it was here; Hookshot
made it on unless 'false'), the Linux one only with vars.CI_RELEASE_LINUX = 'true', and the nightly of a push to main is
behind a new switch, vars.CI_RELEASE_NIGHTLY = 'true', in both (without it the setup of a run that is no release installs
the latest release, as before, not a nightly that is not there).
CHANGELOG.md: kept dev's (Longshot's releases; nx2/version.py reads its unreleased heading). Hookshot's, which release-please
now writes, is kept as docs/hookshot-changelog.md, and rule 4 says so.
readme.md: kept dev's. docs/hookshot-readme.md is brought up to Hookshot's readme at 6cecdd1, links as seen from docs/.
docs/development.md: Hookshot's new text on the list's sources, with Longshot's paragraph on lists/pipeline_states.bin.
nx2/make_game.py, tests/test_pipeline_states.py: Hookshot's ship_state_list (the sources in assets/pipeline_states/ merged).
Longshot's lists/pipeline_states.bin still ships in the merged list's place when the source has one; the test checks both.
Hookshot's sources (12800 pipelines, among them 1273 from this PC, Hookshot NotRexed#2044) hold 1646 of its 2648.
gpu/vk/vk_draw.cpp: Hookshot's version 2 state list. The player's own list and the version 1 one kept beside it go through
cache_path() (RX_VK_CACHE_DIR), in state_open_locked, state_list_prepare and prepare_guess; read-only
(RX_VK_CACHE_READONLY), state_open_locked neither moves a version 1 list aside nor starts a new one. state_list_noted is
set as before, and prepare_guess leaves the predicted pipelines out of the one bar's total when a state list will leave
them out. predict_run takes Hookshot's thread count and still counts its workers (prep_workers_n).
gpu/vk/vk_main.cpp: Hookshot's one bar (StartupState::whole) and Longshot's diagnostics lines, both.
gpu/vk/vk_menu.cpp: Hookshot's version line that shrinks to fit, saying Longshot.
host/hos_update.c, builder/linux/linux_update.py, builder/setup/setup.c: Hookshot's update tracks, asking Longshot's
releases (madebyjordan/longshot) under Longshot's name. The setup keeps --engine --tag and the 127.0.0.1 exception.
builder/HookshotBuilder/Updater.cs: Hookshot's tracks (TrackOf, Newer, Target, LatestTag(track)) on Longshot's repository,
beside the launcher's list of releases, now ReleaseList() (Hookshot's Releases is the API's address). UpdateFolder's
"exact" is Hookshot's "named": the release its tag names.
builder/HookshotBuilder/MainWindow.xaml: kept dev's (the launcher's window; Hookshot's change was to the installer page it
no longer has). Hookshot's Update track choice is a row of the menu's build options, under a heading of its own (Updates).
builder/HookshotBuilder/MainWindow.xaml.cs: Hookshot's Track, TrackChanged and OlderOk on the build's own screen
(RefreshMode, StartBuild); its old launch page's ShowLauncher and buttons are not brought back. Launcher.cs: back from a
build's choices, the launcher's latest is the latest release again, whatever track was asked for there.

Not in a clash, by hand: scripts/release_files.sh and scripts/release_upload.sh name LongshotBuilder.exe and
Longshot-*-Windows-x64.zip; the Windows workflow's provenance step names them too; linux_update.py's list_url asks
Longshot's releases.

Tests adjusted to Longshot's code: test_update_tracks.py expects Longshot's addresses; test_pipeline_notes_open.py expects
the version 1 list through cache_path(). docs/merging-hookshot.md and lists/README.md say which pipeline list ships.

Checked on Windows: python -I -B tests/run_all.py fails on the six checks that fail on Hookshot's main (6cecdd1) here
(test_nup_paths, test_nup_read_name, test_fpx_sticky, test_precompile_compute_guard, test_recorder_sync, test_make_game_ngx)
and no other (326 pass, 27 skipped); scripts/build-vk.ps1 builds and links hookshot_vk.dll, in a work folder of its own;
the builder compiles with no warnings; tests/builder_launcher (27 + 25 + 27 checks) and its rig pass. The workflows were
not run. Not played yet: the first start after it prepares every shader again (Hookshot's translator stamp changed, and
its AMD subgroup sizes with it, NotRexed#1657), on one bar.

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant