54 lines
1.9 KiB
Python
54 lines
1.9 KiB
Python
#!/usr/bin/env python3
|
|
"""probe_lut.py — one-shot probe of [ctx+0x180] LUT params during render."""
|
|
import struct, subprocess, sys, time
|
|
import glob, os
|
|
|
|
def find_host():
|
|
for p in glob.glob('/proc/[0-9]*'):
|
|
pid = int(os.path.basename(p))
|
|
try:
|
|
cmd = open(f'/proc/{pid}/cmdline','rb').read().replace(b'\0',b' ').decode('utf8','replace')
|
|
maps = open(f'/proc/{pid}/maps').read()
|
|
except Exception:
|
|
continue
|
|
if 'soothe2' in maps and 'reaper' not in cmd:
|
|
return pid
|
|
return None
|
|
|
|
subprocess.run("pkill -9 -x reaper; pkill -9 -f '[y]abridge'; "
|
|
"rm -rf /run/user/1000/yabridge-soothe2_x64-*; sleep 1", shell=True)
|
|
rpp = sys.argv[1] if len(sys.argv) > 1 else '/home/m/soothe-bt/dual_b1q_0.5.rpp'
|
|
proc = subprocess.Popen(['/usr/bin/reaper','-nosplash','-ignoreerrors','-renderproject', rpp],
|
|
stdout=open('/dev/null','w'), stderr=subprocess.STDOUT)
|
|
t0=time.time(); host=None
|
|
while time.time()-t0<30 and not host:
|
|
host=find_host(); time.sleep(0.001)
|
|
print('host',host, flush=True)
|
|
if not host:
|
|
sys.exit(1)
|
|
fd=os.open(f'/proc/{host}/mem',os.O_RDONLY)
|
|
def rd(a,n):
|
|
try: return os.pread(fd,n,a)
|
|
except OSError: return None
|
|
ctx=0x2370040
|
|
best=None
|
|
while time.time()-t0 < 12:
|
|
b=rd(ctx+0x180,8)
|
|
v=struct.unpack('<Q',b)[0] if b else 0
|
|
if 0x10000 < v < 0x7ffff0000000:
|
|
s=rd(v,0x18)
|
|
if s:
|
|
A,B=struct.unpack('<ff',s[0:8]); G=struct.unpack('<f',s[12:16])[0]
|
|
m=s[16]
|
|
q90=rd(v+0x90,8)
|
|
p90=struct.unpack('<Q',q90)[0] if q90 else 0
|
|
rec=(A,B,G,m,p90)
|
|
if best is None or rec!=best:
|
|
best=rec
|
|
print('t=%.2f [ctx+180]=%x A=%.6g B=%.6g G=%.6g mode=%d vt90=%x' %
|
|
(time.time()-t0,v,A,B,G,m,p90), flush=True)
|
|
else:
|
|
print('t=%.2f [ctx+180]=%x (not ptr)' % (time.time()-t0,v), flush=True)
|
|
time.sleep(0.05)
|
|
os.close(fd)
|