docs(tested): measure partially covered guest frees on Deck #471

Open
zeldaootr wants to merge 1 commit from zeldaootr/Longshot:measure-partial-import-frees into main
Contributor

Type: docs · Risk: low · Tested on: Linux, no GPU (game-free checks); the records are Steam Deck OLED runs (SteamOS 3.9.5, RADV) · Needs: none

Why

The host zeroes an entire freed range when even part of it still belongs to a Vulkan import. Before anyone changes how the host discards memory, these records say how many bytes that decision covers unnecessarily on the Deck: under 2 MiB at the Field transition in the refined run.

What changed

Two Deck run records from passive release probes, no code. The first probe kept the original decision and measured the union of live, retired, evicted, deferred and pending imports; the second used the actual allocation extent of sparse DMA buffers, including their padding.

  • docs/tested: 2026-11-14-field-renderer-zeldaootr-partial.md (first probe) and 2026-11-14-field-renderer-zeldaootr-partial-v2.md (refined probe), one run each.

Measurements

Verdict: passes: records only; the two pass tests/test_tested_configurations.py and join the assembled catalogue (225 to 227 rows), two rounds each on main and this PR.

Hardware: Linux x86-64 server (Ubuntu 24.04), no GPU used; Python 3.15
Scene: no game: the game-free checks
Method: python3 -I -B tests/test_tested_configurations.py on main and on this branch, two interleaved rounds; scripts/tested_configurations.py --output once on each, counting the assembled table's rows
How to reproduce: run both commands from the repository root on each commit

Before: main @ aa95d35f After: this PR @ 20861e19
tests/test_tested_configurations.py, round 1 / round 2 25 tests, OK / OK 25 tests, OK / OK
files in docs/tested/ 79 81
rows in the assembled catalogue 225 227
aa95d35f r1: Ran 25 tests ... OK ; docs/tested: 79 files
20861e19 r1: Ran 25 tests ... OK ; docs/tested: 81 files
aa95d35f r2: Ran 25 tests ... OK ; docs/tested: 79 files
20861e19 r2: Ran 25 tests ... OK ; docs/tested: 81 files

What the records hold (instrumented RC3 builds, not main or this PR): both runs use the same RC3 host with corrected memory reporting, Steam Deck OLED on SteamOS 3.9.5 and RADV VANGOGH, 16 GB shared, 1280×720, frame generation off; from the copied child Kokiri save, settle 20 s, teleport to the Field and record 45 s after warm-up. The first probe treated every query as unknown because sparse pools were present with unrecorded allocation padding; its zero lower bound was inconclusive. In the refined run, 56 partially overlapping free requests spanned 19,083,264 bytes (18.2 MiB) outside known ownership over the whole launch. Four occurred from the teleport request onward, totaling 1,851,392 bytes (1.77 MiB). The largest single uncovered span across the entire launch was 2.50 MiB. No refined query had uncertain ownership. These are cumulative requested bytes with possible reuse across calls; actual resident or reclaimable bytes were not measured. The per-request tracing's timing overhead makes these runs unsuitable as an FPS benchmark.

Flags and settings

None

Testing

Tested: Linux, game-free: on this branch rebased onto main aa95d35f (20861e19), the two records pass tests/test_tested_configurations.py and scripts/tested_configurations.py assembles the catalogue with them. The probe preserved the original RC3 decisions on 5,151 nonempty and empty test inputs; live and deferred sparse padding, duplicate overlaps, touching ranges and disjoint gaps were checked separately. Both Deck runs reached the Field map and completed normally.

Not tested: Windows and other GPUs: the records describe Steam Deck runs only. Resident or reclaimable bytes (see above).

Must be tested: None

Risks

What could break: nothing at run time: measurement records only. A future partial-discard implementation must coordinate ownership checks with the discard, protect alignment padding, and keep reads of freed pages zero.

Turning it off: revert the commit

Compatibility: Nothing changes

Issues

None filed. Related: the adjacent-only lookup fix (#469) and pending import ownership (#468).

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 commit is the same change 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; this PR adds run records only, and the one check that reads them, tests/test_tested_configurations.py, passes here. The 15 that fail on main read nothing under docs/: 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.
  • A file in docs/tested/ for each new measured run (format in docs/tested-configurations.md).
  • Docs updated.
**Type:** docs · **Risk:** low · **Tested on:** Linux, no GPU (game-free checks); the records are Steam Deck OLED runs (SteamOS 3.9.5, RADV) · **Needs:** none ## Why The host zeroes an entire freed range when even part of it still belongs to a Vulkan import. Before anyone changes how the host discards memory, these records say how many bytes that decision covers unnecessarily on the Deck: under 2 MiB at the Field transition in the refined run. ## What changed Two Deck run records from passive release probes, no code. The first probe kept the original decision and measured the union of live, retired, evicted, deferred and pending imports; the second used the actual allocation extent of sparse DMA buffers, including their padding. - docs/tested: `2026-11-14-field-renderer-zeldaootr-partial.md` (first probe) and `2026-11-14-field-renderer-zeldaootr-partial-v2.md` (refined probe), one run each. ## Measurements **Verdict:** passes: records only; the two pass `tests/test_tested_configurations.py` and join the assembled catalogue (225 to 227 rows), two rounds each on `main` and this PR. Hardware: Linux x86-64 server (Ubuntu 24.04), no GPU used; Python 3.15 Scene: no game: the game-free checks Method: `python3 -I -B tests/test_tested_configurations.py` on `main` and on this branch, two interleaved rounds; `scripts/tested_configurations.py --output` once on each, counting the assembled table's rows How to reproduce: run both commands from the repository root on each commit | | Before: main @ aa95d35f | After: this PR @ 20861e19 | |---|---|---| | `tests/test_tested_configurations.py`, round 1 / round 2 | 25 tests, OK / OK | 25 tests, OK / OK | | files in `docs/tested/` | 79 | 81 | | rows in the assembled catalogue | 225 | 227 | ``` aa95d35f r1: Ran 25 tests ... OK ; docs/tested: 79 files 20861e19 r1: Ran 25 tests ... OK ; docs/tested: 81 files aa95d35f r2: Ran 25 tests ... OK ; docs/tested: 79 files 20861e19 r2: Ran 25 tests ... OK ; docs/tested: 81 files ``` What the records hold (instrumented RC3 builds, not `main` or this PR): both runs use the same RC3 host with corrected memory reporting, Steam Deck OLED on SteamOS 3.9.5 and RADV VANGOGH, 16 GB shared, 1280×720, frame generation off; from the copied child Kokiri save, settle 20 s, teleport to the Field and record 45 s after warm-up. The first probe treated every query as unknown because sparse pools were present with unrecorded allocation padding; its zero lower bound was inconclusive. In the refined run, 56 partially overlapping free requests spanned 19,083,264 bytes (18.2 MiB) outside known ownership over the whole launch. Four occurred from the teleport request onward, totaling 1,851,392 bytes (1.77 MiB). The largest single uncovered span across the entire launch was 2.50 MiB. No refined query had uncertain ownership. These are cumulative requested bytes with possible reuse across calls; actual resident or reclaimable bytes were not measured. The per-request tracing's timing overhead makes these runs unsuitable as an FPS benchmark. ### Flags and settings None ## Testing **Tested:** Linux, game-free: on this branch rebased onto `main` aa95d35f (20861e19), the two records pass `tests/test_tested_configurations.py` and `scripts/tested_configurations.py` assembles the catalogue with them. The probe preserved the original RC3 decisions on 5,151 nonempty and empty test inputs; live and deferred sparse padding, duplicate overlaps, touching ranges and disjoint gaps were checked separately. Both Deck runs reached the Field map and completed normally. **Not tested:** Windows and other GPUs: the records describe Steam Deck runs only. Resident or reclaimable bytes (see above). **Must be tested:** None ## Risks **What could break:** nothing at run time: measurement records only. A future partial-discard implementation must coordinate ownership checks with the discard, protect alignment padding, and keep reads of freed pages zero. **Turning it off:** revert the commit **Compatibility:** Nothing changes ## Issues None filed. Related: the adjacent-only lookup fix (https://git.magicbean.dev/MagicBeanDev/Longshot/pulls/469) and pending import ownership (https://git.magicbean.dev/MagicBeanDev/Longshot/pulls/468). ## 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 commit is the same change 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; this PR adds run records only, and the one check that reads them, `tests/test_tested_configurations.py`, passes here. The 15 that fail on main read nothing under `docs/`: `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] A file in `docs/tested/` for each new measured run (format in `docs/tested-configurations.md`). - [x] Docs updated.
measure guest frees that only partially overlap GPU imports
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
3c143c771b
Assisted-by: OpenAI Codex
Author
Contributor

Rebased onto main 9c9d69ed and rewritten so the run records are named with the tester handle zeldaootr (file contents unchanged). The description now has the game-free checks on main and on this branch, two interleaved runs each, with the failures that also fail on main named.

Rebased onto main 9c9d69ed and rewritten so the run records are named with the tester handle zeldaootr (file contents unchanged). The description now has the game-free checks on main and on this branch, two interleaved runs each, with the failures that also fail on main named.
zeldaootr force-pushed measure-partial-import-frees from 3c143c771b
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 ae77860315
Some checks failed
Website / Website on Cloudflare (pull_request_target) Has been skipped
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 17:15:15 +00:00
Compare
zeldaootr changed title from WIP: docs(tested): measure partially covered guest frees on Deck to docs(tested): measure partially covered guest frees on Deck 2026-11-14 17:15:17 +00:00
Author
Contributor

Rebased onto main aa95d35f with no conflict (the same records, git patch-id; commits now under the noreply identity) and the description moved to the current template.
The game-free check was run again on the new base (tests/test_tested_configurations.py OK on main and here, two rounds; the catalogue assembles with the records); the Deck numbers are what the records hold, from instrumented RC3 builds, so no rebase changes them.

Rebased onto `main` aa95d35f with no conflict (the same records, `git patch-id`; commits now under the noreply identity) and the description moved to the current template. The game-free check was run again on the new base (`tests/test_tested_configurations.py` OK on `main` and here, two rounds; the catalogue assembles with the records); the Deck numbers are what the records hold, from instrumented RC3 builds, so no rebase changes them.
zeldaootr force-pushed measure-partial-import-frees from ae77860315
Some checks failed
Website / Website on Cloudflare (pull_request_target) Has been skipped
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 20861e19ff
Some checks are pending
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
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
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:21 +00:00
Compare
Some checks are pending
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
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
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 'measure-partial-import-frees:zeldaootr-measure-partial-import-frees'
git switch 'zeldaootr-measure-partial-import-frees'
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!471
No description provided.