Repository navigation
Replies: 12 comments
|
Thanks for writing this up. Turning "prefer the general fix" into a measurable gap, with a generated work list, is the direction I'd hoped for, and it gives reviews something concrete to point at. One rule I'd add: every locator fails closed. On your questions:
Two smaller points:
|
|
Thanks, this sharpens it. Since you wrote, the first part landed in ed0360b:
|
|
The four follow-ups landed in 17f670a:
|
|
Two more steps landed:
|
|
Two more commits landed:
|
|
One more step landed:
|
|
Two more steps landed:
Next: the remaining SDK rows (12f16103, 311deab1, 9c73fb73, e01950c5) with Brain Memory Training Academy, Ace Attorney Investigations Collection, Hollow Knight: Silksong and Patrick's Parabox. |
|
6059cba, the last four SDK rows: Ace Attorney Investigations Collection's (311deab1), Brain Memory Training Academy's (12f16103) and Patrick's Parabox's (9c73fb73) give way to the SDK-wide rules, which add the 2 MB alignment to the row's node area cut. Hollow Knight: Silksong's (e01950c5) rewrites byte-identical with the rules (its SDK 20 placement aligns to 2 MB itself).
Next on the gap list: Subnautica's bucket allocator and FFCC's ThreadedStreamBuffer race (Unity 2019 / 2018.4, now that their files are back), then a multi-function frame step for ASTRAL CHAIN, Tears of the Kingdom, Breath of the Wild and Age of Calamity. |
|
2c2c549 + 56e4f2a, engine-wide rules for three more games' build cuts:
The three |
|
143c0d0, frame steps across several functions: the multi-function mechanism already existed (
Side finding: BotW's widescreen stubs patch |
|
a9ee247, NieR:Automata: both releases' cuts and the host's fixed-address table stay build-bound, now marked |
|
06973c5, the vertex-shader ballot lowering: kept as Tears of the Kingdom's single-shader rule. The shader-build logs of the 51 game builds on the drive show no shader failing to translate or compile and no subgroup operation, so the only shader that needs the lowering is TotK's, which the rule already handles. A general lowering (subgroups of one invocation for ballots, votes, lane ids and counts, refusing shuffles) would be a chain change, every game's shaders rebuilt, for no measured gain; it is worth revisiting when a vertex shader with subgroup operations fails in another game. |
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Goal
Keep game-specific code to the minimum. Every per-build patch has to be redone for each new game version (#375: Smash 13.0.1 lost its cuts). A general mechanism covers games and updates nobody has seen yet. This issue proposes rules for how general each patch must be, with a classification of every patch we have today (docs/agents/game-patches.md), and asks for input before the classes go into the patch files.
Binding: what a patch depends on
A patch's binding is what its correctness is anchored to. From the loosest to the tightest:
sdkmodule)MATCH_CUTS)A second axis is the purpose: address space (an iPhone's ~6 GB), race (a race or timing problem the host exposes), frame rate / resolution (an enhancement), power.
Rules (proposed)
patch_nso.pyand passed to the host through the fixups. No fixed-address tables indm/host.CUTSrow is fine for a bring-up; it should name the binding it can move to.regress.py check. Keys stay per game only for real per-game data or decisions.sdk_patches.pyholds fixes every game shipping that SDK build needs. A tuning one game needs goes in that game's profile.GENERALIZEnote, anddocs_patches.pylists the gaps.Where each patch stands
The classification lives with the patches and is generated, so it cannot drift: each patch file's
BINDINGtable, anddm/tools/docs_patches.pyfor the host's build-keyed rows, translator rules and profile switches. The page is docs/agents/game-patches.md:Status is computed: at goal, gap, blocked (with the reason it cannot close yet) or kept (left open on purpose, with the decision). Evidence is checked (what was checked on game files, and when) or judgement.
test_patches.pyfails when a patch file has noBINDINGor when an entry's goal is tighter than its binding now, and the generator stops on any unclassified host row, translator rule or switch.The page shows this once the change that adds
BINDINGis onmain.Proposed order
k_locks' Unreal rows,k_ueand the UnrealCUTS/OBS.BINDINGin every patch file;docs_patches.pylists the gaps.regress.py check.game-bound patches, as updates come.Input wanted
dm_ue_cvardoes now), or should all discovery move to the rewriter?build-bound on purpose, so that a game update never inherits a 60 fps change nobody checked?All reactions