Files

53 lines
2.2 KiB
Python

"""Write runtime/nvn_procs.inc: the NVN proc names TotK 1.2.1 loads.
Source names come from the MacNativeGames checkout in refs/ (MIT, Copyright (c) 2026 MacNativeGames contributors):
NVN/names.txt plus the NVN_EXTRA definitions of totk_nvn_ext.c, minus the two names 1.2.1 does not load. The file
list format follows d2r-mobile dm/gfx/tools/gen_protos.py (MIT). No game data is read.
Run with .venv: python tools/gen_nvn_procs.py
"""
import re
import sys
from pathlib import Path
ROOT = Path(__file__).resolve().parent.parent
NVN_DIR = ROOT / "refs/MacNativeGames/games/totk/third_party/d2r_gfx/gfx/nvn"
OUT = ROOT / "runtime/nvn_procs.inc"
NOT_LOADED = {"nvnDeviceApplyDeferredFinalizes", "nvnQueueAcquireTexture"}
SUBSDK0 = [ # section 0.1: asked by the movie library through nvnDeviceGetProcAddress
"nvnDeviceGetProcAddress",
"nvnSyncFinalize",
"nvnSyncGetNvRmSyncNVX",
"nvnSyncInitializeFromNvRmSyncNVX",
"nvnTextureGetNvRmSurfaceNVX",
]
MAIN_COUNT = 534
def main() -> int:
names = [n.strip() for n in (NVN_DIR / "names.txt").read_text(encoding="utf-8").splitlines() if n.strip()]
extras = re.findall(r"^NVN_EXTRA\((\w+)", (NVN_DIR / "totk_nvn_ext.c").read_text(encoding="utf-8"), re.M)
if len(extras) != 13:
print(f"expected 13 NVN_EXTRA names, found {len(extras)}", file=sys.stderr)
return 1
main_names = [n for n in names if n not in NOT_LOADED] + extras
if len(main_names) != len(set(main_names)) or len(main_names) != MAIN_COUNT:
print(f"expected {MAIN_COUNT} distinct main names, found {len(main_names)} "
f"({len(set(main_names))} distinct)", file=sys.stderr)
return 1
# nvnDeviceGetProcAddress is in both lists; keep one row per name.
extra_sub = [n for n in SUBSDK0 if n not in main_names]
rows = sorted(main_names) + sorted(extra_sub)
text = ("// Generated by tools/gen_nvn_procs.py: the NVN proc names of TotK 1.2.1.\n"
+ "".join(f"NVN_PROC({n})\n" for n in rows))
OUT.write_text(text, encoding="utf-8", newline="\n")
print(f"{OUT.relative_to(ROOT)}: {len(main_names)} main names + {len(extra_sub)} subsdk0-only names "
f"({len(SUBSDK0)} asked by subsdk0), {len(rows)} rows")
return 0
if __name__ == "__main__":
sys.exit(main())