Files
NX2navi/tools/shader_list.py
chrg6 e7f6a00407 Translate every shader, keep atomic loops from spinning on stale values, harden pool teardown, and update the README.
Shaders: a switch whose index is clamped against a register that a MOV of an immediate set before it now finds its
jump table (AmpereLowering.cs BrxTargets), so all 36,031 of the game's shader variants translate and no draw is skipped
for a failed one. The compare-and-swap loop behind storage-buffer atomics (patch 0033) takes the value a failed swap
returns as its next expected value instead of loading the word again, which on some drivers kept returning a stale
copy.

Memory: an unused physical pool outlives the submission being recorded, as virtual pages may still reach it through
device addresses; an image whose creation failed is not tried again for 2 s.

The installer and Linux texts name this game.
The README has the project icon, the current status, features, requirements and known issues.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 18:03:20 -05:00

42 lines
2.2 KiB
Python

"""The shared shader list (games/<game>/assets/shader_list.tsv in the refs/MacNativeGames checkout; MIT, see THIRD_PARTY_NOTICES.md) as our tools
read it: every row of one revision, plus the V rows of every older revision that it dropped.
The list drops V rows its producer's runtime no longer needs: default variants, which that runtime translates for every
shader (dropped 2026-10-22 to 2026-10-25), and variants that differ only in vertex input or colour
output types (2026-10-26). Our answers (runtime/gfx_shader.c) still tell those apart, so a dropped row names a variant
our play meets: at 1340bee the list alone has 134 rows of 1.4.3 shaders, its history 24,839, and of 1.2.1 6,771 and
25,238. A row no draw asks for costs one translation. No copy of the list goes into the repository.
"""
import subprocess
import sys
TAIL = '/assets/shader_list.tsv' # under the checkout's game folder (see list_path)
def list_path(repo, rev):
"""The shader list's path at rev: the one games/<game>/assets/shader_list.tsv of the checkout."""
for p in git(repo, 'ls-tree', '-r', '--name-only', rev, '--', 'games').splitlines():
if p.endswith(TAIL) and p.count('/') == 3:
return p
raise SystemExit(f'shader_list.py: no games/*{TAIL} at {rev}')
def git(repo, *args):
return subprocess.run(['git', '-C', str(repo), *args], check=True, capture_output=True, encoding='utf-8').stdout
def history(repo, rev='origin/HEAD'):
"""rev's list, then each V row of an older revision that no newer one has, newest first."""
if git(repo, 'rev-parse', '--is-shallow-repository').strip() == 'true':
# a shallow clone has rev's list only: preparing from it skips most variants and shows only as stutter in play
sys.exit(f'{repo} is a shallow clone without the shader list\'s history; run tools/fetch_refs.sh')
PATH = list_path(repo, rev)
lines = git(repo, 'show', f'{rev}:{PATH}').splitlines()
seen = set(lines)
for h in git(repo, 'log', '--format=%H', rev, '--', PATH).split()[1:]:
for line in git(repo, 'show', f'{h}:{PATH}').splitlines():
if line.startswith('V\t') and line not in seen:
seen.add(line)
lines.append(line)
return '\n'.join(lines) + '\n'