[Bf-blender-cvs] [0317d3083dd] soc-2019-embree-gpu: Directly fill packed structure

MATILLAT Quentin noreply at git.blender.org
Thu Jul 18 15:17:26 CEST 2019


Commit: 0317d3083dd35ec03400f5fc58c77fa0faa22a6a
Author: MATILLAT Quentin
Date:   Thu Jul 18 15:16:34 2019 +0200
Branches: soc-2019-embree-gpu
https://developer.blender.org/rB0317d3083dd35ec03400f5fc58c77fa0faa22a6a

Directly fill packed structure

Lead to slightly better performance than internal builder on scene that
use motion blur

===================================================================

M	intern/cycles/bvh/bvh_embree.cpp
M	intern/cycles/bvh/bvh_embree_converter.cpp
M	intern/cycles/bvh/bvh_embree_converter.h

===================================================================

diff --git a/intern/cycles/bvh/bvh_embree.cpp b/intern/cycles/bvh/bvh_embree.cpp
index 7a2a4b2d984..6a1c2c90489 100644
--- a/intern/cycles/bvh/bvh_embree.cpp
+++ b/intern/cycles/bvh/bvh_embree.cpp
@@ -485,21 +485,19 @@ void BVHEmbree::build(Progress &progress, Stats *stats_)
   rtcSetSceneProgressMonitorFunction(scene, rtc_progress_func, &progress);
   rtcCommitScene(scene);
 
-  pack_primitives();
-
-  if (progress.get_cancel()) {
-    delete_rtcScene();
-    stats = NULL;
-    return;
-  }
-
   progress.set_substatus("Packing geometry");
   if(this->bvh_layout == BVH_LAYOUT_EMBREE_CONVERTED) {
     BVHEmbreeConverter conv(scene, objects, this->params);
-    BVHNode *root = conv.getBVH2();
-    BVH2::pack_nodes(root);
-    root->deleteSubtree();
+    conv.fillPack(this->pack, this->objects);
   } else {
+    pack_primitives();
+
+    if (progress.get_cancel()) {
+      delete_rtcScene();
+      stats = NULL;
+      return;
+    }
+
     pack_nodes(NULL);
   }
 
@@ -821,135 +819,131 @@ void BVHEmbree::add_curves(Object *ob, int i)
 
 void BVHEmbree::pack_nodes(const BVHNode *r)
 {
-  if(this->bvh_layout == BVH_LAYOUT_EMBREE_CONVERTED) {
-    BVH2::pack_nodes(r);
-  } 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;
-          }
-      }
+  /* Quite a bit of this code is for compatibility with Cycles' native BVH. */
+  if (!params.top_level) {
+    return;
+  }
 
-      size_t prim_offset = pack.prim_index.size();
+  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;
+    }
+  }
 
-      /* reserve */
-      size_t prim_index_size = pack.prim_index.size();
-      size_t prim_tri_verts_size = pack.prim_tri_verts.size();
+  size_t prim_offset = pack.prim_index.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;
+  /* reserve */
+  size_t prim_index_size = pack.prim_index.size();
+  size_t prim_tri_verts_size = pack.prim_tri_verts.size();
 
-      map<Mesh *, int> mesh_map;
+  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;
 
-      foreach (Object *ob, objects) {
-          Mesh *mesh = ob->mesh;
-          BVH *bvh = mesh->bvh;
+  map<Mesh *, int> mesh_map;
 
-          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 indexes for instances */
-          pack.object_node[object_offset++] = prim_offset;
+    /* fill in node indexes for instances */
+    pack.object_node[object_offset++] = prim_offset;
 
-          mesh_map[mesh] = pack.object_node[object_offset - 1];
+    mesh_map[mesh] = pack.object_node[object_offset - 1];
 
-          /* merge primitive, object and triangle indexes */
-          if (bvh->pack.prim_index.size()) {
-              size_t bvh_prim_index_size = bvh->pack.prim_index.size();
-              int *bvh_prim_index = &bvh->pack.prim_index[0];
-              int *bvh_prim_type = &bvh->pack.prim_type[0];
-              uint *bvh_prim_tri_index = &bvh->pack.prim_tri_index[0];
+    /* merge primitive, object and triangle indexes */
+    if (bvh->pack.prim_index.size()) {
+      size_t bvh_prim_index_size = bvh->pack.prim_index.size();
+      int *bvh_prim_index = &bvh->pack.prim_index[0];
+      int *bvh_prim_type = &bvh->pack.prim_type[0];
+      uint *bvh_prim_tri_index = &bvh->pack.prim_tri_index[0];
 
-              for (size_t i = 0; i < bvh_prim_index_size; ++i) {
-                  if (bvh->pack.prim_type[i] & PRIMITIVE_ALL_CURVE) {
-                      pack_prim_index[pack_prim_index_offset] = bvh_prim_index[i] + mesh_curve_offset;
-                      pack_prim_tri_index[pack_prim_index_offset] = -1;
-                  }
-                  else {
-                      pack_prim_index[pack_prim_index_offset] = bvh_prim_index[i] + mesh_tri_offset;
-                      pack_prim_tri_index[pack_prim_index_offset] = bvh_prim_tri_index[i] +
-                              pack_prim_tri_verts_offset;
-                  }
+      for (size_t i = 0; i < bvh_prim_index_size; ++i) {
+        if (bvh->pack.prim_type[i] & PRIMITIVE_ALL_CURVE) {
+          pack_prim_index[pack_prim_index_offset] = bvh_prim_index[i] + mesh_curve_offset;
+          pack_prim_tri_index[pack_prim_index_offset] = -1;
+        }
+        else {
+          pack_prim_index[pack_prim_index_offset] = bvh_prim_index[i] + mesh_tri_offset;
+          pack_prim_tri_index[pack_prim_index_offset] = bvh_prim_tri_index[i] +
+            pack_prim_tri_verts_offset;
+        }
 
-                  pack_prim_type[pack_prim_index_offset] = bvh_prim_type[i];
-                  pack_prim_object[pack_prim_index_offset] = 0;
+        pack_prim_type[pack_prim_index_offset] = bvh_prim_type[i];
+        pack_prim_object[pack_prim_index_offset] = 0;
 
-                  ++pack_prim_index_offset;
-              }
-          }
+        ++pack_prim_index_offset;
+      }
+    }
 
-          /* Merge triangle vertices data. */
-          if (bvh->pack.prim_tri_verts.size()) {
-              const size_t prim_tri_size = bvh->pack.prim_tri_verts.size();
-              memcpy(pack_prim_tri_verts + pack_prim_tri_verts_offset,
-                     &bvh->pack.prim_tri_verts[0],
-                      prim_tri_size * sizeof(float4));
-              pack_prim_tri_verts_offset += prim_tri_size;
-          }
+    /* Merge triangle vertices data. */
+    if (bvh->pack.prim_tri_verts.size()) {
+      const size_t prim_tri_siz

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list