Files
UniXNU/scripts/save-turnip-gmem-patch.py
rpone e291c50b6e chore(drivers): bump Adreno740 and AdrenoMetal to their main
The Turnip patch keeps the new files the pass record adds
(tu_cmd_buffer.h, tu_pipeline.cc, tu_pipeline.h), and a linear image is
no longer mutable for the code that loads and stores it through tile
memory, so its swap is not applied twice on the way to memory.
2026-11-01 05:35:00 +08:00

50 lines
2.2 KiB
Python

#!/usr/bin/env python3
"""Regenerate patches/mesa/turnip-gmem-mutable-swap.patch from the working Mesa tree.
The patch is the difference between "pinned Mesa + the earlier recorded patches" and the working tree for the files it
touches (the swap of a linear mutable view in GMEM loads and stores, and the render pass telemetry), so it applies last. Edit the Mesa
tree, run this, then run build-adreno-compiler-host.py to prove the tree equals the recorded patches."""
import json
from pathlib import Path
import shutil
import subprocess
import tempfile
ROOT = Path(__file__).resolve().parents[1]
MESA = ROOT / '.cache/mesa-work'
MINE = ['src/freedreno/fdl/fd6_view.cc', 'src/freedreno/vulkan/tu_clear_blit.cc', 'src/freedreno/vulkan/tu_cmd_buffer.cc',
'src/freedreno/vulkan/tu_clear_blit.h', 'src/freedreno/vulkan/tu_knl_darwin.cc', 'src/freedreno/vulkan/tu_cmd_buffer.h',
'src/freedreno/vulkan/tu_pipeline.cc', 'src/freedreno/vulkan/tu_pipeline.h']
OUT = ROOT / 'patches/mesa/turnip-gmem-mutable-swap.patch'
listed = json.loads((ROOT / 'scripts/data/adreno-compiler-inputs.json').read_text())['patches']
others = listed[:listed.index(str(OUT.relative_to(ROOT)))]
def git(tmp, *args, check=True):
return subprocess.run(['git', '-c', 'user.email=a@b', '-c', 'user.name=n', *args], cwd=tmp, check=check,
capture_output=True, text=True).stdout
tmp = Path(tempfile.mkdtemp(dir=ROOT / '.cache'))
try:
git(tmp, 'init', '-q')
for f in MINE:
shown = subprocess.run(['git', 'show', 'HEAD:' + f], cwd=MESA, capture_output=True)
if shown.returncode: # a file an earlier recorded patch creates
continue
(tmp / f).parent.mkdir(parents=True, exist_ok=True)
(tmp / f).write_bytes(shown.stdout)
git(tmp, 'add', '-A')
git(tmp, 'commit', '-q', '-m', 'base')
for patch in others:
for f in MINE:
git(tmp, 'apply', '--include=' + f, str(ROOT / patch), check=False)
git(tmp, 'add', '-A')
git(tmp, 'commit', '-q', '-m', 'others', '--allow-empty')
for f in MINE:
shutil.copy(MESA / f, tmp / f)
OUT.write_text(git(tmp, 'diff', '--binary'))
finally:
shutil.rmtree(tmp)
print('wrote', OUT.relative_to(ROOT), len(OUT.read_text().splitlines()), 'lines')