ba74bbd5aa
Per-vertex GS fog end-to-end (gs_stub emit incl. persp_emit5, gs_prim_list_feeder XYZ2->XYZF2 on PRIM.FGE, gs_make_sh3_scheduler_fixture.py F/FGE packing), new fog TBs, fidelity attribution tooling. Functional baseline before removing the dead bilinear lerp8 clamps (Codex: 161-node comb loop -> -0.042ns setup fail). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
57 lines
2.1 KiB
Python
Executable File
57 lines
2.1 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
"""Backfill authentic TEST_1/ZBUF_1 words into an existing scheduler fixture.
|
|
|
|
Ch357-Ch404 fixtures used placeholder words because the board wrapper supplied
|
|
ZTE/ZMSK constants to the external LPDDR ROP. Ch405 carries that state from
|
|
the feeder list, so accepted fixture geometry can be retained byte-for-byte
|
|
while only header words 3 and 4 are restored from the capture.
|
|
"""
|
|
import os
|
|
import sys
|
|
|
|
HERE = os.path.dirname(os.path.abspath(__file__))
|
|
ROOT = os.path.normpath(os.path.join(HERE, ".."))
|
|
DATA = os.path.join(ROOT, "sim", "data", "top_psmct32_raster_demo")
|
|
sys.path.insert(0, HERE)
|
|
import gs_make_sh3_multidraw_fixture as MD
|
|
|
|
|
|
def rows(path):
|
|
with open(path, encoding="utf-8") as f:
|
|
for line in f:
|
|
s = line.strip()
|
|
if s and not s.startswith("#") and not s.startswith("META"):
|
|
fields = s.split()
|
|
if fields[0].isdigit():
|
|
yield int(fields[1]), fields[8]
|
|
|
|
|
|
def main(argv):
|
|
if len(argv) < 3:
|
|
raise SystemExit("usage: patch_runtime_sched_zstate.py dump.gs.zst epochs.txt [epochs.txt ...]")
|
|
dump = argv[1]
|
|
tables = argv[2:]
|
|
entries = [(idx, name) for table in tables for idx, name in rows(table)]
|
|
got, _ = MD.load_draws(dump, [idx for idx, _ in entries])
|
|
for idx, name in entries:
|
|
if idx not in got:
|
|
raise SystemExit(f"missing captured draw idx{idx}")
|
|
path = os.path.join(DATA, name)
|
|
with open(path, encoding="utf-8") as f:
|
|
lines = f.readlines()
|
|
slots = [i for i, line in enumerate(lines)
|
|
if line.strip() and not line.lstrip().startswith("//")]
|
|
if len(slots) < 5:
|
|
raise SystemExit(f"{name}: truncated staging image")
|
|
state = got[idx]["state"]
|
|
lines[slots[3]] = f"{state['test'] & 0xffffffffffffffff:016x}\n"
|
|
lines[slots[4]] = f"{state['zbuf'] & 0xffffffffffffffff:016x}\n"
|
|
with open(path, "w", encoding="utf-8") as f:
|
|
f.writelines(lines)
|
|
print(f"[zstate] {name}: idx{idx} TEST={state['test']:016x} ZBUF={state['zbuf']:016x}")
|
|
return 0
|
|
|
|
|
|
if __name__ == "__main__":
|
|
raise SystemExit(main(sys.argv))
|