[Bf-blender-cvs] [8fe17aecc55] cycles_embree: Cycles: prevented interactive rendering from crashing with Embree when objects are made invisible - RTCScenes now only get deleted by the top level BVH
Stefan Werner
noreply at git.blender.org
Sun Nov 26 23:11:19 CET 2017
Commit: 8fe17aecc55cdacf85f80ef4bebeb8e4366ad88d
Author: Stefan Werner
Date: Fri Jun 23 13:46:57 2017 +0200
Branches: cycles_embree
https://developer.blender.org/rB8fe17aecc55cdacf85f80ef4bebeb8e4366ad88d
Cycles: prevented interactive rendering from crashing with Embree when objects are made invisible - RTCScenes now only get deleted by the top level BVH
===================================================================
M intern/cycles/bvh/bvh_embree.cpp
M intern/cycles/bvh/bvh_embree.h
===================================================================
diff --git a/intern/cycles/bvh/bvh_embree.cpp b/intern/cycles/bvh/bvh_embree.cpp
index 6145497ac98..9108d418348 100644
--- a/intern/cycles/bvh/bvh_embree.cpp
+++ b/intern/cycles/bvh/bvh_embree.cpp
@@ -180,7 +180,7 @@ int BVHEmbree::rtc_shared_users = 0;
thread_mutex BVHEmbree::rtc_shared_mutex;
BVHEmbree::BVHEmbree(const BVHParams& params_, const vector<Object*>& objects_)
-: BVH(params_, objects_), scene(NULL), mem_used(0), stats(NULL)
+: BVH(params_, objects_), scene(NULL), mem_used(0), stats(NULL), top_level(NULL)
{
_MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_ON);
_MM_SET_DENORMALS_ZERO_MODE(_MM_DENORMALS_ZERO_ON);
@@ -220,7 +220,20 @@ void BVHEmbree::destroy(RTCScene scene)
void BVHEmbree::delete_rtcScene()
{
if(scene) {
- rtcDeleteScene(scene);
+ /* When this BVH is used as an instance in a top level BVH, don't delete now
+ * Let the top_level BVH know that it should delete it later */
+ if(top_level) {
+ top_level->add_delayed_delete_scene(scene);
+ }
+ else {
+ rtcDeleteScene(scene);
+ if(delayed_delete_scenes.size()) {
+ foreach(RTCScene s, delayed_delete_scenes) {
+ rtcDeleteScene(s);
+ }
+ }
+ delayed_delete_scenes.clear();
+ }
scene = NULL;
}
}
@@ -332,6 +345,10 @@ unsigned BVHEmbree::add_instance(Object *ob, int i)
}
BVHEmbree *instance_bvh = (BVHEmbree*)(ob->mesh->bvh);
+ if(instance_bvh->top_level != this) {
+ instance_bvh->top_level = this;
+ }
+
const size_t num_motion_steps = ob->use_motion ? 3 : 1;
unsigned geom_id = rtcNewInstance3(scene, instance_bvh->scene, num_motion_steps, i*2);
diff --git a/intern/cycles/bvh/bvh_embree.h b/intern/cycles/bvh/bvh_embree.h
index 5d26bb9ecee..b12ff61889d 100644
--- a/intern/cycles/bvh/bvh_embree.h
+++ b/intern/cycles/bvh/bvh_embree.h
@@ -55,6 +55,9 @@ protected:
unsigned add_triangles(Mesh *mesh, int i);
ssize_t mem_used;
+
+ void add_delayed_delete_scene(RTCScene scene) { delayed_delete_scenes.push_back(scene); }
+ BVHEmbree *top_level;
private:
void delete_rtcScene();
void update_tri_vertex_buffer(unsigned geom_id, const Mesh* mesh);
@@ -65,6 +68,7 @@ private:
static thread_mutex rtc_shared_mutex;
Stats *stats;
+ vector<RTCScene> delayed_delete_scenes;
};
CCL_NAMESPACE_END
More information about the Bf-blender-cvs
mailing list