forked from bartvdbraak/blender
Cycles: remove workaround to pass ray by value
CUDA is working correct without it now, and it's more efficient not to do this. Ref D5363
This commit is contained in:
parent
edbb755dfe
commit
db257e679a
@ -177,24 +177,23 @@ ccl_device_inline bool scene_intersect_valid(const Ray *ray)
|
|||||||
return isfinite_safe(ray->P.x) && isfinite_safe(ray->D.x);
|
return isfinite_safe(ray->P.x) && isfinite_safe(ray->D.x);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Note: ray is passed by value to work around a possible CUDA compiler bug. */
|
|
||||||
ccl_device_intersect bool scene_intersect(KernelGlobals *kg,
|
ccl_device_intersect bool scene_intersect(KernelGlobals *kg,
|
||||||
const Ray ray,
|
const Ray *ray,
|
||||||
const uint visibility,
|
const uint visibility,
|
||||||
Intersection *isect)
|
Intersection *isect)
|
||||||
{
|
{
|
||||||
PROFILING_INIT(kg, PROFILING_INTERSECT);
|
PROFILING_INIT(kg, PROFILING_INTERSECT);
|
||||||
|
|
||||||
if (!scene_intersect_valid(&ray)) {
|
if (!scene_intersect_valid(ray)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
#ifdef __EMBREE__
|
#ifdef __EMBREE__
|
||||||
if (kernel_data.bvh.scene) {
|
if (kernel_data.bvh.scene) {
|
||||||
isect->t = ray.t;
|
isect->t = ray->t;
|
||||||
CCLIntersectContext ctx(kg, CCLIntersectContext::RAY_REGULAR);
|
CCLIntersectContext ctx(kg, CCLIntersectContext::RAY_REGULAR);
|
||||||
IntersectContext rtc_ctx(&ctx);
|
IntersectContext rtc_ctx(&ctx);
|
||||||
RTCRayHit ray_hit;
|
RTCRayHit ray_hit;
|
||||||
kernel_embree_setup_rayhit(ray, ray_hit, visibility);
|
kernel_embree_setup_rayhit(*ray, ray_hit, visibility);
|
||||||
rtcIntersect1(kernel_data.bvh.scene, &rtc_ctx.context, &ray_hit);
|
rtcIntersect1(kernel_data.bvh.scene, &rtc_ctx.context, &ray_hit);
|
||||||
if (ray_hit.hit.geomID != RTC_INVALID_GEOMETRY_ID &&
|
if (ray_hit.hit.geomID != RTC_INVALID_GEOMETRY_ID &&
|
||||||
ray_hit.hit.primID != RTC_INVALID_GEOMETRY_ID) {
|
ray_hit.hit.primID != RTC_INVALID_GEOMETRY_ID) {
|
||||||
@ -207,42 +206,43 @@ ccl_device_intersect bool scene_intersect(KernelGlobals *kg,
|
|||||||
#ifdef __OBJECT_MOTION__
|
#ifdef __OBJECT_MOTION__
|
||||||
if (kernel_data.bvh.have_motion) {
|
if (kernel_data.bvh.have_motion) {
|
||||||
# ifdef __HAIR__
|
# ifdef __HAIR__
|
||||||
if (kernel_data.bvh.have_curves)
|
if (kernel_data.bvh.have_curves) {
|
||||||
return bvh_intersect_hair_motion(kg, &ray, isect, visibility);
|
return bvh_intersect_hair_motion(kg, ray, isect, visibility);
|
||||||
|
}
|
||||||
# endif /* __HAIR__ */
|
# endif /* __HAIR__ */
|
||||||
|
|
||||||
return bvh_intersect_motion(kg, &ray, isect, visibility);
|
return bvh_intersect_motion(kg, ray, isect, visibility);
|
||||||
}
|
}
|
||||||
#endif /* __OBJECT_MOTION__ */
|
#endif /* __OBJECT_MOTION__ */
|
||||||
|
|
||||||
#ifdef __HAIR__
|
#ifdef __HAIR__
|
||||||
if (kernel_data.bvh.have_curves)
|
if (kernel_data.bvh.have_curves) {
|
||||||
return bvh_intersect_hair(kg, &ray, isect, visibility);
|
return bvh_intersect_hair(kg, ray, isect, visibility);
|
||||||
|
}
|
||||||
#endif /* __HAIR__ */
|
#endif /* __HAIR__ */
|
||||||
|
|
||||||
#ifdef __KERNEL_CPU__
|
#ifdef __KERNEL_CPU__
|
||||||
|
|
||||||
# ifdef __INSTANCING__
|
# ifdef __INSTANCING__
|
||||||
if (kernel_data.bvh.have_instancing)
|
if (kernel_data.bvh.have_instancing) {
|
||||||
return bvh_intersect_instancing(kg, &ray, isect, visibility);
|
return bvh_intersect_instancing(kg, ray, isect, visibility);
|
||||||
|
}
|
||||||
# endif /* __INSTANCING__ */
|
# endif /* __INSTANCING__ */
|
||||||
|
return bvh_intersect(kg, ray, isect, visibility);
|
||||||
return bvh_intersect(kg, &ray, isect, visibility);
|
|
||||||
#else /* __KERNEL_CPU__ */
|
#else /* __KERNEL_CPU__ */
|
||||||
|
|
||||||
# ifdef __INSTANCING__
|
# ifdef __INSTANCING__
|
||||||
return bvh_intersect_instancing(kg, &ray, isect, visibility);
|
return bvh_intersect_instancing(kg, ray, isect, visibility);
|
||||||
# else
|
# else
|
||||||
return bvh_intersect(kg, &ray, isect, visibility);
|
return bvh_intersect(kg, ray, isect, visibility);
|
||||||
# endif /* __INSTANCING__ */
|
# endif /* __INSTANCING__ */
|
||||||
|
|
||||||
#endif /* __KERNEL_CPU__ */
|
#endif /* __KERNEL_CPU__ */
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef __BVH_LOCAL__
|
#ifdef __BVH_LOCAL__
|
||||||
/* Note: ray is passed by value to work around a possible CUDA compiler bug. */
|
|
||||||
ccl_device_intersect bool scene_intersect_local(KernelGlobals *kg,
|
ccl_device_intersect bool scene_intersect_local(KernelGlobals *kg,
|
||||||
const Ray ray,
|
const Ray *ray,
|
||||||
LocalIntersection *local_isect,
|
LocalIntersection *local_isect,
|
||||||
int local_object,
|
int local_object,
|
||||||
uint *lcg_state,
|
uint *lcg_state,
|
||||||
@ -250,7 +250,7 @@ ccl_device_intersect bool scene_intersect_local(KernelGlobals *kg,
|
|||||||
{
|
{
|
||||||
PROFILING_INIT(kg, PROFILING_INTERSECT_LOCAL);
|
PROFILING_INIT(kg, PROFILING_INTERSECT_LOCAL);
|
||||||
|
|
||||||
if (!scene_intersect_valid(&ray)) {
|
if (!scene_intersect_valid(ray)) {
|
||||||
local_isect->num_hits = 0;
|
local_isect->num_hits = 0;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -264,19 +264,19 @@ ccl_device_intersect bool scene_intersect_local(KernelGlobals *kg,
|
|||||||
ctx.sss_object_id = local_object;
|
ctx.sss_object_id = local_object;
|
||||||
IntersectContext rtc_ctx(&ctx);
|
IntersectContext rtc_ctx(&ctx);
|
||||||
RTCRay rtc_ray;
|
RTCRay rtc_ray;
|
||||||
kernel_embree_setup_ray(ray, rtc_ray, PATH_RAY_ALL_VISIBILITY);
|
kernel_embree_setup_ray(*ray, rtc_ray, PATH_RAY_ALL_VISIBILITY);
|
||||||
|
|
||||||
/* Get the Embree scene for this intersection. */
|
/* Get the Embree scene for this intersection. */
|
||||||
RTCGeometry geom = rtcGetGeometry(kernel_data.bvh.scene, local_object * 2);
|
RTCGeometry geom = rtcGetGeometry(kernel_data.bvh.scene, local_object * 2);
|
||||||
if (geom) {
|
if (geom) {
|
||||||
float3 P = ray.P;
|
float3 P = ray->P;
|
||||||
float3 dir = ray.D;
|
float3 dir = ray->D;
|
||||||
float3 idir = ray.D;
|
float3 idir = ray->D;
|
||||||
const int object_flag = kernel_tex_fetch(__object_flag, local_object);
|
const int object_flag = kernel_tex_fetch(__object_flag, local_object);
|
||||||
if (!(object_flag & SD_OBJECT_TRANSFORM_APPLIED)) {
|
if (!(object_flag & SD_OBJECT_TRANSFORM_APPLIED)) {
|
||||||
Transform ob_itfm;
|
Transform ob_itfm;
|
||||||
rtc_ray.tfar = bvh_instance_motion_push(
|
rtc_ray.tfar = bvh_instance_motion_push(
|
||||||
kg, local_object, &ray, &P, &dir, &idir, ray.t, &ob_itfm);
|
kg, local_object, ray, &P, &dir, &idir, ray->t, &ob_itfm);
|
||||||
/* bvh_instance_motion_push() returns the inverse transform but
|
/* bvh_instance_motion_push() returns the inverse transform but
|
||||||
* it's not needed here. */
|
* it's not needed here. */
|
||||||
(void)ob_itfm;
|
(void)ob_itfm;
|
||||||
@ -299,10 +299,10 @@ ccl_device_intersect bool scene_intersect_local(KernelGlobals *kg,
|
|||||||
# endif /* __EMBREE__ */
|
# endif /* __EMBREE__ */
|
||||||
# ifdef __OBJECT_MOTION__
|
# ifdef __OBJECT_MOTION__
|
||||||
if (kernel_data.bvh.have_motion) {
|
if (kernel_data.bvh.have_motion) {
|
||||||
return bvh_intersect_local_motion(kg, &ray, local_isect, local_object, lcg_state, max_hits);
|
return bvh_intersect_local_motion(kg, ray, local_isect, local_object, lcg_state, max_hits);
|
||||||
}
|
}
|
||||||
# endif /* __OBJECT_MOTION__ */
|
# endif /* __OBJECT_MOTION__ */
|
||||||
return bvh_intersect_local(kg, &ray, local_isect, local_object, lcg_state, max_hits);
|
return bvh_intersect_local(kg, ray, local_isect, local_object, lcg_state, max_hits);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -377,15 +377,18 @@ ccl_device_intersect bool scene_intersect_volume(KernelGlobals *kg,
|
|||||||
if (!scene_intersect_valid(ray)) {
|
if (!scene_intersect_valid(ray)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
# ifdef __OBJECT_MOTION__
|
# ifdef __OBJECT_MOTION__
|
||||||
if (kernel_data.bvh.have_motion) {
|
if (kernel_data.bvh.have_motion) {
|
||||||
return bvh_intersect_volume_motion(kg, ray, isect, visibility);
|
return bvh_intersect_volume_motion(kg, ray, isect, visibility);
|
||||||
}
|
}
|
||||||
# endif /* __OBJECT_MOTION__ */
|
# endif /* __OBJECT_MOTION__ */
|
||||||
|
|
||||||
# ifdef __KERNEL_CPU__
|
# ifdef __KERNEL_CPU__
|
||||||
# ifdef __INSTANCING__
|
# ifdef __INSTANCING__
|
||||||
if (kernel_data.bvh.have_instancing)
|
if (kernel_data.bvh.have_instancing) {
|
||||||
return bvh_intersect_volume_instancing(kg, ray, isect, visibility);
|
return bvh_intersect_volume_instancing(kg, ray, isect, visibility);
|
||||||
|
}
|
||||||
# endif /* __INSTANCING__ */
|
# endif /* __INSTANCING__ */
|
||||||
return bvh_intersect_volume(kg, ray, isect, visibility);
|
return bvh_intersect_volume(kg, ray, isect, visibility);
|
||||||
# else /* __KERNEL_CPU__ */
|
# else /* __KERNEL_CPU__ */
|
||||||
@ -422,15 +425,18 @@ ccl_device_intersect uint scene_intersect_volume_all(KernelGlobals *kg,
|
|||||||
rtcOccluded1(kernel_data.bvh.scene, &rtc_ctx.context, &rtc_ray);
|
rtcOccluded1(kernel_data.bvh.scene, &rtc_ctx.context, &rtc_ray);
|
||||||
return rtc_ray.tfar == -INFINITY;
|
return rtc_ray.tfar == -INFINITY;
|
||||||
}
|
}
|
||||||
# endif
|
# endif /* __EMBREE__ */
|
||||||
|
|
||||||
# ifdef __OBJECT_MOTION__
|
# ifdef __OBJECT_MOTION__
|
||||||
if (kernel_data.bvh.have_motion) {
|
if (kernel_data.bvh.have_motion) {
|
||||||
return bvh_intersect_volume_all_motion(kg, ray, isect, max_hits, visibility);
|
return bvh_intersect_volume_all_motion(kg, ray, isect, max_hits, visibility);
|
||||||
}
|
}
|
||||||
# endif /* __OBJECT_MOTION__ */
|
# endif /* __OBJECT_MOTION__ */
|
||||||
|
|
||||||
# ifdef __INSTANCING__
|
# ifdef __INSTANCING__
|
||||||
if (kernel_data.bvh.have_instancing)
|
if (kernel_data.bvh.have_instancing) {
|
||||||
return bvh_intersect_volume_all_instancing(kg, ray, isect, max_hits, visibility);
|
return bvh_intersect_volume_all_instancing(kg, ray, isect, max_hits, visibility);
|
||||||
|
}
|
||||||
# endif /* __INSTANCING__ */
|
# endif /* __INSTANCING__ */
|
||||||
return bvh_intersect_volume_all(kg, ray, isect, max_hits, visibility);
|
return bvh_intersect_volume_all(kg, ray, isect, max_hits, visibility);
|
||||||
}
|
}
|
||||||
|
@ -65,7 +65,7 @@ ccl_device_forceinline bool kernel_path_scene_intersect(KernelGlobals *kg,
|
|||||||
ray->t = kernel_data.background.ao_distance;
|
ray->t = kernel_data.background.ao_distance;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool hit = scene_intersect(kg, *ray, visibility, isect);
|
bool hit = scene_intersect(kg, ray, visibility, isect);
|
||||||
|
|
||||||
#ifdef __KERNEL_DEBUG__
|
#ifdef __KERNEL_DEBUG__
|
||||||
if (state->flag & PATH_RAY_CAMERA) {
|
if (state->flag & PATH_RAY_CAMERA) {
|
||||||
|
@ -103,7 +103,7 @@ ccl_device bool shadow_blocked_opaque(KernelGlobals *kg,
|
|||||||
Intersection *isect,
|
Intersection *isect,
|
||||||
float3 *shadow)
|
float3 *shadow)
|
||||||
{
|
{
|
||||||
const bool blocked = scene_intersect(kg, *ray, visibility & PATH_RAY_SHADOW_OPAQUE, isect);
|
const bool blocked = scene_intersect(kg, ray, visibility & PATH_RAY_SHADOW_OPAQUE, isect);
|
||||||
#ifdef __VOLUME__
|
#ifdef __VOLUME__
|
||||||
if (!blocked && state->volume_stack[0].shader != SHADER_NONE) {
|
if (!blocked && state->volume_stack[0].shader != SHADER_NONE) {
|
||||||
/* Apply attenuation from current volume shader. */
|
/* Apply attenuation from current volume shader. */
|
||||||
@ -318,7 +318,7 @@ ccl_device bool shadow_blocked_transparent_stepped_loop(KernelGlobals *kg,
|
|||||||
if (bounce >= kernel_data.integrator.transparent_max_bounce) {
|
if (bounce >= kernel_data.integrator.transparent_max_bounce) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (!scene_intersect(kg, *ray, visibility & PATH_RAY_SHADOW_TRANSPARENT, isect)) {
|
if (!scene_intersect(kg, ray, visibility & PATH_RAY_SHADOW_TRANSPARENT, isect)) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (!shader_transparent_shadow(kg, isect)) {
|
if (!shader_transparent_shadow(kg, isect)) {
|
||||||
@ -374,7 +374,7 @@ ccl_device bool shadow_blocked_transparent_stepped(KernelGlobals *kg,
|
|||||||
Intersection *isect,
|
Intersection *isect,
|
||||||
float3 *shadow)
|
float3 *shadow)
|
||||||
{
|
{
|
||||||
bool blocked = scene_intersect(kg, *ray, visibility & PATH_RAY_SHADOW_OPAQUE, isect);
|
bool blocked = scene_intersect(kg, ray, visibility & PATH_RAY_SHADOW_OPAQUE, isect);
|
||||||
bool is_transparent_isect = blocked ? shader_transparent_shadow(kg, isect) : false;
|
bool is_transparent_isect = blocked ? shader_transparent_shadow(kg, isect) : false;
|
||||||
return shadow_blocked_transparent_stepped_loop(
|
return shadow_blocked_transparent_stepped_loop(
|
||||||
kg, sd, shadow_sd, state, visibility, ray, isect, blocked, is_transparent_isect, shadow);
|
kg, sd, shadow_sd, state, visibility, ray, isect, blocked, is_transparent_isect, shadow);
|
||||||
@ -433,7 +433,7 @@ ccl_device_inline bool shadow_blocked(KernelGlobals *kg,
|
|||||||
* TODO(sergey): Check why using record-all behavior causes slowdown in such
|
* TODO(sergey): Check why using record-all behavior causes slowdown in such
|
||||||
* cases. Could that be caused by a higher spill pressure?
|
* cases. Could that be caused by a higher spill pressure?
|
||||||
*/
|
*/
|
||||||
const bool blocked = scene_intersect(kg, *ray, visibility & PATH_RAY_SHADOW_OPAQUE, &isect);
|
const bool blocked = scene_intersect(kg, ray, visibility & PATH_RAY_SHADOW_OPAQUE, &isect);
|
||||||
const bool is_transparent_isect = blocked ? shader_transparent_shadow(kg, &isect) : false;
|
const bool is_transparent_isect = blocked ? shader_transparent_shadow(kg, &isect) : false;
|
||||||
if (!blocked || !is_transparent_isect || max_hits + 1 >= SHADOW_STACK_MAX_HITS) {
|
if (!blocked || !is_transparent_isect || max_hits + 1 >= SHADOW_STACK_MAX_HITS) {
|
||||||
return shadow_blocked_transparent_stepped_loop(
|
return shadow_blocked_transparent_stepped_loop(
|
||||||
|
@ -222,7 +222,7 @@ ccl_device_inline int subsurface_scatter_disk(KernelGlobals *kg,
|
|||||||
|
|
||||||
/* intersect with the same object. if multiple intersections are found it
|
/* intersect with the same object. if multiple intersections are found it
|
||||||
* will use at most BSSRDF_MAX_HITS hits, a random subset of all hits */
|
* will use at most BSSRDF_MAX_HITS hits, a random subset of all hits */
|
||||||
scene_intersect_local(kg, *ray, ss_isect, sd->object, lcg_state, BSSRDF_MAX_HITS);
|
scene_intersect_local(kg, ray, ss_isect, sd->object, lcg_state, BSSRDF_MAX_HITS);
|
||||||
int num_eval_hits = min(ss_isect->num_hits, BSSRDF_MAX_HITS);
|
int num_eval_hits = min(ss_isect->num_hits, BSSRDF_MAX_HITS);
|
||||||
|
|
||||||
for (int hit = 0; hit < num_eval_hits; hit++) {
|
for (int hit = 0; hit < num_eval_hits; hit++) {
|
||||||
@ -418,7 +418,7 @@ ccl_device_noinline bool subsurface_random_walk(KernelGlobals *kg,
|
|||||||
float t = -logf(1.0f - rdist) / sample_sigma_t;
|
float t = -logf(1.0f - rdist) / sample_sigma_t;
|
||||||
|
|
||||||
ray->t = t;
|
ray->t = t;
|
||||||
scene_intersect_local(kg, *ray, ss_isect, sd->object, NULL, 1);
|
scene_intersect_local(kg, ray, ss_isect, sd->object, NULL, 1);
|
||||||
hit = (ss_isect->num_hits > 0);
|
hit = (ss_isect->num_hits > 0);
|
||||||
|
|
||||||
if (hit) {
|
if (hit) {
|
||||||
|
@ -649,9 +649,8 @@ typedef struct Ray {
|
|||||||
* is fixed.
|
* is fixed.
|
||||||
*/
|
*/
|
||||||
#ifndef __KERNEL_OPENCL_AMD__
|
#ifndef __KERNEL_OPENCL_AMD__
|
||||||
float3 P; /* origin */
|
float3 P; /* origin */
|
||||||
float3 D; /* direction */
|
float3 D; /* direction */
|
||||||
|
|
||||||
float t; /* length of the ray */
|
float t; /* length of the ray */
|
||||||
float time; /* time (for motion blur) */
|
float time; /* time (for motion blur) */
|
||||||
#else
|
#else
|
||||||
|
@ -1406,7 +1406,7 @@ bool OSLRenderServices::trace(TraceOpt &options,
|
|||||||
|
|
||||||
/* Raytrace, leaving out shadow opaque to avoid early exit. */
|
/* Raytrace, leaving out shadow opaque to avoid early exit. */
|
||||||
uint visibility = PATH_RAY_ALL_VISIBILITY - PATH_RAY_SHADOW_OPAQUE;
|
uint visibility = PATH_RAY_ALL_VISIBILITY - PATH_RAY_SHADOW_OPAQUE;
|
||||||
return scene_intersect(kg, ray, visibility, &tracedata->isect);
|
return scene_intersect(kg, &ray, visibility, &tracedata->isect);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool OSLRenderServices::getmessage(OSL::ShaderGlobals *sg,
|
bool OSLRenderServices::getmessage(OSL::ShaderGlobals *sg,
|
||||||
|
@ -66,13 +66,13 @@ ccl_device_noinline float svm_ao(KernelGlobals *kg,
|
|||||||
ray.dD = differential3_zero();
|
ray.dD = differential3_zero();
|
||||||
|
|
||||||
if (flags & NODE_AO_ONLY_LOCAL) {
|
if (flags & NODE_AO_ONLY_LOCAL) {
|
||||||
if (!scene_intersect_local(kg, ray, NULL, sd->object, NULL, 0)) {
|
if (!scene_intersect_local(kg, &ray, NULL, sd->object, NULL, 0)) {
|
||||||
unoccluded++;
|
unoccluded++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Intersection isect;
|
Intersection isect;
|
||||||
if (!scene_intersect(kg, ray, PATH_RAY_SHADOW_OPAQUE, &isect)) {
|
if (!scene_intersect(kg, &ray, PATH_RAY_SHADOW_OPAQUE, &isect)) {
|
||||||
unoccluded++;
|
unoccluded++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -112,7 +112,7 @@ ccl_device_noinline float3 svm_bevel(KernelGlobals *kg,
|
|||||||
|
|
||||||
/* Intersect with the same object. if multiple intersections are found it
|
/* Intersect with the same object. if multiple intersections are found it
|
||||||
* will use at most LOCAL_MAX_HITS hits, a random subset of all hits. */
|
* will use at most LOCAL_MAX_HITS hits, a random subset of all hits. */
|
||||||
scene_intersect_local(kg, *ray, &isect, sd->object, &lcg_state, LOCAL_MAX_HITS);
|
scene_intersect_local(kg, ray, &isect, sd->object, &lcg_state, LOCAL_MAX_HITS);
|
||||||
|
|
||||||
int num_eval_hits = min(isect.num_hits, LOCAL_MAX_HITS);
|
int num_eval_hits = min(isect.num_hits, LOCAL_MAX_HITS);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user