WIP: perf(build): a renderer header edit compiles the files that read it, not the whole back end #37

Draft
dyst wants to merge 1 commit from dyst/Longshot:perf/renderer-depfiles into main
Member

Why

Editing any renderer header recompiles the whole back end: on Windows a comment in vk_present_rect.h, which two files include, compiled 35 files again (417 s of compiler time; a 44 s build against 26 s for a .cpp edit, and minutes on a 4–8 thread PC).

What changed

  • build: nx2/build.py compiles the back end's own files (gpu/vk/*.cpp, not Eden's or sirit's) with -MD, and clang writes a depfile beside each object (vk_x.d for vk_x.o, depfile_of).
  • build: depfile_paths reads a make-style depfile (the target left out, line continuations joined, \ , $$ and \#). renderer_deps keys each object by the headers its depfile lists under the same folders as before (vdeps_roots: gpu/vk, gpu/render, gpu/compat, suyu's texture decoders), by name and content (_HEADER_DIGESTS). A header the file doesn't read no longer changes its key; one it reads, or one that's gone, does.
  • build: the folders' blob (tree_headers) stays as the fallback, for a file with no depfile yet or one whose depfile names nothing under those folders.
  • build: flag_text leaves -MD out of the key, so no key changes and nothing compiles again for this change itself; depfiles appear as files are compiled.
  • build: compile_one neither caches nor stamps an object under a key that came from the last compile's depfile (it hashes the new source with the old include list): it stamps it DEPFILE_PENDING. rekey_depfiles, run in main after the compile, stamps and caches each back-end object of this build (DEPFILE_JOBS) by the key its own new depfile gives, also when that is the planned key; an object stamped otherwise is another build's and is left alone. A build that stops before re-keying leaves the object pending, and the next build compiles it again. This answers hckrman101's review (an include added, removed, the header edited, the include back used to get the first object back from the cache).
  • build: unchanged: Eden's and sirit's files keep their own headers' blob, and the host keeps its blob (it mixes in non-header inputs such as the FFmpeg version key, so it is left for a separate change).
  • tests: tests/test_renderer_depfiles.py (new, 11 cases). tests/test_compiler_failure.py, tests/test_mem_gate_leases.py and tests/test_compile_retry_jobs.py take DEPFILE_DEPS and DEPFILE_PENDING with compile_one; tests/test_dlss_sdk_cache.py and tests/test_shader_stamp_cache.py run the job loop with its new helpers.

Flags and settings

None. (The back end's files are compiled with -MD now: a compiler flag inside the build, not a switch, and left out of object keys.)

Measurements

Measured on the GitHub version (https://github.com/NotRexed/Hookshot/pull/2706), not yet on Longshot: this PR stays WIP until it is.

Hardware: Ryzen 9 3900X, NVMe, Windows
Scene: none (a build measurement)
Method: one build after a comment was added to gpu/vk/vk_present_rect.h, without depfiles and with them; then the header reverted

One comment in vk_present_rect.h GitHub main this PR (GitHub)
files compiled 35 4
compiler time 417 s 20 s
build 44 s 27 s
  • With the header reverted again (this PR only): 0 files, 0 s of compiler time, an 18 s build.
  • The four are the files that read it: vk_framegen.cpp, vk_menu.cpp, vk_replay.cpp, and host/hos_main.c, through the host's own blob.
  • Getting depfiles took one compile of each back-end file, done there by commenting them all. The re-keying then kept the reverted files from compiling a third time.
  • The "GitHub main" column is the original description's "before"; neither column's commit is named there.

In the game (a check, not a comparison): RTX 3080 (NVIDIA 621.14), Ryzen 9 3900X, 64 GB, Windows 11, this branch's build.py (with the review fix) on GitHub's main ee29dd55. A build with depfiles, then one with a comment added to vk_present_rect.h: 5 files compiled (the four above, and vk_hangdump.cpp, which reads no repo header, so its depfile names nothing under those folders and it keeps the blob), no object left pending; with the comment taken out again, 0 files. That game, launched headless through the control bridge from a save: in play in Kokiri Forest, 27–34 fps over five samples, nothing in the log about a lost device or a crash.

Testing

Tested: the runs under Measurements (on the GitHub version) and the game-free checks this description names. Checked but not measured: the game on Windows (above): the change is build-only, and nothing in play was compared with main.

Not tested: Linux. gcc and clang write the same make-style depfile.

Needs other testers:

  • Linux: an edit to one gpu/vk header, expecting only the renderer files that include it compiled again (request to open)

Screenshots

Nothing on screen.

Risk and rollback

  • A back-end object keyed by too few headers would be taken from the cache though a header it reads changed: a stale object in the renderer. The pending stamp and rekey_depfiles cover a header read for the first time; the remaining limit is make's and ninja's: a newly added header that shadows another earlier in the include path isn't seen until something the file reads changes.
  • A file without a readable depfile falls back to the folders' blob, as before.
  • No switch: reverting the commit is enough (objects keyed by depfiles are only cache entries; the blob keys come back).

Reviewer notes

Carried over from https://github.com/NotRexed/Hookshot/pull/2706 with the move to Longshot: the same change on Longshot's main, with its rename applied. Its review and discussion are there (reviewed by Joey-Magnus, jordanella).

  • The checks and the game run above were done on the GitHub version; this branch is the same change with the rename applied (the same files and line counts). Forgejo runs no checks, and they were not run again here.
  • Checks run (on GitHub, not the whole run_all.py): every check that reads build.py (39), on Windows, passes apart from test_driver_cache_folder, test_fpx_sticky and test_linux_update, which fail the same way on main there.
  • tests/test_renderer_depfiles.py: the depfile read as clang 23 writes it on Windows (/ and \ in paths with spaces, CRLF continuations), plus $$ and \#; -MD in no key; no depfile keeps the blob; an unread header or one outside the folders changes nothing, while a read header or a gone one changes the key; the re-keying, and that it leaves alone an object not of this build; the wiring; and hckrman101's four steps, with a stand-in compiler that writes the headers it read into the object and a real depfile (on the previous commit step 4 got back step 2's object, built with the old b.h). It fails against main's build.py.
  • test_dlss_sdk_cache.py and test_shader_stamp_cache.py still take an older build.py (--build-script), and test_shader_stamp_cache passes against main's.
  • This is the dev-loop proposal's A6 (https://github.com/NotRexed/Hookshot/pull/2636), validated by hckrman101's Linux numbers there (16 objects for one header).

Issues

None.

Checklist

For everyone

  • One topic.
  • The title is a Conventional Commit (type(scope): description).
  • Rebased on current main.
  • python -I -B tests/run_all.py run and passing (any failure that also fails on main is named above).
  • Tested in the game, or what wasn't is named under Testing.
  • Testing filled in: what was tested, what wasn't, and what needs other testers (with test requests).
  • Measured: main and this PR at named commits, on the same PC, scene and settings, at least 2 interleaved runs each, the median reported.
  • 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.

If applicable

  • AI assistance recorded with Assisted-by: / Co-Authored-By: trailers.
  • A game-free test added for the fix, failing on main and passing here.
  • A check under tests/ that reads changed source updated in this PR, not weakened.

🤖 Generated with Claude Code

## Why Editing any renderer header recompiles the whole back end: on Windows a comment in `vk_present_rect.h`, which two files include, compiled 35 files again (417 s of compiler time; a 44 s build against 26 s for a `.cpp` edit, and minutes on a 4–8 thread PC). ## What changed - build: `nx2/build.py` compiles the back end's own files (`gpu/vk/*.cpp`, not Eden's or sirit's) with `-MD`, and clang writes a depfile beside each object (`vk_x.d` for `vk_x.o`, `depfile_of`). - build: `depfile_paths` reads a make-style depfile (the target left out, line continuations joined, `\ `, `$$` and `\#`). `renderer_deps` keys each object by the headers its depfile lists under the same folders as before (`vdeps_roots`: `gpu/vk`, `gpu/render`, `gpu/compat`, suyu's texture decoders), by name and content (`_HEADER_DIGESTS`). A header the file doesn't read no longer changes its key; one it reads, or one that's gone, does. - build: the folders' blob (`tree_headers`) stays as the fallback, for a file with no depfile yet or one whose depfile names nothing under those folders. - build: `flag_text` leaves `-MD` out of the key, so no key changes and nothing compiles again for this change itself; depfiles appear as files are compiled. - build: `compile_one` neither caches nor stamps an object under a key that came from the last compile's depfile (it hashes the new source with the old include list): it stamps it `DEPFILE_PENDING`. `rekey_depfiles`, run in `main` after the compile, stamps and caches each back-end object of this build (`DEPFILE_JOBS`) by the key its own new depfile gives, also when that is the planned key; an object stamped otherwise is another build's and is left alone. A build that stops before re-keying leaves the object pending, and the next build compiles it again. This answers hckrman101's review (an include added, removed, the header edited, the include back used to get the first object back from the cache). - build: unchanged: Eden's and sirit's files keep their own headers' blob, and the host keeps its blob (it mixes in non-header inputs such as the FFmpeg version key, so it is left for a separate change). - tests: `tests/test_renderer_depfiles.py` (new, 11 cases). `tests/test_compiler_failure.py`, `tests/test_mem_gate_leases.py` and `tests/test_compile_retry_jobs.py` take `DEPFILE_DEPS` and `DEPFILE_PENDING` with `compile_one`; `tests/test_dlss_sdk_cache.py` and `tests/test_shader_stamp_cache.py` run the job loop with its new helpers. ## Flags and settings None. (The back end's files are compiled with `-MD` now: a compiler flag inside the build, not a switch, and left out of object keys.) ## Measurements Measured on the GitHub version (https://github.com/NotRexed/Hookshot/pull/2706), not yet on Longshot: this PR stays WIP until it is. Hardware: Ryzen 9 3900X, NVMe, Windows Scene: none (a build measurement) Method: one build after a comment was added to `gpu/vk/vk_present_rect.h`, without depfiles and with them; then the header reverted | One comment in `vk_present_rect.h` | GitHub main | this PR (GitHub) | |---|---|---| | files compiled | 35 | 4 | | compiler time | 417 s | 20 s | | build | 44 s | 27 s | - With the header reverted again (this PR only): 0 files, 0 s of compiler time, an 18 s build. - The four are the files that read it: `vk_framegen.cpp`, `vk_menu.cpp`, `vk_replay.cpp`, and `host/hos_main.c`, through the host's own blob. - Getting depfiles took one compile of each back-end file, done there by commenting them all. The re-keying then kept the reverted files from compiling a third time. - The "GitHub main" column is the original description's "before"; neither column's commit is named there. In the game (a check, not a comparison): RTX 3080 (NVIDIA 621.14), Ryzen 9 3900X, 64 GB, Windows 11, this branch's `build.py` (with the review fix) on GitHub's `main` ee29dd55. A build with depfiles, then one with a comment added to `vk_present_rect.h`: 5 files compiled (the four above, and `vk_hangdump.cpp`, which reads no repo header, so its depfile names nothing under those folders and it keeps the blob), no object left pending; with the comment taken out again, 0 files. That game, launched headless through the control bridge from a save: in play in Kokiri Forest, 27–34 fps over five samples, nothing in the log about a lost device or a crash. ## Testing **Tested:** the runs under Measurements (on the GitHub version) and the game-free checks this description names. Checked but not measured: the game on Windows (above): the change is build-only, and nothing in play was compared with `main`. **Not tested:** Linux. gcc and clang write the same make-style depfile. **Needs other testers:** - Linux: an edit to one `gpu/vk` header, expecting only the renderer files that include it compiled again (request to open) ## Screenshots Nothing on screen. ## Risk and rollback - A back-end object keyed by too few headers would be taken from the cache though a header it reads changed: a stale object in the renderer. The pending stamp and `rekey_depfiles` cover a header read for the first time; the remaining limit is make's and ninja's: a newly added header that shadows another earlier in the include path isn't seen until something the file reads changes. - A file without a readable depfile falls back to the folders' blob, as before. - No switch: reverting the commit is enough (objects keyed by depfiles are only cache entries; the blob keys come back). ## Reviewer notes Carried over from https://github.com/NotRexed/Hookshot/pull/2706 with the move to Longshot: the same change on Longshot's `main`, with its rename applied. Its review and discussion are there (reviewed by Joey-Magnus, jordanella). - The checks and the game run above were done on the GitHub version; this branch is the same change with the rename applied (the same files and line counts). Forgejo runs no checks, and they were not run again here. - Checks run (on GitHub, not the whole `run_all.py`): every check that reads `build.py` (39), on Windows, passes apart from `test_driver_cache_folder`, `test_fpx_sticky` and `test_linux_update`, which fail the same way on `main` there. - `tests/test_renderer_depfiles.py`: the depfile read as clang 23 writes it on Windows (`/` and `\ ` in paths with spaces, CRLF continuations), plus `$$` and `\#`; `-MD` in no key; no depfile keeps the blob; an unread header or one outside the folders changes nothing, while a read header or a gone one changes the key; the re-keying, and that it leaves alone an object not of this build; the wiring; and hckrman101's four steps, with a stand-in compiler that writes the headers it read into the object and a real depfile (on the previous commit step 4 got back step 2's object, built with the old `b.h`). It fails against `main`'s `build.py`. - `test_dlss_sdk_cache.py` and `test_shader_stamp_cache.py` still take an older `build.py` (`--build-script`), and `test_shader_stamp_cache` passes against `main`'s. - This is the dev-loop proposal's A6 (https://github.com/NotRexed/Hookshot/pull/2636), validated by hckrman101's Linux numbers there (16 objects for one header). ## Issues None. ## Checklist ### For everyone - [x] One topic. - [x] The title is a Conventional Commit (`type(scope): description`). - [ ] Rebased on current `main`. - [ ] `python -I -B tests/run_all.py` run and passing (any failure that also fails on `main` is named above). - [x] Tested in the game, or what wasn't is named under Testing. - [x] Testing filled in: what was tested, what wasn't, and what needs other testers (with test requests). - [ ] Measured: main and this PR at named commits, on the same PC, scene and settings, at least 2 interleaved runs each, the median reported. - [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. ### If applicable - [x] AI assistance recorded with `Assisted-by:` / `Co-Authored-By:` trailers. - [x] A game-free test added for the fix, failing on `main` and passing here. - [x] A check under `tests/` that reads changed source updated in this PR, not weakened. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
perf(build): a renderer header edit compiles the files that read it, not the whole back end
All checks were successful
PR description / Description follows the template (pull_request_target) Successful in 3s
Website / Website on Cloudflare (pull_request_target) Has been skipped
13d7223935
Carried over from github.com/jordanella/Hookshot perf/renderer-depfiles (its commits: perf(build): a renderer header edit compiles the files that read it, not the whole back end; fix(build): an object keyed by the last depfile is cached by its own depfile's key only). Merged with Longshot's
zstd object for the program cache (nx2/build.py), kept as it is after the renderer's jobs.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
dyst changed title from perf(build): a renderer header edit compiles the files that read it, not the whole back end to WIP: perf(build): a renderer header edit compiles the files that read it, not the whole back end 2026-11-13 01:14:00 +00:00
Author
Member

Back to WIP under #48's process: this was carried over before the new template. Its description will be brought to the template and measured on Longshot (main against this PR, at named commits) when it's wanted for review; ask here if you'd like it sooner.

Back to WIP under #48's process: this was carried over before the new template. Its description will be brought to the template and measured on Longshot (main against this PR, at named commits) when it's wanted for review; ask here if you'd like it sooner.
Author
Member

Description brought to Longshot's PR template (#48). Still WIP: its numbers are from the GitHub version, and it isn't rebased on current main; it gets measured on Longshot (main against this PR, at named commits) before it is marked ready.

Description brought to Longshot's PR template (#48). Still WIP: its numbers are from the GitHub version, and it isn't rebased on current main; it gets measured on Longshot (main against this PR, at named commits) before it is marked ready.
Author
Member

Description moved to the template's Testing section and whole checklist (#72): what was tested, what wasn't, and what needs other testers (their test requests to open while this is WIP).

Description moved to the template's Testing section and whole checklist (#72): what was tested, what wasn't, and what needs other testers (their test requests to open while this is WIP).
Author
Member

The description follows the template after #76 and #106: If applicable keeps only the boxes that apply (one that applies and isn't done yet stays unticked while this is WIP), the Flags table has the template's seven columns (Goal is now Recommendation), and GitHub references are full URLs. Nothing else changed.

The description follows the template after #76 and #106: If applicable keeps only the boxes that apply (one that applies and isn't done yet stays unticked while this is WIP), the Flags table has the template's seven columns (Goal is now Recommendation), and GitHub references are full URLs. Nothing else changed.
mooki left a comment

Read head 13d72239, all seven changed files, the description and four forge comments, the empty forge review list, the archived original review, and the planning, compile, cache and link callers; ran all six changed checks and five existing build checks on Linux, with GCC and Clang for the DLSS fixture: all passed. No game, full build or whole suite was run.

What's good

  • The cost still exists on main cf605c85: each of the back end's own objects gets the same complete renderer-header digest. Narrowing that digest to the headers the compiler read addresses the cause, while a clean build or an absent depfile keeps the conservative fallback.
  • The earlier stale-cache review fix is present. compile_one leaves a depfile-keyed compile pending rather than caching the new source under the previous include list. After all compiles succeed, rekey_depfiles reads the new list, publishes the correct cache entry and stamps the object before linking. The new 11-case check passes, including add include, remove include, edit header, add include again.
  • The other dependencies survive the change: source contents and normalized flags, the shader and version definitions, the generated logo, NGX headers and ImGui headers. Eden, sirit and the host retain their existing dependency groups. This does not claim to fix the existing treatment of headers outside those groups; the new-header shadowing limit is explicitly disclosed.

Must change

No functional defect found in this patch. It is 117 commits behind main cf605c85, with one commit of its own, but the actual merge is clean. Since its base 82de567a, main's only changes to nx2/build.py concern FSR header discovery and selection of the prebuilt renderer, not these object keys. Being behind main is not the reason for a change request.

Measurements and smaller points

  1. Keep the historical result separate from a Longshot speed claim. The table's 44 s versus 27 s is one Windows build per side, with neither commit identified. There are no repeated alternating runs, median or spread, so it does not meet the stated measurement rule. The description correctly keeps this WIP. For the new comparison, name both commits and the compiler, keep the work-folder retention and cache state equal, state how depfiles were populated, and retain at least main / PR / main / PR with every build's file list, compiler time and wall time. Show the first depfile-producing build separately from the later header-edit builds.

  2. The older Linux result is already available, but is not a test of this head. It reports 35 files versus 5, real GCC and Clang checks of the stale-cache fix, and successful starts on GitHub head f0f345b6: https://github.com/NotRexed/Hookshot/pull/2706#issuecomment-6829816712. Link that result beside the Windows evidence rather than leaving Linux wholly untested. Keep its original commits and its explicit lack of a wall-time claim. The older four-file table and later five-file observation should remain separately labelled.

  3. Explain why the extra files rebuild. At this head, vk_present_rect.h is included by vk_framegen.cpp and vk_replay.cpp. vk_menu.cpp and host/hos_main.c also receive the source fingerprint through LONGSHOT_VERSION; nx2/version.py hashes renderer headers, and nx2/build.py, lines 1217 and 1348, supplies that definition to those two files. They are not additional readers of this header. vk_hangdump.cpp retains the whole-header fallback. This explains the five-file result without attributing the host rebuild to its header group.

  4. Extend the checks to exercise the new path together with the preserved extras. The DLSS and shader-stamp fixtures construct jobs without existing object depfiles, so their passes cover the fallback path. Seeding a depfile in those fixtures would also test that an NGX or ImGui edit still changes the key after narrowing. A case stopped after the pending stamp and restarted before re-keying would pin the interrupted-build guarantee. These are coverage improvements, not observed failures.

Overlaps

  • The shared object store changes the cache location and cache_put, which this PR's re-keying calls: #24. The source-hash record changes key_of and its saved state: #35. Both merge pairwise with this head without textual conflicts; their combined behavior was not tested.
  • The lift-key and developer-command changes work at other build stages, not in this patch's files: #22 and #28.
  • Likewise, the lift workers, prompt generation and game-file hard links do not edit this patch's files: #357, #358, #314 and #360. Keep a combined build's timings separate from this change alone.

Not checked

No current-head Windows execution, real renderer build, interrupted renderer build, binary-output comparison or repeat timing here. The original GitHub API now returns 404, so its earlier discussion was read from retained copies, not a fresh complete thread. The forge status reports a passed description check and a skipped website check, not passed source checks: https://git.magicbean.dev/MagicBeanDev/Longshot/actions/runs/1181. A current-main rebase with the focused checks, a clean and incremental build comparison, and the repeated timing record would settle the remaining readiness and performance questions.

Read head `13d72239`, all seven changed files, the description and four forge comments, the empty forge review list, the archived original review, and the planning, compile, cache and link callers; ran all six changed checks and five existing build checks on Linux, with GCC and Clang for the DLSS fixture: all passed. No game, full build or whole suite was run. ### What's good - The cost still exists on main `cf605c85`: each of the back end's own objects gets the same complete renderer-header digest. Narrowing that digest to the headers the compiler read addresses the cause, while a clean build or an absent depfile keeps the conservative fallback. - The earlier stale-cache review fix is present. `compile_one` leaves a depfile-keyed compile pending rather than caching the new source under the previous include list. After all compiles succeed, `rekey_depfiles` reads the new list, publishes the correct cache entry and stamps the object before linking. The new 11-case check passes, including add include, remove include, edit header, add include again. - The other dependencies survive the change: source contents and normalized flags, the shader and version definitions, the generated logo, NGX headers and ImGui headers. Eden, sirit and the host retain their existing dependency groups. This does not claim to fix the existing treatment of headers outside those groups; the new-header shadowing limit is explicitly disclosed. ### Must change No functional defect found in this patch. It is 117 commits behind main `cf605c85`, with one commit of its own, but the actual merge is clean. Since its base `82de567a`, main's only changes to `nx2/build.py` concern FSR header discovery and selection of the prebuilt renderer, not these object keys. Being behind main is not the reason for a change request. ### Measurements and smaller points 1. **Keep the historical result separate from a Longshot speed claim.** The table's 44 s versus 27 s is one Windows build per side, with neither commit identified. There are no repeated alternating runs, median or spread, so it does not meet the stated measurement rule. The description correctly keeps this WIP. For the new comparison, name both commits and the compiler, keep the work-folder retention and cache state equal, state how depfiles were populated, and retain at least main / PR / main / PR with every build's file list, compiler time and wall time. Show the first depfile-producing build separately from the later header-edit builds. 2. **The older Linux result is already available, but is not a test of this head.** It reports 35 files versus 5, real GCC and Clang checks of the stale-cache fix, and successful starts on GitHub head `f0f345b6`: https://github.com/NotRexed/Hookshot/pull/2706#issuecomment-6829816712. Link that result beside the Windows evidence rather than leaving Linux wholly untested. Keep its original commits and its explicit lack of a wall-time claim. The older four-file table and later five-file observation should remain separately labelled. 3. **Explain why the extra files rebuild.** At this head, `vk_present_rect.h` is included by `vk_framegen.cpp` and `vk_replay.cpp`. `vk_menu.cpp` and `host/hos_main.c` also receive the source fingerprint through `LONGSHOT_VERSION`; `nx2/version.py` hashes renderer headers, and `nx2/build.py`, lines 1217 and 1348, supplies that definition to those two files. They are not additional readers of this header. `vk_hangdump.cpp` retains the whole-header fallback. This explains the five-file result without attributing the host rebuild to its header group. 4. **Extend the checks to exercise the new path together with the preserved extras.** The DLSS and shader-stamp fixtures construct jobs without existing object depfiles, so their passes cover the fallback path. Seeding a depfile in those fixtures would also test that an NGX or ImGui edit still changes the key after narrowing. A case stopped after the pending stamp and restarted before re-keying would pin the interrupted-build guarantee. These are coverage improvements, not observed failures. ### Overlaps - The shared object store changes the cache location and `cache_put`, which this PR's re-keying calls: https://git.magicbean.dev/MagicBeanDev/Longshot/pulls/24. The source-hash record changes `key_of` and its saved state: https://git.magicbean.dev/MagicBeanDev/Longshot/pulls/35. Both merge pairwise with this head without textual conflicts; their combined behavior was not tested. - The lift-key and developer-command changes work at other build stages, not in this patch's files: https://git.magicbean.dev/MagicBeanDev/Longshot/pulls/22 and https://git.magicbean.dev/MagicBeanDev/Longshot/pulls/28. - Likewise, the lift workers, prompt generation and game-file hard links do not edit this patch's files: https://git.magicbean.dev/MagicBeanDev/Longshot/pulls/357, https://git.magicbean.dev/MagicBeanDev/Longshot/pulls/358, https://git.magicbean.dev/MagicBeanDev/Longshot/pulls/314 and https://git.magicbean.dev/MagicBeanDev/Longshot/pulls/360. Keep a combined build's timings separate from this change alone. ### Not checked No current-head Windows execution, real renderer build, interrupted renderer build, binary-output comparison or repeat timing here. The original GitHub API now returns 404, so its earlier discussion was read from retained copies, not a fresh complete thread. The forge status reports a passed description check and a skipped website check, not passed source checks: https://git.magicbean.dev/MagicBeanDev/Longshot/actions/runs/1181. A current-main rebase with the focused checks, a clean and incremental build comparison, and the repeated timing record would settle the remaining readiness and performance questions.
All checks were successful
PR description / Description follows the template (pull_request_target) Successful in 3s
Website / Website on Cloudflare (pull_request_target) Has been skipped
This pull request has changes conflicting with the target branch.
  • nx2/build.py
View command line instructions

Manual merge helper

Use this merge commit message when completing the merge manually.

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u 'perf/renderer-depfiles:dyst-perf/renderer-depfiles'
git switch 'dyst-perf/renderer-depfiles'
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
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!37
No description provided.