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 &params, 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 &params_, 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

Reply via email to