Commit: 68d764f93c9edbd9fb1d8889bafcba3081e42a0c Author: MATILLAT Quentin Date: Wed Jun 19 15:36:59 2019 +0200 Branches: soc-2019-embree-gpu https://developer.blender.org/rB68d764f93c9edbd9fb1d8889bafcba3081e42a0c
Add GUI option to use all options Current options are : - bvh_builder: Ask embree to build the BVH tree from bounding boxes - Raw embree: Use all of embree features (cannot be used on GPU) - bvh_access: Give all the object to Embree, then use introspection to extract the tree =================================================================== M intern/cycles/blender/addon/properties.py M intern/cycles/blender/addon/ui.py M intern/cycles/blender/blender_sync.cpp M intern/cycles/bvh/bvh.cpp M intern/cycles/bvh/bvh_embree.cpp M intern/cycles/bvh/bvh_embree.h M intern/cycles/device/device_cpu.cpp M intern/cycles/kernel/kernel_types.h M intern/cycles/render/mesh.cpp =================================================================== diff --git a/intern/cycles/blender/addon/properties.py b/intern/cycles/blender/addon/properties.py index ba0339cf3d0..2670c300d14 100644 --- a/intern/cycles/blender/addon/properties.py +++ b/intern/cycles/blender/addon/properties.py @@ -527,6 +527,11 @@ class CyclesRenderSettings(bpy.types.PropertyGroup): description="Use Embree as ray accelerator", default=False, ) + use_bvh_embree_converter: BoolProperty( + name="Convert Embree to Internal BVH", + description="Use Embree as ray accelerator", + default=False, + ) use_bvh_embree_gpu: BoolProperty( name="Use Embree on GPU (experimental)", description="Use Embree as ray accelerator", diff --git a/intern/cycles/blender/addon/ui.py b/intern/cycles/blender/addon/ui.py index 463cf78b6e6..b970de02fde 100644 --- a/intern/cycles/blender/addon/ui.py +++ b/intern/cycles/blender/addon/ui.py @@ -650,6 +650,9 @@ class CYCLES_RENDER_PT_performance_acceleration_structure(CyclesButtonsPanel, Pa row = col.row() row.active = use_cpu(context) row.prop(cscene, "use_bvh_embree") + row2 = col.row() + row2.active = cscene.use_bvh_embree + row2.prop(cscene, "use_bvh_embree_converter") if _cycles.with_embree: row = col.row() row.active = use_cuda(context) diff --git a/intern/cycles/blender/blender_sync.cpp b/intern/cycles/blender/blender_sync.cpp index 6ab5294427c..a39b7f053ff 100644 --- a/intern/cycles/blender/blender_sync.cpp +++ b/intern/cycles/blender/blender_sync.cpp @@ -697,6 +697,8 @@ SceneParams BlenderSync::get_scene_params(BL::Scene &b_scene, bool background) #ifdef WITH_EMBREE params.bvh_layout = RNA_boolean_get(&cscene, "use_bvh_embree") ? BVH_LAYOUT_EMBREE : params.bvh_layout; + params.bvh_layout = RNA_boolean_get(&cscene, "use_bvh_embree_converter") ? BVH_LAYOUT_EMBREE_CONVERTED : + params.bvh_layout; params.bvh_layout = RNA_boolean_get(&cscene, "use_bvh_embree_gpu") ? BVH_LAYOUT_EMBREE_GPU : params.bvh_layout; #endif diff --git a/intern/cycles/bvh/bvh.cpp b/intern/cycles/bvh/bvh.cpp index f4f8a274fee..17687ff6e74 100644 --- a/intern/cycles/bvh/bvh.cpp +++ b/intern/cycles/bvh/bvh.cpp @@ -108,6 +108,7 @@ BVH *BVH::create(const BVHParams ¶ms, const vector<Object *> &objects) case BVH_LAYOUT_BVH8: return new BVH8(params, objects); case BVH_LAYOUT_EMBREE: + case BVH_LAYOUT_EMBREE_CONVERTED: #ifdef WITH_EMBREE return new BVHEmbree(params, objects); #endif diff --git a/intern/cycles/bvh/bvh_embree.cpp b/intern/cycles/bvh/bvh_embree.cpp index 712d55adaca..b2fd464b16d 100644 --- a/intern/cycles/bvh/bvh_embree.cpp +++ b/intern/cycles/bvh/bvh_embree.cpp @@ -60,6 +60,7 @@ #define TASKING_INTERNAL #define RTC_NAMESPACE_BEGIN +#define RTC_NAMESPACE_OPEN #define RTC_NAMESPACE_END #include "embree/kernels/common/scene.h" @@ -427,7 +428,8 @@ int BVHEmbree::rtc_shared_users = 0; thread_mutex BVHEmbree::rtc_shared_mutex; BVHEmbree::BVHEmbree(const BVHParams ¶ms_, const vector<Object *> &objects_) - : BVH4(params_, objects_), + : bvh_layout(params_.bvh_layout), + BVH4(params_, objects_), scene(NULL), mem_used(0), top_level(NULL), @@ -633,11 +635,14 @@ void BVHEmbree::build(Progress &progress, Stats *stats_) } progress.set_substatus("Packing geometry"); - BVHNode *root = print_bvhInfo(scene); - root->print(); - pack_nodes(root); - std::cout << "SAH " << root->computeSubtreeSAHCost(this->params) << std::endl; - // pack_nodes(NULL); + if(this->bvh_layout == BVH_LAYOUT_EMBREE_CONVERTED) { + BVHNode *root = print_bvhInfo(scene); + root->print(); + pack_nodes(root); + std::cout << "SAH " << root->computeSubtreeSAHCost(this->params) << std::endl; + } else { + pack_nodes(NULL); + } stats = NULL; } @@ -954,135 +959,136 @@ void BVHEmbree::add_curves(Object *ob, int i) } void BVHEmbree::pack_nodes(const BVHNode *r) { + if(this->bvh_layout == BVH_LAYOUT_EMBREE_CONVERTED) { BVH4::pack_nodes(r); -#ifdef _ - /* Quite a bit of this code is for compatibility with Cycles' native BVH. */ - if (!params.top_level) { - return; - } + } else { + /* Quite a bit of this code is for compatibility with Cycles' native BVH. */ + if (!params.top_level) { + return; + } - for (size_t i = 0; i < pack.prim_index.size(); ++i) { - if (pack.prim_index[i] != -1) { - if (pack.prim_type[i] & PRIMITIVE_ALL_CURVE) - pack.prim_index[i] += objects[pack.prim_object[i]]->mesh->curve_offset; - else - pack.prim_index[i] += objects[pack.prim_object[i]]->mesh->tri_offset; - } - } + for (size_t i = 0; i < pack.prim_index.size(); ++i) { + if (pack.prim_index[i] != -1) { + if (pack.prim_type[i] & PRIMITIVE_ALL_CURVE) + pack.prim_index[i] += objects[pack.prim_object[i]]->mesh->curve_offset; + else + pack.prim_index[i] += objects[pack.prim_object[i]]->mesh->tri_offset; + } + } - size_t prim_offset = pack.prim_index.size(); + size_t prim_offset = pack.prim_index.size(); - /* reserve */ - size_t prim_index_size = pack.prim_index.size(); - size_t prim_tri_verts_size = pack.prim_tri_verts.size(); + /* reserve */ + size_t prim_index_size = pack.prim_index.size(); + size_t prim_tri_verts_size = pack.prim_tri_verts.size(); - size_t pack_prim_index_offset = prim_index_size; - size_t pack_prim_tri_verts_offset = prim_tri_verts_size; - size_t object_offset = 0; + size_t pack_prim_index_offset = prim_index_size; + size_t pack_prim_tri_verts_offset = prim_tri_verts_size; + size_t object_offset = 0; - map<Mesh *, int> mesh_map; + map<Mesh *, int> mesh_map; - foreach (Object *ob, objects) { - Mesh *mesh = ob->mesh; - BVH *bvh = mesh->bvh; - - if (mesh->need_build_bvh()) { - if (mesh_map.find(mesh) == mesh_map.end()) { - prim_index_size += bvh->pack.prim_index.size(); - prim_tri_verts_size += bvh->pack.prim_tri_verts.size(); - mesh_map[mesh] = 1; + foreach (Object *ob, objects) { + Mesh *mesh = ob->mesh; + BVH *bvh = mesh->bvh; + + if (mesh->need_build_bvh()) { + if (mesh_map.find(mesh) == mesh_map.end()) { + prim_index_size += bvh->pack.prim_index.size(); + prim_tri_verts_size += bvh->pack.prim_tri_verts.size(); + mesh_map[mesh] = 1; + } + } } - } - } - mesh_map.clear(); + mesh_map.clear(); - pack.prim_index.resize(prim_index_size); - pack.prim_type.resize(prim_index_size); - pack.prim_object.resize(prim_index_size); - pack.prim_visibility.clear(); - pack.prim_tri_verts.resize(prim_tri_verts_size); - pack.prim_tri_index.resize(prim_index_size); - pack.object_node.resize(objects.size()); + pack.prim_index.resize(prim_index_size); + pack.prim_type.resize(prim_index_size); + pack.prim_object.resize(prim_index_size); + pack.prim_visibility.clear(); + pack.prim_tri_verts.resize(prim_tri_verts_size); + pack.prim_tri_index.resize(prim_index_size); + pack.object_node.resize(objects.size()); - int *pack_prim_index = (pack.prim_index.size()) ? &pack.prim_index[0] : NULL; - int *pack_prim_type = (pack.prim_type.size()) ? &pack.prim_type[0] : NULL; - int *pack_prim_object = (pack.prim_object.size()) ? &pack.prim_object[0] : NULL; - float4 *pack_prim_tri_verts = (pack.prim_tri_verts.size()) ? &pack.prim_tri_verts[0] : NULL; - uint *pack_prim_tri_index = (pack.prim_tri_index.size()) ? &pack.prim_tri_index[0] : NULL; + int *pack_prim_index = (pack.prim_index.size()) ? &pack.prim_index[0] : NULL; + int *pack_prim_type = (pack.prim_type.size()) ? &pack.prim_type[0] : NULL; + int *pack_prim_object = (pack.prim_object.size()) ? &pack.prim_object[0] : NULL; + float4 *pack_prim_tri_verts = (pack.prim_tri_verts.size()) ? &pack.prim_tri_verts[0] : NULL; + uint *pack_prim_tri_index = (pack.prim_tri_index.size()) ? &pack.prim_tri_index[0] : NULL; - /* merge */ - foreach (Object *ob, objects) { - Mesh *mesh = ob->mesh; + /* merge */ + foreach (Object *ob, objects) { + Mesh *mesh = ob->mesh; - /* We assume that if mesh doesn't need own BVH it was already included + /* We assume that if mesh doesn't need own BVH it was already included * into a top-level BVH and no packing here is needed. */ - if (!mesh->need_build_bvh()) { - pack.object_node[object_offset++] = prim_offset; - continue; - } + if (!mesh->need_build_bvh()) { + pack.object_node[object_offset++] = prim_offset; + continue; + } - /* if mesh already added once, don't add it again, but used set + /* if mesh already added once, don't add it again, but used set * node offset for this object */ - map<Mesh *, int>::iterator it = mesh_map.find(mesh); + map<Mesh *, int>::iterator it = mesh_map.find(mesh); - if (mesh_map.find(mesh) != mesh_map.end()) { - int noffset = it->second; - pack.object_node[object_offset++] = noffset; - continue; - } + if (mesh_map.find(mesh) != mesh_map.end()) { + int noffset = it->second; + pack.object_node[object_offset++] = noffset; + continue; + } - BVHEmbree *bvh = (BVHEmbree *)mesh->bvh; + BVHEmbree *bvh = (BVHEmbree *)mesh->bvh; - rtc_memory_monitor_func(stats, unaccounted_mem, true); - unaccounted_mem = 0; + rtc_memory_monitor_func(stats, unaccounted_mem, true); + unaccounted_mem = 0; - int mesh_tri_offset = mesh->tri_offset; - int mesh_curve_offset = mesh->curve_offset; + int mesh_tri_offset = mesh->tri_offset; + int mesh_curve_offset = mesh->curve_offset; - /* fill in node @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs