From d95100e821483fa6c53be0117cd6169658e2fd97 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Fri, 5 Aug 2022 17:19:19 +0200 Subject: [PATCH] Fix T98769: Cycles crash with multi-device rendering and BVH refits --- intern/cycles/bvh/bvh.h | 7 +++++++ intern/cycles/bvh/multi.cpp | 8 ++++++++ intern/cycles/bvh/multi.h | 3 +++ intern/cycles/scene/geometry.cpp | 3 +-- 4 files changed, 19 insertions(+), 2 deletions(-) diff --git a/intern/cycles/bvh/bvh.h b/intern/cycles/bvh/bvh.h index be390f8a673..19ebf7f68ba 100644 --- a/intern/cycles/bvh/bvh.h +++ b/intern/cycles/bvh/bvh.h @@ -74,6 +74,13 @@ class BVH { { } + virtual void replace_geometry(const vector &geometry, + const vector &objects) + { + this->geometry = geometry; + this->objects = objects; + } + protected: BVH(const BVHParams ¶ms, const vector &geometry, diff --git a/intern/cycles/bvh/multi.cpp b/intern/cycles/bvh/multi.cpp index 7211720b56b..d9ee2fce966 100644 --- a/intern/cycles/bvh/multi.cpp +++ b/intern/cycles/bvh/multi.cpp @@ -21,4 +21,12 @@ BVHMulti::~BVHMulti() } } +void BVHMulti::replace_geometry(const vector &geometry, + const vector &objects) +{ + foreach (BVH *bvh, sub_bvhs) { + bvh->replace_geometry(geometry, objects); + } +} + CCL_NAMESPACE_END diff --git a/intern/cycles/bvh/multi.h b/intern/cycles/bvh/multi.h index 824899f3101..aafbfae19e0 100644 --- a/intern/cycles/bvh/multi.h +++ b/intern/cycles/bvh/multi.h @@ -19,6 +19,9 @@ class BVHMulti : public BVH { const vector &geometry, const vector &objects); virtual ~BVHMulti(); + + virtual void replace_geometry(const vector &geometry, + const vector &objects); }; CCL_NAMESPACE_END diff --git a/intern/cycles/scene/geometry.cpp b/intern/cycles/scene/geometry.cpp index 67ff118692e..ae8dcaa43b6 100644 --- a/intern/cycles/scene/geometry.cpp +++ b/intern/cycles/scene/geometry.cpp @@ -217,8 +217,7 @@ void Geometry::compute_bvh(Device *device, if (bvh && !need_update_rebuild) { progress->set_status(msg, "Refitting BVH"); - bvh->geometry = geometry; - bvh->objects = objects; + bvh->replace_geometry(geometry, objects); device->build_bvh(bvh, *progress, true); }