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

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to