Cycles: Fix error handling of BVH transfer to device

Previously, in case of a failure during BVH transfer, when running out
of memory for example, we could get an error such as "BVH failed to
migrate to the GPU due to Embree library error (no error)", because
embree error status was actually reset before being queried.
This commit fixes its propagation.

Pull Request: https://projects.blender.org/blender/blender/pulls/129022
This commit is contained in:
Xavier Hallade
2024-10-14 20:34:55 +02:00
committed by Gitea
parent 44d0452a78
commit 2cfe69c07d
3 changed files with 14 additions and 11 deletions

View File

@@ -178,9 +178,8 @@ void BVHEmbree::build(Progress &progress,
rtcCommitScene(scene);
}
const char *BVHEmbree::get_last_error_message()
const char *BVHEmbree::get_error_string(RTCError error_code)
{
const RTCError error_code = rtcGetDeviceError(rtc_device);
switch (error_code) {
case RTC_ERROR_NONE:
return "no error";
@@ -203,7 +202,9 @@ const char *BVHEmbree::get_last_error_message()
}
# if defined(WITH_EMBREE_GPU) && RTC_VERSION >= 40302
bool BVHEmbree::offload_scenes_to_gpu(const vector<RTCScene> &scenes)
/* offload_scenes_to_gpu() uses rtcGetDeviceError() which also resets Embree error status,
* we propagate its value so it doesn't get lost. */
RTCError BVHEmbree::offload_scenes_to_gpu(const vector<RTCScene> &scenes)
{
/* Having BVH on GPU is more performance-critical than texture data.
* In order to ensure good performance even when running out of GPU
@@ -216,10 +217,11 @@ bool BVHEmbree::offload_scenes_to_gpu(const vector<RTCScene> &scenes)
rtcCommitScene(embree_scene);
/* In case of any errors from Embree, we should stop
* the execution and propagate the error. */
if (rtcGetDeviceError(rtc_device) != RTC_ERROR_NONE)
return false;
RTCError error_code = rtcGetDeviceError(rtc_device);
if (error_code != RTC_ERROR_NONE)
return error_code;
}
return true;
return RTC_ERROR_NONE;
}
# endif

View File

@@ -38,10 +38,10 @@ class BVHEmbree : public BVH {
void refit(Progress &progress);
# if defined(WITH_EMBREE_GPU) && RTC_VERSION >= 40302
bool offload_scenes_to_gpu(const vector<RTCScene> &scenes);
RTCError offload_scenes_to_gpu(const vector<RTCScene> &scenes);
# endif
const char *get_last_error_message();
const char *get_error_string(RTCError error_code);
RTCScene scene;

View File

@@ -190,10 +190,11 @@ void OneapiDevice::build_bvh(BVH *bvh, Progress &progress, bool refit)
if (bvh->params.top_level) {
embree_scene = bvh_embree->scene;
# if RTC_VERSION >= 40302
if (bvh_embree->offload_scenes_to_gpu(all_embree_scenes) == false) {
RTCError error_code = bvh_embree->offload_scenes_to_gpu(all_embree_scenes);
if (error_code != RTC_ERROR_NONE) {
set_error(
string_printf("BVH failed to to migrate to the GPU due to Embree library error (%s)",
bvh_embree->get_last_error_message()));
string_printf("BVH failed to migrate to the GPU due to Embree library error (%s)",
bvh_embree->get_error_string(error_code)));
}
all_embree_scenes.clear();
# endif