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