diff options
-rw-r--r-- | intern/cycles/kernel/kernel_camera.h | 31 |
1 files changed, 26 insertions, 5 deletions
diff --git a/intern/cycles/kernel/kernel_camera.h b/intern/cycles/kernel/kernel_camera.h index e6d5714914c..ded222e20ff 100644 --- a/intern/cycles/kernel/kernel_camera.h +++ b/intern/cycles/kernel/kernel_camera.h @@ -16,6 +16,17 @@ CCL_NAMESPACE_BEGIN +/* Workaround for explicit conversion from constant to private memory + * pointer when using OpenCL. + * + * TODO(sergey): Find a real solution for this. + */ +#ifdef __KERNEL_OPENCL__ +# define __motion_as_decoupled_const_ptr(motion) ((motion)) +#else +# define __motion_as_decoupled_const_ptr(motion) ((const DecompMotionTransform*)(motion)) +#endif + /* Perspective Camera */ ccl_device float2 camera_sample_aperture(KernelGlobals *kg, float u, float v) @@ -68,8 +79,11 @@ ccl_device void camera_sample_perspective(KernelGlobals *kg, float raster_x, flo Transform cameratoworld = kernel_data.cam.cameratoworld; #ifdef __CAMERA_MOTION__ - if(kernel_data.cam.have_motion) - transform_motion_interpolate(&cameratoworld, (const DecompMotionTransform*)&kernel_data.cam.motion, ray->time); + if(kernel_data.cam.have_motion) { + transform_motion_interpolate(&cameratoworld, + __motion_as_decoupled_const_ptr(&kernel_data.cam.motion), + ray->time); + } #endif ray->P = transform_point(&cameratoworld, ray->P); @@ -129,8 +143,11 @@ ccl_device void camera_sample_orthographic(KernelGlobals *kg, float raster_x, fl Transform cameratoworld = kernel_data.cam.cameratoworld; #ifdef __CAMERA_MOTION__ - if(kernel_data.cam.have_motion) - transform_motion_interpolate(&cameratoworld, (const DecompMotionTransform*)&kernel_data.cam.motion, ray->time); + if(kernel_data.cam.have_motion) { + transform_motion_interpolate(&cameratoworld, + __motion_as_decoupled_const_ptr(&kernel_data.cam.motion), + ray->time); + } #endif ray->P = transform_point(&cameratoworld, ray->P); @@ -204,7 +221,9 @@ ccl_device void camera_sample_panorama(KernelGlobals *kg, float raster_x, float #ifdef __CAMERA_MOTION__ if(kernel_data.cam.have_motion) - transform_motion_interpolate(&cameratoworld, (const DecompMotionTransform*)&kernel_data.cam.motion, ray->time); + transform_motion_interpolate(&cameratoworld, + __motion_as_decoupled_const_ptr(&kernel_data.cam.motion), + ray->time); #endif ray->P = transform_point(&cameratoworld, ray->P); @@ -310,5 +329,7 @@ ccl_device_inline float3 camera_world_to_ndc(KernelGlobals *kg, ShaderData *sd, } } +#undef __motion_as_decoupled_const_ptr + CCL_NAMESPACE_END |