WIP: fix(vk): keep ultrawide loading fades full width #57
No reviewers
Labels
No labels
accessibility
autorelease: pending
autorelease: tagged
bug
dependencies
documentation
duplicate
enhancement
github_actions
good first issue
help wanted
invalid
needs measurements
question
testing wanted
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
MagicBeanDev/Longshot!57
Loading…
Reference in a new issue
No description provided.
Delete branch "mooki/Longshot:fix/wide-loading-fade"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Why
Draft: this waits for ozwaldorf's Extended ultrawide work, then the pane-level replacement requested in the original review. No open or merged Longshot pull request for that dependency was found in the complete public title/body inventory checked during this move.
Centred ultrawide loading fades leave the scene visible in the side strips. This preserved mask-only proposal covers those strips, but also blurs or hides the loading indicator. It must not be merged as a complete visual fix. EjianYT identified and tested the bit-3 correction.
What changed
wide_sides()ingpu/vk/vk_framegen.cpp: keep only pause/system-background bit 1 out of the full-width mask: centred modes use0xdinstead of0x5; Full width remains0xf.nx2/oot_wide.pyandtests/test_wide_loading_fade.py: correct the canvas descriptions and add a game-free fixture compiling the actual renderer policy and HUD projection patch around authored state.README.mdanddocs/tested-configurations.md: preserve the historical evidence rows and documented icon trade-off. No shader, host API, pane hook, option ID or generated game code is added._CRT_SECURE_NO_WARNINGSbefore the fixture's headers, matching the other portable fixtures. The strict Windows-target check otherwise rejected its existingmemcpycalls. Warning flags and all behavioral assertions remain unchanged.Flags and settings
0xdinstead of0x5); Full width stays0xf1), unchangedlongshot_options.ini:ultrawide_menus0Full width,1Centred, blurred sides,2Centred, black bars; the latter two receive the mask change1, unchangedtests/test_wide_loading_fade.py --cxxg++; the suite supplies its selected compilertests/test_wide_loading_fade.py --source_CRT_SECURE_NO_WARNINGSin the generated fixturememcpycalls compile with the unchanged strict warning flagsNo environment switch is added or changed. The new fixture's fixed compiler arguments are
-std=c++20,-O2,-Wall,-Wextraand-Werror; they are not new configurable game/build settings, and the CRT repair does not weaken them. The existing README option-table choices/default remain unchanged, and the added README warning documents the mask-only trade-off. Consolidating its duplicated Ultrawide menus bullets remains owed with the pane replacement; this rebase does not pretend that review point is finished.Measurements
Branch state: on main
d725b3631982ed0035ea3ac9cbe1677e9fad260c; head58143b9df475a69dbfa80647ae687257d2edca4e; whole game-free suite on this head:511 passed, 1 failed, 20 skipped(maind725b3631982ed0035ea3ac9cbe1677e9fad260c:510 passed, 1 failed, 20 skipped); the commits are unchanged by rebases apart from the results table.The branch-state suite was run with the repository default compiler and six workers; only the local updater NU1100 reference-pack failure remains, as on its shared base. The full source suite includes the changed fixture, not a game or Windows execution.
The rules-only rebase preserved all four original author/date/message records, including the maintainer merge, all three patch entries and the byte-identical net source diff. Main subsequently gained the DLSS model settle fix and Testing-template changes; this branch merges cleanly and does not touch the DLSS implementation/check header. It remains on its tested base under the central-refresh policy. Older evidence below keeps the commits actually measured.
Retained migration-time measurements
main:
d4a69456c9(2026-11-12)this PR: fix/wide-loading-fade @
49a7c60bbePosted migration head: this branch @
71e34ec3d746e40642650a115c3d43c746543c81; the whole suite and interleaved behavior proof used49a7c60bbef0ee87276e6767dbbc5ad83d74864d, before the fixture-header-only commit.Hardware: Core i9-13900K, 96 GB RAM, Arch Linux 7.2.15-1-omarchy, Clang 23.1.3; no GPU used for the new checks.
Scene: authored 16:9/21:9 canvases in the compiled fixture, not a newly run game.
Method: two interleaved main/branch pairs with the same fixture and compiler; count its behavioral failures and report their median. Whole branch suite with the repository's default compiler; shared pinned-main suite. After the one-line CRT guard, only the changed fixture and failed Windows-target step were rerun, both passing; the earlier full suite is not relabelled as a new run.
d4a6945649a7c60bThe base suite was run once for all moved pull requests of this day, on that commit. Both sides fail
tests/test_updater_asset_digest.pywithNU1100, unable to resolve localMicrosoft.AspNetCore.App.Ref (= 10.0.13). The shared base also fails two bounded-time cases intests/test_appimage_package_retry.py; that test passes here. No package was installed and no failed run was discarded. Forgejo has no CI runner.The first Windows-target fixture capture failed five deprecated-
memcpydiagnostics. After the early CRT guard, its one captured translation unit passes with the same warnings-as-errors settings. That is syntax only, not native Windows execution. The historical GitHub Windows run at the pre-rename head is not a check of this Longshot head.Historical game evidence, not repeated: Hookshot base
51da0464, mask change7dc0773b, 2026-11-12, RTX 4090/NVIDIA 615.78.08 on this Linux PC. Six windowless runs at 4432x1856 or 3840x2160 showed full-width fade coverage and unchanged pause/Map centring. The 21:9 loading icon becomes a dim blur with blurred sides, disappears behind black bars, and is sharp but stretched in Full width. The first 16:9 route did not reach the actual Map; a later corrected route did. One startup virtual-core escape occurred in the first 16:9 run; all six had zero fatal/crash/device-loss/driver-fault counts. These were ordinary shared runs, not performance measurements.How to reproduce
How to reproduce: use the exact fixture/source matrix below; the historical visual route is separate.
For the recorded compiled comparison, use separate checkouts named
baselineatd4a69456c9de5131589af1fcf9a09adba4c403d1andcandidateat49a7c60bbef0ee87276e6767dbbc5ad83d74864d. From their parent directory, use the same Clang installation for all four commands, in this order; each invocation compiles and runs authored 16:9/21:9 canvas state, without a game or Vulkan device:Count the
FAIL:behavior lines per invocation and report the median for each source: the retained counts are 12/0/12/0. The baseline exits nonzero deliberately. The whole-suite command waspython -I -B tests/run_all.py --jobs 6 --strictin each named checkout, with a fresh HOME; the whole suites were single runs, not two interleaved suites. For the later CRT-only repair, use the fixture at71e34ec3d746e40642650a115c3d43c746543c81; only that fixture and the failed Windows-target step were repeated then.For visual reproduction, compare the historical Hookshot
main @ 51da0464and mask-onlythis PR @ 7dc0773bat the same Hyrule Field save-load and Hyrule Field/Kokiri transition, then pause and open the actual Map. Use the game's upscaler, frame generation off, no UI mod, 4432x1856 game picture for the wide case and 3840x2160 for the 16:9 control; compare Centred, blurred sides, Centred, black bars, and Full width. Inspect both fade coverage and the loading icon, not equal opacity or matching frame numbers. These are reproduction conditions for the retained captures, not a claim that this Longshot head or the pane prototype was run.Testing
Tested: Linux game-free checks on the branch-state head and shared base, with the default compiler, fresh isolated test environment and the full suite. Historical compiled main/branch pairs, Windows-target syntax, and the six inspected Hookshot visual/log runs retain their identities below; the visual runs were correctness checks, not speed measurements.
Not tested: No Longshot game build/run, fresh visual proof or performance measurement. The pane-level replacement is not in this branch. No Windows game, native Windows execution of the new fixture, physical ultrawide display, AMD/Intel/Deck, HDR or frame-generated output. No test request was posted during this move.
No new game build/run was requested for this dependency-held draft. This work was limited to windowless Linux checks; native Windows, physical ultrawide input/presentation and the other GPU systems above were not available for these runs.
The branch-state head has run the complete source suite, including the changed fixture. Windows-target syntax remains the earlier labelled capture, not a new Windows execution.
Tested but not measured: the six historical Hookshot windowless game runs on this Linux/RTX 4090 PC were ordinary shared runs. They provide the retained visual/log evidence, not FPS, frame-time, stutter or performance measurements. No current Longshot game has been run for this proposal.
Needs other testers:
Screenshots
Historical game labels:
main @ 51da0464is the baseline andthis PR @ 7dc0773bis the mask-only renderer change. They are not the current rebased Longshot commits or the migration-time fixture heads.Both retained original panels were inspected. They are not photographs of a Longshot build or of the separate pane prototype.
Risk and rollback
The original review's blocker is real: covering the fade by widening the whole canvas moves and stretches the icon too. A dark-pixel heuristic or an unproved pane patch is not included as a workaround.
The known risk is already visible: the default blurred-sides mode smudges the loading indicator at the edge, black bars hide it, and Full width leaves it sharp but stretched. Fade coverage alone is not a complete visual fix or permission to merge. Other hardware and output modes listed under Not tested have no runtime proof here.
This proposal adds no dedicated runtime opt-out. Revert the
wide_sides()mask-policy change (kMenusback to0xa, centred keep-mask back to0x5) to restore the prior behavior; that also restores the original exposed side strips during loading fades. Selecting Full width is not a centred-icon fix. No shader or host API rollback is needed.Reviewer notes
Start with
wide_sides()ingpu/vk/vk_framegen.cpp, the canvas descriptions/HUD patch innx2/oot_wide.py, thentests/test_wide_loading_fade.py. The early CRT definition changes fixture portability only; it leaves all behavioral assertions and warning flags intact.Still owed from hckrman101's review: keep the loading canvas centred and widen only its spanning fade pane on the dependency's per-pane path; follow its renumbered modes; fold the duplicated Ultrawide menus README bullets together; derive fixture addresses from
wide.KEEP_VTABLES; print failures for the grace-period/wheel checks; repeat 21:9 fade/icon pictures. Both sets of historical result rows are retained. The separate Hookshot pane prototype and its pictures are not silently substituted for this posted mask-only branch.The requested fix keeps the loading canvas squeezed and the icon sharp inside the middle 16:9, widening only the spanning fade pane through the dependency's existing per-pane path. That allows
kMenusto stay0xawith its comment corrected. The dependency renumbers Extended to 1 and centred modes to 2/3 (side = mode - 1), so the current fixture'sside == modeandmode ? 0xd : 0xfassumptions must change with that replacement. Both historical result-row sets remain; neither the README consolidation nor the fixture nits were silently done in a rules-only rebase. A reporter check on the real 3440x1440 display remains welcome, not claimed.This remains WIP waiting on the dependency and the reviewed pane-level direction, not a readiness request. The separate prototype and its different build identities remain in the carried discussion, not in this branch's proof.
Issues
Original report: https://github.com/NotRexed/Hookshot/issues/2220
Original draft/review: https://github.com/NotRexed/Hookshot/issues/2851
Dependency: https://github.com/NotRexed/Hookshot/issues/2843
On this forge: See #82 (this report) and See #64 (the broader HUD and menu layout proposal, which this does not close). Old GitHub numbers are not Forgejo issue numbers.
Checklist
For everyone
type(scope): description).main. Kept on the tested base under the central-refresh policy; Main handles a later refresh before ready.python -I -B tests/run_all.pyrun and passing (any failure that also fails onmainis named above). Exact rebased head checked; inherited NU1100 only.third_party/untouched (a new folder with aPROVENANCE.mdinstead).If applicable
Assisted-by:/Co-Authored-By:trailers.mainand passing here. Historical negative controls retained; the test also passes in the exact-head full suite.tests/that reads changed source updated in this PR, not weakened.Moved from NotRexed/Hookshot#2851.
Assisted-by: GPT-6 Astra
Co-Authored-By: GPT-6 Astra [email protected]
Discussion carried over from NotRexed/Hookshot#2851
Every comment that was readable on the original thread when it was copied on 2026-11-12, in order, unchanged except that issue and pull request numbers are written as links to the old repository and names carry no @. Comments by an account that has since been closed there could no longer be read and are missing; where a reply quotes them, the quote remains.
mooki000, 2026-11-12 17:21 UTC (comment, original):
Thanks for the thorough review, and for the merge of main. Agreed on all of it: the mask is the wrong grain, and a loading indicator that smudges or vanishes is not something to ship.
What I will do:
0xaand only its comment is corrected. I am reading NotRexed/Hookshot#2843's head now to see how Extended already treats this screen and will say here whether it needs little or turns out heavy, before writing more than a prototype.side == modeandmode ? 0xd : 0xfexpectations moved to the renumbered modes.wide.KEEP_VTABLES, and aFAIL:line for the grace-period and wheel checks.It stays a draft until then.
ozwaldorf, 2026-11-12 17:40 UTC (comment, original):
hckrman101 NotRexed/Hookshot#2843 should correctly handle these transitions already in extended mode! It doesn't fix them on the centered layouts though, but that should be fairly easy to bridge over support for
mooki000, 2026-11-12 20:06 UTC (comment, original):
The reporter's bit-3 diagnosis was right, but the fade needs to reach the sides without moving its icon into the blur or black bars.
Thanks hckrman101 and ozwaldorf. This is the centred-layout bridge ozwaldorf described as “fairly easy to bridge over support for”; NotRexed/Hookshot#2843 already handles Extended.
The small rule keeps mask
0xaand widens only a centred, canvas-spanning picture inLoadingFade_00, using the existing size hook. It matches the layout name and geometry, not a pane index; the four archive records are copies of the shared loading layout. A renamed layout or changed geometry in another game version would need updating.Before/after came from one binary,

9c8b4708on NotRexed/Hookshot#2843's9a4c0177, with a local opt-out that is not committed.Tested windowless on Arch Linux 7.2.15-1-omarchy, i9-13900K, RTX 4090/NVIDIA 615.78.08: actual 4432x1856 game picture, captured at 2216x928, no UI mod, game's upscaler, FG off; save load and Hyrule Field/Kokiri transitions.
Both centred modes now cover the strips while the icon stays sharp at the same position inside the middle 16:9; nothing else visible on the loading screen moved.
Two more panels, not attached, show the pause menu and the Map unchanged in both centred modes, and Extended checked once with its existing sharp edge icon unchanged.
The new regression fails 24 centred-width cases with both GCC and Clang before the rule and passes with both after it. Final suite: 502 passed, two known inherited failures (missing Skip opening README row and zstd fixture symbols), 20 skipped. Both Windows-target units compile; Windows execution still needs the fork run.
The isolated branch is now
fix/wide-loading-fade-on-2843at511abae4, rebased onto NotRexed/Hookshot#2843'sb1d47d31: its host/pane-hook source did not change; the fixture follows the option ID change 52→53. These are not pictures of a rebuilt b1d47d31 binary.NotRexed/Hookshot#2843 is still open and unreviewed and may change again; it must land first. So this pull request stays a draft with its old mask-only commit until NotRexed/Hookshot#2843 is in; then I replace it with this pane-level rule, rebased, after a Windows run of the project's checks in my fork.
16:9 and Full width are checked game-free for this prototype; the earlier 16:9 pictures belong to the mask-only stage, not a new runtime check of this rule. No performance claim.
71e34ec3d7to58143b9df4Updated the description to the current template: Testing with what was tested, what was not and which testers are needed, the whole checklist, and one block for the branch's base and suite. Rebased onto main
d725b363with the patches unchanged; whole suite on58143b9d: 511 passed, 1 failed, 20 skipped, the one failure being the local .NET reference pack that also fails on main. It merges cleanly with the newer main and stays work in progress for the pane-level dependency and the loading-icon regression.View command line instructions
Checkout
From your project repository, check out a new branch and test the changes.