Fix Cycles CUDA transparent shadow error after recent fix in c22b52c
.
Fishy cat benchmark was rendering with wrong shadows. Cause is unclear, adding printf or rearranging code seems to avoid this issue, possibly a compiler bug. This reverts the fix and solves the OSL bug elsewhere.
This commit is contained in:
@@ -244,14 +244,14 @@ ccl_device_noinline bool BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals *kg,
|
||||
{
|
||||
/* shadow ray early termination */
|
||||
#if defined(__KERNEL_SSE2__)
|
||||
if(!(visibility & (PATH_RAY_ALL_VISIBILITY - PATH_RAY_SHADOW_OPAQUE)))
|
||||
if(visibility & PATH_RAY_SHADOW_OPAQUE)
|
||||
return true;
|
||||
tsplat = ssef(0.0f, 0.0f, -isect->t, -isect->t);
|
||||
# if BVH_FEATURE(BVH_HAIR)
|
||||
tfar = ssef(isect->t);
|
||||
# endif
|
||||
#else
|
||||
if(!(visibility & (PATH_RAY_ALL_VISIBILITY - PATH_RAY_SHADOW_OPAQUE)))
|
||||
if(visibility & PATH_RAY_SHADOW_OPAQUE)
|
||||
return true;
|
||||
#endif
|
||||
}
|
||||
@@ -274,14 +274,14 @@ ccl_device_noinline bool BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals *kg,
|
||||
{
|
||||
/* shadow ray early termination */
|
||||
# if defined(__KERNEL_SSE2__)
|
||||
if(!(visibility & (PATH_RAY_ALL_VISIBILITY - PATH_RAY_SHADOW_OPAQUE)))
|
||||
if(visibility & PATH_RAY_SHADOW_OPAQUE)
|
||||
return true;
|
||||
tsplat = ssef(0.0f, 0.0f, -isect->t, -isect->t);
|
||||
# if BVH_FEATURE(BVH_HAIR)
|
||||
tfar = ssef(isect->t);
|
||||
# endif
|
||||
# else
|
||||
if(!(visibility & (PATH_RAY_ALL_VISIBILITY - PATH_RAY_SHADOW_OPAQUE)))
|
||||
if(visibility & PATH_RAY_SHADOW_OPAQUE)
|
||||
return true;
|
||||
# endif
|
||||
}
|
||||
@@ -328,14 +328,14 @@ ccl_device_noinline bool BVH_FUNCTION_FULL_NAME(BVH)(KernelGlobals *kg,
|
||||
if(hit) {
|
||||
/* shadow ray early termination */
|
||||
# if defined(__KERNEL_SSE2__)
|
||||
if(!(visibility & (PATH_RAY_ALL_VISIBILITY - PATH_RAY_SHADOW_OPAQUE)))
|
||||
if(visibility & PATH_RAY_SHADOW_OPAQUE)
|
||||
return true;
|
||||
tsplat = ssef(0.0f, 0.0f, -isect->t, -isect->t);
|
||||
# if BVH_FEATURE(BVH_HAIR)
|
||||
tfar = ssef(isect->t);
|
||||
# endif
|
||||
# else
|
||||
if(!(visibility & (PATH_RAY_ALL_VISIBILITY - PATH_RAY_SHADOW_OPAQUE)))
|
||||
if(visibility & PATH_RAY_SHADOW_OPAQUE)
|
||||
return true;
|
||||
# endif
|
||||
}
|
||||
|
@@ -340,7 +340,7 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(QBVH)(KernelGlobals *kg,
|
||||
prim_addr)) {
|
||||
tfar = ssef(isect->t);
|
||||
/* Shadow ray early termination. */
|
||||
if(!(visibility & (PATH_RAY_ALL_VISIBILITY - PATH_RAY_SHADOW_OPAQUE))) {
|
||||
if(visibility & PATH_RAY_SHADOW_OPAQUE) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -362,7 +362,7 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(QBVH)(KernelGlobals *kg,
|
||||
prim_addr)) {
|
||||
tfar = ssef(isect->t);
|
||||
/* Shadow ray early termination. */
|
||||
if(!(visibility & (PATH_RAY_ALL_VISIBILITY - PATH_RAY_SHADOW_OPAQUE))) {
|
||||
if(visibility & PATH_RAY_SHADOW_OPAQUE) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -409,7 +409,7 @@ ccl_device bool BVH_FUNCTION_FULL_NAME(QBVH)(KernelGlobals *kg,
|
||||
if(hit) {
|
||||
tfar = ssef(isect->t);
|
||||
/* Shadow ray early termination. */
|
||||
if(!(visibility & (PATH_RAY_ALL_VISIBILITY - PATH_RAY_SHADOW_OPAQUE))) {
|
||||
if(visibility & PATH_RAY_SHADOW_OPAQUE) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@@ -1197,8 +1197,9 @@ bool OSLRenderServices::trace(TraceOpt &options, OSL::ShaderGlobals *sg,
|
||||
tracedata->init = true;
|
||||
tracedata->sd.osl_globals = sd->osl_globals;
|
||||
|
||||
/* raytrace */
|
||||
return scene_intersect(sd->osl_globals, ray, PATH_RAY_ALL_VISIBILITY, &tracedata->isect, NULL, 0.0f, 0.0f);
|
||||
/* Raytrace, leaving out shadow opaque to avoid early exit. */
|
||||
uint visibility = PATH_RAY_ALL_VISIBILITY - PATH_RAY_SHADOW_OPAQUE;
|
||||
return scene_intersect(sd->osl_globals, ray, visibility, &tracedata->isect, NULL, 0.0f, 0.0f);
|
||||
}
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user