"""Opt-in GPU checks for wire color, history eligibility, padding and immutable inputs.""" import os from pathlib import Path import struct import subprocess import tempfile import unittest ROOT = Path(__file__).resolve().parents[1] @unittest.skipUnless(os.environ.get('D4R_RUN_GPU_TESTS') == '1', 'opt-in GPU test') class WireHistoryGpuTests(unittest.TestCase): def test_wire_source_history_reset_and_expiry(self): runner = os.environ['D4R_DUMP_RUNNER'] kernel = Path(os.environ.get('D4R_WIRE_TEST_KERNEL', str(ROOT / 'build/wine-nvcuda/generated' / (os.environ.get('D4R_GPU_ARCH', 'gfx1101') + '.hsaco')))) w, h = 65, 67 # partial workgroups on both axes pitch, dp, mp = w*8+16, w*4+12, w*4+20 pixels = w*h rgba = struct.pack('<4e', .5, .5, .5, .5) observed = struct.pack('<4e', .125, .125, .125, .75) repaired = struct.pack('<4e', .125, .125, .125, .5) current = b''.join(rgba*w + b'\xa5'*16 for _ in range(h)) color = b''.join(observed*w + b'\xa5'*16 for _ in range(h)) native = b''.join(struct.pack('<'+'f'*w, *[.5 if x == 32 else 1. for x in range(w)]) + b'\xa5'*12 for _ in range(h)) motion = b''.join(b'\0'*(w*4) + b'\xa5'*20 for _ in range(h)) for sky_only in (False, True): for conservative in (False, True): for sparse in (False, True): for mode in ('source', 'history', 'reset', 'expired', 'disoccluded', 'missing', 'neighbor', 'far', 'backdrop'): for jitter in (0, -1, 1): with self.subTest(mode=mode, jitter=jitter, conservative=conservative, sparse=sparse, sky_only=sky_only), tempfile.TemporaryDirectory() as tmp: directory = Path(tmp); output = directory/'out'; output.mkdir() source = mode in ('source', 'backdrop') history = mode in ('history', 'expired', 'disoccluded', 'neighbor') z = .999988 if mode == 'far' else .5 near = b''.join(struct.pack('<'+'f'*w, *[z if x == 32 else .9 if mode == 'backdrop' else 1. for x in range(w)]) + b'\xa5'*12 for _ in range(h)) previous = color if mode == 'neighbor': previous = b''.join(b''.join(observed if x == 32-jitter else struct.pack('<4e', .01, .01, .01, .75) for x in range(w)) + b'\xa5'*16 for _ in range(h)) input_depth = b''.join(struct.pack('