Fix T83581: "Only local" ambient occlusion option causes error on OptiX 2.92
The SVM AO node calls "scene_intersect_local" with a NULL pointer for the intersection information, which caused a crash with OptiX since it was not checking for this case and always dereferencing this pointer. This fixes that by checking whether any hit information was requested first (like is done in the BVH2 intersection routines).
This commit is contained in:
parent
c93f826661
commit
41bca5a3ee
Notes:
blender-bot
2023-11-20 12:14:32 +01:00
Referenced by issue #83581, "Only local" ambient occlusion option causes error on OptiX 2.92
|
@ -118,12 +118,18 @@ extern "C" __global__ void __anyhit__kernel_optix_local_hit()
|
|||
return optixIgnoreIntersection();
|
||||
}
|
||||
|
||||
const uint max_hits = optixGetPayload_5();
|
||||
if (max_hits == 0) {
|
||||
// Special case for when no hit information is requested, just report that something was hit
|
||||
optixSetPayload_5(true);
|
||||
return optixTerminateRay();
|
||||
}
|
||||
|
||||
int hit = 0;
|
||||
uint *const lcg_state = get_payload_ptr_0<uint>();
|
||||
LocalIntersection *const local_isect = get_payload_ptr_2<LocalIntersection>();
|
||||
|
||||
if (lcg_state) {
|
||||
const uint max_hits = optixGetPayload_5();
|
||||
for (int i = min(max_hits, local_isect->num_hits) - 1; i >= 0; --i) {
|
||||
if (optixGetRayTmax() == local_isect->hits[i].t) {
|
||||
return optixIgnoreIntersection();
|
||||
|
|
Loading…
Reference in New Issue