[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