Fix T94050, T94570, T94527: Cycles Bevel and AO nodes not working with Metal

Workaround what may be a compiler bug, solution found by Michael Jones.
This commit is contained in:
Brecht Van Lommel 2022-01-13 00:23:00 +01:00
parent a3deef6fff
commit 0cf2fafd81
Notes: blender-bot 2023-02-14 08:40:26 +01:00
Referenced by issue #94570, Cycles Metal: Material with the 'Image Texture' and 'Ambient Occlusion' nodes turns black
Referenced by issue #94527, UV issue with Cycles GPU rendering on Apple M1 Pro (Seems related to Bevel node + Texture Image)
Referenced by issue #94050, Bug Ambient Occlusion +Texture not working. Apple M1 GPU Rendering
1 changed files with 13 additions and 0 deletions

View File

@ -243,6 +243,10 @@ ccl_gpu_kernel(GPU_KERNEL_BLOCK_NUM_THREADS, GPU_KERNEL_MAX_REGISTERS)
}
}
#ifdef __KERNEL_METAL__
constant int __dummy_constant [[function_constant(0)]];
#endif
ccl_gpu_kernel(GPU_KERNEL_BLOCK_NUM_THREADS, GPU_KERNEL_MAX_REGISTERS)
ccl_gpu_kernel_signature(integrator_shade_surface_raytrace,
ccl_global const int *path_index_array,
@ -253,7 +257,16 @@ ccl_gpu_kernel(GPU_KERNEL_BLOCK_NUM_THREADS, GPU_KERNEL_MAX_REGISTERS)
if (global_index < work_size) {
const int state = (path_index_array) ? path_index_array[global_index] : global_index;
#ifdef __KERNEL_METAL__
KernelGlobals kg = NULL;
/* Workaround Ambient Occlusion and Bevel nodes not working with Metal.
* Dummy offset should not affect result, but somehow fixes bug! */
kg += __dummy_constant;
ccl_gpu_kernel_call(integrator_shade_surface_raytrace(kg, state, render_buffer));
#else
ccl_gpu_kernel_call(integrator_shade_surface_raytrace(NULL, state, render_buffer));
#endif
}
}