diff --git a/intern/cycles/device/cpu/device_impl.cpp b/intern/cycles/device/cpu/device_impl.cpp index 1fa4abc0360..225f8ca9968 100644 --- a/intern/cycles/device/cpu/device_impl.cpp +++ b/intern/cycles/device/cpu/device_impl.cpp @@ -187,15 +187,11 @@ void CPUDevice::const_copy_to(const char *name, void *host, const size_t size) if (strcmp(name, "data") == 0) { assert(size <= sizeof(KernelData)); - // Update scene handle (since it is different for each device on multi devices) + /* Update scene handle (since it is different for each device on multi devices). + * This must be a raw pointer copy since at some points during scene update this + * pointer may be invalid. */ KernelData *const data = (KernelData *)host; - data->device_bvh = -# if RTC_VERSION >= 40400 - rtcGetSceneTraversable(embree_scene) -# else - embree_scene -# endif - ; + data->device_bvh = embree_traversable; } #endif kernel_const_copy(&kernel_globals, name, host, size); @@ -272,7 +268,11 @@ void CPUDevice::build_bvh(BVH *bvh, Progress &progress, bool refit) } if (bvh->params.top_level) { - embree_scene = bvh_embree->scene; +# if RTC_VERSION >= 40400 + embree_traversable = rtcGetSceneTraversable(bvh_embree->scene); +# else + embree_traversable = bvh_embree->scene; +# endif } } else diff --git a/intern/cycles/device/cpu/device_impl.h b/intern/cycles/device/cpu/device_impl.h index 2e9ed32d525..a7164c59f1d 100644 --- a/intern/cycles/device/cpu/device_impl.h +++ b/intern/cycles/device/cpu/device_impl.h @@ -45,7 +45,11 @@ class CPUDevice : public Device { OSLGlobals osl_globals; #endif #ifdef WITH_EMBREE - RTCScene embree_scene = nullptr; +# if RTC_VERSION >= 40400 + RTCTraversable embree_traversable = nullptr; +# else + RTCScene embree_traversable = nullptr; +# endif RTCDevice embree_device; #endif #ifdef WITH_PATH_GUIDING diff --git a/intern/cycles/device/oneapi/device_impl.cpp b/intern/cycles/device/oneapi/device_impl.cpp index 4083ab5e9e4..9064b8d41a0 100644 --- a/intern/cycles/device/oneapi/device_impl.cpp +++ b/intern/cycles/device/oneapi/device_impl.cpp @@ -181,7 +181,11 @@ void OneapiDevice::build_bvh(BVH *bvh, Progress &progress, bool refit) # endif if (bvh->params.top_level) { - embree_scene = bvh_embree->scene; +# if RTC_VERSION >= 40400 + embree_traversable = rtcGetSceneTraversable(bvh_embree->scene); +# else + embree_traversable = bvh_embree->scene; +# endif # if RTC_VERSION >= 40302 RTCError error_code = bvh_embree->offload_scenes_to_gpu(all_embree_scenes); if (error_code != RTC_ERROR_NONE) { @@ -585,18 +589,14 @@ void OneapiDevice::const_copy_to(const char *name, void *host, const size_t size << string_human_readable_size(size) << ")"; # ifdef WITH_EMBREE_GPU - if (embree_scene != nullptr && strcmp(name, "data") == 0) { + if (embree_traversable != nullptr && strcmp(name, "data") == 0) { assert(size <= sizeof(KernelData)); - /* Update scene handle(since it is different for each device on multi devices) */ + /* Update scene handle(since it is different for each device on multi devices). + * This must be a raw pointer copy since at some points during scene update this + * pointer may be invalid. */ KernelData *const data = (KernelData *)host; - data->device_bvh = -# if RTC_VERSION >= 40400 - rtcGetSceneTraversable(embree_scene) -# else - embree_scene -# endif - ; + data->device_bvh = embree_traversable; /* We need this number later for proper local memory allocation. */ scene_max_shaders_ = data->max_shaders; diff --git a/intern/cycles/device/oneapi/device_impl.h b/intern/cycles/device/oneapi/device_impl.h index 91183edd25d..bf93f9e48a9 100644 --- a/intern/cycles/device/oneapi/device_impl.h +++ b/intern/cycles/device/oneapi/device_impl.h @@ -23,7 +23,11 @@ class OneapiDevice : public GPUDevice { SyclQueue *device_queue_ = nullptr; # ifdef WITH_EMBREE_GPU RTCDevice embree_device = nullptr; - RTCScene embree_scene = nullptr; +# if RTC_VERSION >= 40400 + RTCTraversable embree_traversable = nullptr; +# else + RTCScene embree_traversable = nullptr; +# endif # if RTC_VERSION >= 40302 thread_mutex scene_data_mutex; vector all_embree_scenes;