Files
HartOMat/flamenco/scripts/turntable_gpu_setup.py
T
2026-03-05 22:12:38 +01:00

75 lines
3.2 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""Blender GPU preferences setup for native animation render (-a).
Called as:
blender --background scene.blend --python turntable_gpu_setup.py -a
Reads the intended cycles_device from the scene custom property set by
turntable_setup.py, then applies the matching GPU compute device preferences.
GPU preferences are user-level and not stored in .blend, so they must be
re-applied at render time.
After this script runs, Blender processes -a and renders all animation frames
natively — keeping the GPU scene (BVH, textures) loaded across all frames.
"""
import bpy
scene = bpy.context.scene
cycles_device = scene.get("_cycles_device", "gpu")
denoiser_override = scene.get("_denoiser_override", "")
if scene.render.engine != 'CYCLES':
# EEVEE or other engine — no Cycles GPU preferences needed
print(f"[turntable_gpu] engine={scene.render.engine} — no Cycles GPU setup needed")
elif cycles_device == "cpu":
scene.cycles.device = 'CPU'
print("[turntable_gpu] Using CPU (explicit override)")
else:
gpu_found = False
try:
cycles_prefs = bpy.context.preferences.addons['cycles'].preferences
for device_type in ('OPTIX', 'CUDA', 'HIP', 'ONEAPI'):
try:
cycles_prefs.compute_device_type = device_type
cycles_prefs.get_devices()
gpu_devs = [d for d in cycles_prefs.devices if d.type != 'CPU']
if gpu_devs:
for d in gpu_devs:
d.use = True
scene.cycles.device = 'GPU'
gpu_found = True
# OptiX denoiser is fully GPU-native and faster than OIDN on NVIDIA.
# Fall back to OIDN (also GPU-accelerated) on CUDA/HIP.
if not denoiser_override:
if device_type == 'OPTIX':
try:
scene.cycles.denoiser = 'OPTIX'
print("[turntable_gpu] OptiX denoiser active (GPU-native)")
except Exception:
pass # Keep OIDN
else:
try:
scene.cycles.denoiser = denoiser_override
print(f"[turntable_gpu] Denoiser override: {denoiser_override}")
except Exception:
pass
# Blender 4.x+: explicitly route OIDN through GPU path
try:
scene.cycles.denoising_use_gpu = True
except AttributeError:
pass # Older Blender — OIDN uses GPU automatically when device=GPU
print(f"[turntable_gpu] Cycles GPU ({device_type}) — rendering {scene.frame_end - scene.frame_start + 1} frames")
break
except Exception:
continue
except Exception:
pass
if not gpu_found:
scene.cycles.device = 'CPU'
print("[turntable_gpu] WARNING: GPU not found — falling back to CPU")
print(f"[turntable_gpu] Output: {scene.render.filepath}#### (frames {scene.frame_start}{scene.frame_end})")