Cycles: Support Decomposed MetalRT motion interpolation

Currently MetalRT interpolates transformation matrix on per-element basis
which leads to issues like #135659.

This change adds implementation of for decomposed (Scale/Rotate/Translate)
motion interpolation, matching behavior of BVH2 and other HW-RT.

This requires macOS 15 and Xcode 16 in order to use this interpolation.
On older platforms and compilers old interpolation is used.

Currently there is no changes on the user (by default) and it is only
available via CYCLES_METALRT_PCMI environment variable. This is because
there are some issues with complex motion paths that need to be looked
into. Having code available makes it easier to do further debugging.

Ref #135659

Authored by Emma Liu

Pull Request: https://projects.blender.org/blender/blender/pulls/136253
This commit is contained in:
Michael Jones
2025-04-03 16:24:04 +02:00
committed by Sergey Sharybin
parent 59991e54f5
commit 326d5bca03
6 changed files with 178 additions and 52 deletions

View File

@@ -69,17 +69,21 @@ void DebugFlags::Metal::reset()
adaptive_compile = true;
}
if (auto *str = getenv("CYCLES_METAL_LOCAL_ATOMIC_SORT")) {
if (const char *str = getenv("CYCLES_METAL_LOCAL_ATOMIC_SORT")) {
use_local_atomic_sort = (atoi(str) != 0);
}
if (auto *str = getenv("CYCLES_METAL_NANOVDB")) {
if (const char *str = getenv("CYCLES_METAL_NANOVDB")) {
use_nanovdb = (atoi(str) != 0);
}
if (auto *str = getenv("CYCLES_METAL_ASYNC_PSO_CREATION")) {
if (const char *str = getenv("CYCLES_METAL_ASYNC_PSO_CREATION")) {
use_async_pso_creation = (atoi(str) != 0);
}
if (const char *str = getenv("CYCLES_METALRT_PCMI")) {
use_metalrt_pcmi = (atoi(str) != 0);
}
}
DebugFlags::OptiX::OptiX()