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:
Patrick Mours 2020-12-09 17:06:28 +01:00
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
1 changed files with 7 additions and 1 deletions

View File

@ -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();