fix(vk): release pages ending at a GPU import boundary #469

Open
zeldaootr wants to merge 4 commits from zeldaootr/Longshot:import-exclusive-end into main
Contributor

Type: fix · Risk: low · Tested on: Steam Deck OLED, SteamOS 3.9.5, RADV; Linux x86-64 (game-free) · Needs: Windows, any GPU

Why

A free that ends exactly where a live GPU import starts keeps the entire range backed: the renderer counts the touching import as an overlap. This happens during the Kokiri Forest to Hyrule Field transition on the Steam Deck (twice per transition in an instrumented run, with 8 KiB and 64 KiB frees).

How to reproduce

Seen on: Steam Deck OLED (RADV), an instrumented RC3 renderer at the Field transition; Linux x86-64, game-free
Settings and switches: defaults
Steps: on main aa95d35f with this PR's test added (d30476db), run python -I -B tests/test_guest_imported.py --cxx g++: it asks about [0x1000, 0x2000) with an import starting at 0x2000
Expected: not imported: the ranges only touch
Actual: Assertion '!memory_guest_imported(0x1000, 0x2000)' failed

What changed

The ownership check now treats a freed range as half-open, so an import that starts exactly where the free ends no longer keeps the freed pages backed.

  • vk memory: memory_guest_imported() in gpu/vk/vk_memory.cpp starts its backwards search at imported.lower_bound(hi) for the half-open range [lo, hi), so an import starting at hi no longer counts as an overlap; an empty range answers 0 before the pool lock is taken.
  • tests: tests/test_guest_imported.py (new) cuts the function out of the source and checks both touching boundaries and true overlaps.
  • docs/tested: the earlier instrumented-backport runs, and the Deck runs of this branch against main (the four main records are the same files in #468 and #472: one shared main arm, which merges as one).

Measurements

Verdict: passes: no change in fps, frame times or memory on a Steam Deck at the Field transition (20.60 against 20.56 fps, inside the run-to-run spread; no fault in 4 runs each): the fix frees too little there to show; the game-free test fails on main and passes here.

Hardware: Steam Deck OLED, AMD Custom APU 0932 (RADV VANGOGH), Mesa 26.2.0-devel (git-5c65d4fc31), 16 GB shared, SteamOS 3.9.5 (kernel 7.2.7-valve2)
Scene: Hyrule Field (child), arriving from Kokiri Forest by teleport to the Lost Woods bridge entrance, day; 1280×720 output, render resolution option 4, no frame generation, precompile off, 1536 MiB texture budget, 256 MiB mirror budget, headless
Method: one scripts/dev_packs.py base at main 9c9d69ed (release optimisation, x86-64-v3); main is the base's runtime with no pack, this PR a renderer pack (longshot_vk.so only; the host binary is byte-identical). One warm-up pass of main made the caches, copied fresh into every run. Each run: child Kokiri save settled 20 s, teleport to HyruleField_Child, 20 s warm-up, 45 s stationary sample. Four rounds in one session, interleaved main, #468, #469, #472; medians of the 4 runs per arm. FPS and present intervals from HOS_PRESENT_TRACE in the 45 s window; GPU clock and busy from sysfs every 0.5 s; guest memory backing from the guest memfd's allocated blocks (st_blocks).
Rebased since: the branch is now on main aa95d35f, the fix at 075e9c24 (the same change as bed7d855, which 76382425 carries, git patch-id). Not measured again on aa95d35f. Since 9c9d69ed main changed gpu/vk/vk_memory.cpp only in how the mirror budget is set (#735), not in memory_guest_imported(); everything else it changed both arms would take alike, so these numbers still compare the change. The game-free test was run again on aa95d35f (below).
How to reproduce: build a base at main and a pack of this branch (python -I scripts/dev_packs.py base|pack|rt, docs/development.md "Testing a change against a base"), start each runtime with HOS_CONTROL and a child save at Kokiri spawn, then longshot_ctl.py teleport HyruleField_Child, wait 20 s and sample 45 s.

Before: main @ 9c9d69ed After: this PR @ 76382425
FPS, Field sample (median of 4) 20.60 20.56
Present interval median (ms) 48.56 48.63
Present interval p95 (ms) 51.79 51.76
GPU clock median (MHz) / busy 1040 / 99% 1040 / 97%
Guest memory backed before the teleport (MiB) 5431 5430
Guest memory backed at sample end (MiB) 5867 5860
Lowest available memory (MiB) 2185 1950
Device faults, run memory guard, crashes none in 4 runs none in 4 runs

Per run, FPS: main 20.56, 20.54, 20.69, 20.64; this PR 20.59, 20.66, 20.52, 20.38. Guest memory backed at the end: main 5861-5909 MiB, this PR 5832-5900 MiB. Both differences are inside the run-to-run spread: at this scene the fix frees too little to show in the backing or the frame rate. That matches the earlier instrumented runs (below), which saw the boundary hit twice per transition, with 8 KiB and 64 KiB frees: the fix is for correctness, not for a measurable saving here.

Earlier, an instrumented v3.0.0-rc.3 renderer (SHA-256 prefix ce5646666a7e) with a test switch choosing the old or new decision (RX_TEST_IMPORT_EXCLUSIVE_END, not in this PR), one run each on the same Deck: 20.09 FPS old, 20.33 FPS new, the boundary hit twice per transition (docs/tested/2026-11-14-field-renderer-zeldaootr-import-old.md, -import-fixed.md). On a Linux sparse shared memfd, freeing a 64 MiB range next to a simulated live import left 64 MiB backed with the old predicate and released it with the fix (three densities, three repeats, adjacent and one-page-overlap controls, 36 trials).

main-r2:   [hos host] longshot v3.0.0-rc.3-75-g9c9d69ed (source 6b76ded3)
           vk: 5160 presents, 20.6 fps; a frame: 1176 draws (0 skipped), 145 dispatches, 155 passes, ...
           vk: imports: 48 live (2016 MB), 0 retired still imported (0 MB), 13 retired given back (1056 MB)
pr469-r2:  renderer v3.0.0-rc.3-78-g76382425, host as main's
           vk: 5040 presents, 20.9 fps; a frame: 1185 draws (0 skipped), 145 dispatches, 154 passes, ...
           vk: imports: 52 live (1984 MB), 0 retired still imported (0 MB), 11 retired given back (816 MB)

$ python3 -I -B tests/test_guest_imported.py --cxx g++      (at d30476db, main aa95d35f plus the test; rounds 1 and 2)
check.exe: check.cpp:38: main()::<lambda()>: Assertion `!memory_guest_imported(0x1000, 0x2000)' failed.
$ python3 -I -B tests/test_guest_imported.py --cxx g++      (at afd5ea15; rounds 1 and 2)
(passes, exit 0)

Flags and settings

None

Testing

Tested: On the Steam Deck OLED above, 4 runs of this PR interleaved with 4 of main through the Kokiri Forest to Hyrule Field transition: Field reached every time (status map HyruleField_Child, 918-930 presents in each 45 s sample), no device fault, no VK_ERROR, no crash record, the run's low-memory guard never tripped, every run exited 0. In one run of this PR (round 3) the renderer gave back 16 idle imports at its system-heap limit (vk: system heap 2648 of 3072 MB: 16 idle imports given back (352 MB)); main's runs did not log that line, and the run's frame rate was not affected (20.52 FPS). Game-free, on this branch rebased onto main aa95d35f: tests/test_guest_imported.py fails at the test-only commit d30476db and passes at afd5ea15, twice each, alternating, and under tests/run_all.py with g++ 13.3 and with clang 23.1.5 at both commits; the 43 checks that read gpu/vk/vk_memory.cpp or the new test pass at the tip, 43 of 43. With #468 and #472, as rebased, the branch merges cleanly (git merge-tree).

Not tested: Unique pages reclaimed during gameplay (the backing measured includes everything the game holds); Windows and other GPUs and drivers in the game.

Must be tested:

  • Windows 10/11, any GPU: build this PR (with llvm-mingw), load a child save in Kokiri Forest, go to Hyrule Field, stay 1-2 minutes and back, expecting no device lost, no VK_ERROR, no crash record in longshot_log.txt and fps like main at the same spot (by hand, test request T-S2R3: post the fps, any vk: system heap lines and the GPU, driver and OS)

Risks

What could break: a free that only touches a live import is now released where it was kept; the existing synchronization between the ownership check and the host discard remains. Review alongside the pending-import lifetime fix, #468.

Turning it off: revert the fix commit

Compatibility: Nothing changes

Issues

None filed. Overlaps #468 (the same empty-range guard; the two merge cleanly) and #431 (the 1 GiB stop two lines below).

Checklist

Everyone

  • One topic.
  • The title is a Conventional Commit (type(scope): description) of the status line's type.
  • Why gives the reason plainly and links the issues that fit (the tracker searched).
  • Measurements has a verdict, or one line saying why there is nothing to measure.
  • Testing names what was tested, what wasn't, and what must still be tested, where and how.
  • Rebased on current main. Onto main aa95d35f, no conflict; the four commits are the same changes as before (git patch-id).
  • python -I -B tests/run_all.py passes (any failure that also fails on main is named). The full suite on main aa95d35f (Linux, g++ 13.3, the Vulkan headers set): 528 passed, 15 failed, 50 skipped; on this branch the new test and the 43 checks that read the changed files ran, with no failure that main does not have (see Testing). The 15 that fail on main: test_appimage_player_build, test_bake_portability, test_cpm_discovery, test_crash_dialog, test_env_on, test_lift_cache, test_lift_cleanup_error, test_make_game_cache, test_mods_size_table, test_options_budget_once, test_pipeline_tour, test_readback_late, test_vk_pgo, test_walk_key and nx2/test_texture_init_barrier.py.
  • No game files, dumps, build output or generated files.
  • third_party/ untouched (a new folder with a PROVENANCE.md instead).
  • The license is OK: GPL-3.0-or-later, nothing incompatible and nothing decompiled.

When it applies

  • AI assistance recorded with Assisted-by: / Co-Authored-By: trailers.
  • Numbers from the same PC, scene and settings, at least 2 interleaved runs each, the median reported.
  • A file in docs/tested/ for each new measured run (format in docs/tested-configurations.md).
  • A game-free test added for the fix, failing on main and passing here.
  • Host code builds on both Windows (llvm-mingw) and Linux, with UTF-8 paths. Before the rebase, built on Linux for both: RX_VK_ONLY=1 RX_RELEASE=1 RX_TARGET=windows with llvm-mingw 20261104 linked longshot_vk.dll, and the same without RX_TARGET linked longshot_vk.so; after the rebase, gpu/vk/vk_memory.cpp at afd5ea15 checked whole (-fsyntax-only -Wall -Wextra) with clang 23.1.5 for Linux and llvm-mingw 20261104 for Windows: the same diagnostics as main aa95d35f's (54 and 43), none new. The diff has no path handling.
**Type:** fix · **Risk:** low · **Tested on:** Steam Deck OLED, SteamOS 3.9.5, RADV; Linux x86-64 (game-free) · **Needs:** Windows, any GPU ## Why A free that ends exactly where a live GPU import starts keeps the entire range backed: the renderer counts the touching import as an overlap. This happens during the Kokiri Forest to Hyrule Field transition on the Steam Deck (twice per transition in an instrumented run, with 8 KiB and 64 KiB frees). ## How to reproduce **Seen on:** Steam Deck OLED (RADV), an instrumented RC3 renderer at the Field transition; Linux x86-64, game-free **Settings and switches:** defaults **Steps:** on `main` aa95d35f with this PR's test added (d30476db), run `python -I -B tests/test_guest_imported.py --cxx g++`: it asks about `[0x1000, 0x2000)` with an import starting at `0x2000` **Expected:** not imported: the ranges only touch **Actual:** `Assertion '!memory_guest_imported(0x1000, 0x2000)' failed` ## What changed The ownership check now treats a freed range as half-open, so an import that starts exactly where the free ends no longer keeps the freed pages backed. - vk memory: `memory_guest_imported()` in `gpu/vk/vk_memory.cpp` starts its backwards search at `imported.lower_bound(hi)` for the half-open range [lo, hi), so an import starting at `hi` no longer counts as an overlap; an empty range answers 0 before the pool lock is taken. - tests: `tests/test_guest_imported.py` (new) cuts the function out of the source and checks both touching boundaries and true overlaps. - docs/tested: the earlier instrumented-backport runs, and the Deck runs of this branch against main (the four main records are the same files in https://git.magicbean.dev/MagicBeanDev/Longshot/pulls/468 and https://git.magicbean.dev/MagicBeanDev/Longshot/pulls/472: one shared main arm, which merges as one). ## Measurements **Verdict:** passes: no change in fps, frame times or memory on a Steam Deck at the Field transition (20.60 against 20.56 fps, inside the run-to-run spread; no fault in 4 runs each): the fix frees too little there to show; the game-free test fails on `main` and passes here. Hardware: Steam Deck OLED, AMD Custom APU 0932 (RADV VANGOGH), Mesa 26.2.0-devel (git-5c65d4fc31), 16 GB shared, SteamOS 3.9.5 (kernel 7.2.7-valve2) Scene: Hyrule Field (child), arriving from Kokiri Forest by teleport to the Lost Woods bridge entrance, day; 1280×720 output, render resolution option 4, no frame generation, precompile off, 1536 MiB texture budget, 256 MiB mirror budget, headless Method: one `scripts/dev_packs.py` base at main 9c9d69ed (release optimisation, x86-64-v3); main is the base's runtime with no pack, this PR a renderer pack (`longshot_vk.so` only; the host binary is byte-identical). One warm-up pass of main made the caches, copied fresh into every run. Each run: child Kokiri save settled 20 s, teleport to HyruleField_Child, 20 s warm-up, 45 s stationary sample. Four rounds in one session, interleaved main, #468, #469, #472; medians of the 4 runs per arm. FPS and present intervals from `HOS_PRESENT_TRACE` in the 45 s window; GPU clock and busy from sysfs every 0.5 s; guest memory backing from the guest memfd's allocated blocks (`st_blocks`). Rebased since: the branch is now on main aa95d35f, the fix at 075e9c24 (the same change as bed7d855, which 76382425 carries, `git patch-id`). Not measured again on aa95d35f. Since 9c9d69ed `main` changed `gpu/vk/vk_memory.cpp` only in how the mirror budget is set (#735), not in `memory_guest_imported()`; everything else it changed both arms would take alike, so these numbers still compare the change. The game-free test was run again on aa95d35f (below). How to reproduce: build a base at main and a pack of this branch (`python -I scripts/dev_packs.py base|pack|rt`, docs/development.md "Testing a change against a base"), start each runtime with `HOS_CONTROL` and a child save at Kokiri spawn, then `longshot_ctl.py teleport HyruleField_Child`, wait 20 s and sample 45 s. | | Before: main @ 9c9d69ed | After: this PR @ 76382425 | |---|---|---| | FPS, Field sample (median of 4) | 20.60 | 20.56 | | Present interval median (ms) | 48.56 | 48.63 | | Present interval p95 (ms) | 51.79 | 51.76 | | GPU clock median (MHz) / busy | 1040 / 99% | 1040 / 97% | | Guest memory backed before the teleport (MiB) | 5431 | 5430 | | Guest memory backed at sample end (MiB) | 5867 | 5860 | | Lowest available memory (MiB) | 2185 | 1950 | | Device faults, run memory guard, crashes | none in 4 runs | none in 4 runs | Per run, FPS: main 20.56, 20.54, 20.69, 20.64; this PR 20.59, 20.66, 20.52, 20.38. Guest memory backed at the end: main 5861-5909 MiB, this PR 5832-5900 MiB. Both differences are inside the run-to-run spread: at this scene the fix frees too little to show in the backing or the frame rate. That matches the earlier instrumented runs (below), which saw the boundary hit twice per transition, with 8 KiB and 64 KiB frees: the fix is for correctness, not for a measurable saving here. Earlier, an instrumented v3.0.0-rc.3 renderer (SHA-256 prefix ce5646666a7e) with a test switch choosing the old or new decision (`RX_TEST_IMPORT_EXCLUSIVE_END`, not in this PR), one run each on the same Deck: 20.09 FPS old, 20.33 FPS new, the boundary hit twice per transition (`docs/tested/2026-11-14-field-renderer-zeldaootr-import-old.md`, `-import-fixed.md`). On a Linux sparse shared memfd, freeing a 64 MiB range next to a simulated live import left 64 MiB backed with the old predicate and released it with the fix (three densities, three repeats, adjacent and one-page-overlap controls, 36 trials). ``` main-r2: [hos host] longshot v3.0.0-rc.3-75-g9c9d69ed (source 6b76ded3) vk: 5160 presents, 20.6 fps; a frame: 1176 draws (0 skipped), 145 dispatches, 155 passes, ... vk: imports: 48 live (2016 MB), 0 retired still imported (0 MB), 13 retired given back (1056 MB) pr469-r2: renderer v3.0.0-rc.3-78-g76382425, host as main's vk: 5040 presents, 20.9 fps; a frame: 1185 draws (0 skipped), 145 dispatches, 154 passes, ... vk: imports: 52 live (1984 MB), 0 retired still imported (0 MB), 11 retired given back (816 MB) $ python3 -I -B tests/test_guest_imported.py --cxx g++ (at d30476db, main aa95d35f plus the test; rounds 1 and 2) check.exe: check.cpp:38: main()::<lambda()>: Assertion `!memory_guest_imported(0x1000, 0x2000)' failed. $ python3 -I -B tests/test_guest_imported.py --cxx g++ (at afd5ea15; rounds 1 and 2) (passes, exit 0) ``` ### Flags and settings None ## Testing **Tested:** On the Steam Deck OLED above, 4 runs of this PR interleaved with 4 of main through the Kokiri Forest to Hyrule Field transition: Field reached every time (status map `HyruleField_Child`, 918-930 presents in each 45 s sample), no device fault, no `VK_ERROR`, no crash record, the run's low-memory guard never tripped, every run exited 0. In one run of this PR (round 3) the renderer gave back 16 idle imports at its system-heap limit (`vk: system heap 2648 of 3072 MB: 16 idle imports given back (352 MB)`); main's runs did not log that line, and the run's frame rate was not affected (20.52 FPS). Game-free, on this branch rebased onto `main` aa95d35f: `tests/test_guest_imported.py` fails at the test-only commit d30476db and passes at afd5ea15, twice each, alternating, and under `tests/run_all.py` with g++ 13.3 and with clang 23.1.5 at both commits; the 43 checks that read `gpu/vk/vk_memory.cpp` or the new test pass at the tip, 43 of 43. With https://git.magicbean.dev/MagicBeanDev/Longshot/pulls/468 and https://git.magicbean.dev/MagicBeanDev/Longshot/pulls/472, as rebased, the branch merges cleanly (`git merge-tree`). **Not tested:** Unique pages reclaimed during gameplay (the backing measured includes everything the game holds); Windows and other GPUs and drivers in the game. **Must be tested:** - Windows 10/11, any GPU: build this PR (with llvm-mingw), load a child save in Kokiri Forest, go to Hyrule Field, stay 1-2 minutes and back, expecting no device lost, no `VK_ERROR`, no crash record in `longshot_log.txt` and fps like main at the same spot (by hand, test request T-S2R3: post the fps, any `vk: system heap` lines and the GPU, driver and OS) ## Risks **What could break:** a free that only touches a live import is now released where it was kept; the existing synchronization between the ownership check and the host discard remains. Review alongside the pending-import lifetime fix, https://git.magicbean.dev/MagicBeanDev/Longshot/pulls/468. **Turning it off:** revert the fix commit **Compatibility:** Nothing changes ## Issues None filed. Overlaps https://git.magicbean.dev/MagicBeanDev/Longshot/pulls/468 (the same empty-range guard; the two merge cleanly) and https://git.magicbean.dev/MagicBeanDev/Longshot/pulls/431 (the 1 GiB stop two lines below). ## Checklist ### Everyone - [x] One topic. - [x] The title is a Conventional Commit (`type(scope): description`) of the status line's type. - [x] Why gives the reason plainly and links the issues that fit (the tracker searched). - [x] Measurements has a verdict, or one line saying why there is nothing to measure. - [x] Testing names what was tested, what wasn't, and what must still be tested, where and how. - [x] Rebased on current `main`. Onto main aa95d35f, no conflict; the four commits are the same changes as before (`git patch-id`). - [x] `python -I -B tests/run_all.py` passes (any failure that also fails on `main` is named). The full suite on main aa95d35f (Linux, g++ 13.3, the Vulkan headers set): 528 passed, 15 failed, 50 skipped; on this branch the new test and the 43 checks that read the changed files ran, with no failure that `main` does not have (see Testing). The 15 that fail on main: `test_appimage_player_build`, `test_bake_portability`, `test_cpm_discovery`, `test_crash_dialog`, `test_env_on`, `test_lift_cache`, `test_lift_cleanup_error`, `test_make_game_cache`, `test_mods_size_table`, `test_options_budget_once`, `test_pipeline_tour`, `test_readback_late`, `test_vk_pgo`, `test_walk_key` and `nx2/test_texture_init_barrier.py`. - [x] No game files, dumps, build output or generated files. - [x] `third_party/` untouched (a new folder with a `PROVENANCE.md` instead). - [x] The license is OK: GPL-3.0-or-later, nothing incompatible and nothing decompiled. ### When it applies - [x] AI assistance recorded with `Assisted-by:` / `Co-Authored-By:` trailers. - [x] Numbers from the same PC, scene and settings, at least 2 interleaved runs each, the median reported. - [x] A file in `docs/tested/` for each new measured run (format in `docs/tested-configurations.md`). - [x] A game-free test added for the fix, failing on `main` and passing here. - [x] Host code builds on both Windows (llvm-mingw) and Linux, with UTF-8 paths. Before the rebase, built on Linux for both: `RX_VK_ONLY=1 RX_RELEASE=1 RX_TARGET=windows` with llvm-mingw 20261104 linked `longshot_vk.dll`, and the same without `RX_TARGET` linked `longshot_vk.so`; after the rebase, `gpu/vk/vk_memory.cpp` at afd5ea15 checked whole (`-fsyntax-only -Wall -Wextra`) with clang 23.1.5 for Linux and llvm-mingw 20261104 for Windows: the same diagnostics as `main` aa95d35f's (54 and 43), none new. The diff has no path handling.
Assisted-by: OpenAI Codex
Assisted-by: OpenAI Codex
measure adjacent frees during the Field transition
Some checks failed
PR description / Description follows the template (pull_request_target) Successful in 17s
Website / Website on Cloudflare (pull_request_target) Has been skipped
CI / Conventional Commit title (pull_request) Has been cancelled
CI / Python source checks (ubuntu-24.04, part 1/2) (pull_request) Has been cancelled
CI / Python source checks (ubuntu-24.04, part 2/2) (pull_request) Has been cancelled
CI / SPIR-V fixtures (global narrow load/store, direct surface atomics, F2I immediate) (pull_request) Has been cancelled
CI / Workflow lint (actionlint) (pull_request) Has been cancelled
Third-party parts / As their notes say (pull_request) Has been cancelled
Third-party parts / The same as upstream (pull_request) Has been cancelled
Website / Website on Cloudflare (pull_request) Has been cancelled
a6337d73ed
Assisted-by: OpenAI Codex
zeldaootr force-pushed import-exclusive-end from a6337d73ed
Some checks failed
PR description / Description follows the template (pull_request_target) Successful in 17s
Website / Website on Cloudflare (pull_request_target) Has been skipped
CI / Conventional Commit title (pull_request) Has been cancelled
CI / Python source checks (ubuntu-24.04, part 1/2) (pull_request) Has been cancelled
CI / Python source checks (ubuntu-24.04, part 2/2) (pull_request) Has been cancelled
CI / SPIR-V fixtures (global narrow load/store, direct surface atomics, F2I immediate) (pull_request) Has been cancelled
CI / Workflow lint (actionlint) (pull_request) Has been cancelled
Third-party parts / As their notes say (pull_request) Has been cancelled
Third-party parts / The same as upstream (pull_request) Has been cancelled
Website / Website on Cloudflare (pull_request) Has been cancelled
to 3046b83159
Some checks failed
beanstalk/approval Test farm not requested
PR description / Description follows the template (pull_request_target) Successful in 4s
CI / Conventional Commit title (pull_request) Has been cancelled
CI / Python source checks (ubuntu-24.04, part 1/2) (pull_request) Has been cancelled
CI / Python source checks (ubuntu-24.04, part 2/2) (pull_request) Has been cancelled
CI / SPIR-V fixtures (global narrow load/store, direct surface atomics, F2I immediate) (pull_request) Has been cancelled
CI / Workflow lint (actionlint) (pull_request) Has been cancelled
Third-party parts / As their notes say (pull_request) Has been cancelled
Third-party parts / The same as upstream (pull_request) Has been cancelled
Website / Website on Cloudflare (pull_request) Has been cancelled
2026-11-14 18:57:53 +00:00
Compare
Author
Contributor

Rebased onto main 1be60eae, the run records renamed to the tester handle, and measured on a Steam Deck OLED against main: four interleaved rounds, medians 20.60 fps on main and 20.56 here, guest memory backing the same within spread, no fault. One run here logged 'system heap 2648 of 3072 MB: 16 idle imports given back', which no main run did; it is noted in the description. Still WIP: not built for Windows yet; the test request asks for that.

Rebased onto main 1be60eae, the run records renamed to the tester handle, and measured on a Steam Deck OLED against main: four interleaved rounds, medians 20.60 fps on main and 20.56 here, guest memory backing the same within spread, no fault. One run here logged 'system heap 2648 of 3072 MB: 16 idle imports given back', which no main run did; it is noted in the description. Still WIP: not built for Windows yet; the test request asks for that.
Author
Contributor

Built for Windows from Linux with llvm-mingw 20261104 (the renderer alone, RX_VK_ONLY, as the CI job does) and for Linux: both link, and the changed file has no new warning under -Wall -Wextra on either. The Windows box is ticked; the Windows test request stays open for a run on real hardware.

Built for Windows from Linux with llvm-mingw 20261104 (the renderer alone, RX_VK_ONLY, as the CI job does) and for Linux: both link, and the changed file has no new warning under -Wall -Wextra on either. The Windows box is ticked; the Windows test request stays open for a run on real hardware.
zeldaootr changed title from WIP: fix(vk): release pages ending at a GPU import boundary to fix(vk): release pages ending at a GPU import boundary 2026-11-14 19:24:33 +00:00
Author
Contributor

Rebased onto main aa95d35f with no conflict (the same four changes, git patch-id; commits now under the noreply identity) and the description moved to the current template.
The game-free test was run again on the new base (fails at the test-only commit, passes at the tip, two rounds, g++ and clang; the 43 checks that read the changed files pass); the Field numbers still hold because main changed vk_memory.cpp since 9c9d69ed only in how the mirror budget is set (#735), not in memory_guest_imported(). T-S2R3 (Windows) still waits for the testing wanted label.

Rebased onto `main` aa95d35f with no conflict (the same four changes, `git patch-id`; commits now under the noreply identity) and the description moved to the current template. The game-free test was run again on the new base (fails at the test-only commit, passes at the tip, two rounds, g++ and clang; the 43 checks that read the changed files pass); the Field numbers still hold because `main` changed `vk_memory.cpp` since 9c9d69ed only in how the mirror budget is set (#735), not in `memory_guest_imported()`. T-S2R3 (Windows) still waits for the `testing wanted` label.
zeldaootr force-pushed import-exclusive-end from 3046b83159
Some checks failed
beanstalk/approval Test farm not requested
PR description / Description follows the template (pull_request_target) Successful in 4s
CI / Conventional Commit title (pull_request) Has been cancelled
CI / Python source checks (ubuntu-24.04, part 1/2) (pull_request) Has been cancelled
CI / Python source checks (ubuntu-24.04, part 2/2) (pull_request) Has been cancelled
CI / SPIR-V fixtures (global narrow load/store, direct surface atomics, F2I immediate) (pull_request) Has been cancelled
CI / Workflow lint (actionlint) (pull_request) Has been cancelled
Third-party parts / As their notes say (pull_request) Has been cancelled
Third-party parts / The same as upstream (pull_request) Has been cancelled
Website / Website on Cloudflare (pull_request) Has been cancelled
to afd5ea15aa
Some checks are pending
CI / Conventional Commit title (pull_request) Blocked by required conditions
CI / Python source checks (ubuntu-24.04, part 1/2) (pull_request) Blocked by required conditions
CI / Python source checks (ubuntu-24.04, part 2/2) (pull_request) Blocked by required conditions
CI / SPIR-V fixtures (global narrow load/store, direct surface atomics, F2I immediate) (pull_request) Blocked by required conditions
CI / Workflow lint (actionlint) (pull_request) Blocked by required conditions
Guide screenshots / Guide images and local UI source review (pull_request) Blocked by required conditions
Third-party parts / As their notes say (pull_request) Blocked by required conditions
Third-party parts / The same as upstream (pull_request) Blocked by required conditions
Website / Website on Cloudflare (pull_request) Blocked by required conditions
PR description / Description follows the template (pull_request_target) Successful in 5s
2026-11-15 16:43:11 +00:00
Compare
Some checks are pending
CI / Conventional Commit title (pull_request) Blocked by required conditions
CI / Python source checks (ubuntu-24.04, part 1/2) (pull_request) Blocked by required conditions
CI / Python source checks (ubuntu-24.04, part 2/2) (pull_request) Blocked by required conditions
CI / SPIR-V fixtures (global narrow load/store, direct surface atomics, F2I immediate) (pull_request) Blocked by required conditions
CI / Workflow lint (actionlint) (pull_request) Blocked by required conditions
Guide screenshots / Guide images and local UI source review (pull_request) Blocked by required conditions
Third-party parts / As their notes say (pull_request) Blocked by required conditions
Third-party parts / The same as upstream (pull_request) Blocked by required conditions
Website / Website on Cloudflare (pull_request) Blocked by required conditions
PR description / Description follows the template (pull_request_target) Successful in 5s
This pull request doesn't have enough approvals yet. 0 of 1 approvals granted.
Some workflows are waiting to be reviewed.
This branch is out-of-date with the base branch
You are not authorized to merge this pull request.
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u 'import-exclusive-end:zeldaootr-import-exclusive-end'
git switch 'zeldaootr-import-exclusive-end'
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
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/Longshot!469
No description provided.