[Bf-blender-cvs] [288e61f50e5] cycles_procedural_api: avoid repacking the data for unmodified objects

Kévin Dietrich noreply at git.blender.org
Mon Nov 16 13:10:30 CET 2020


Commit: 288e61f50e51ffed052830afc26edc72a36e8914
Author: Kévin Dietrich
Date:   Mon Nov 9 17:49:28 2020 +0100
Branches: cycles_procedural_api
https://developer.blender.org/rB288e61f50e51ffed052830afc26edc72a36e8914

avoid repacking the data for unmodified objects

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

M	intern/cycles/bvh/bvh_optix.cpp
M	intern/cycles/render/geometry.cpp

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

diff --git a/intern/cycles/bvh/bvh_optix.cpp b/intern/cycles/bvh/bvh_optix.cpp
index ffa69cb72bc..254c3f55ffa 100644
--- a/intern/cycles/bvh/bvh_optix.cpp
+++ b/intern/cycles/bvh/bvh_optix.cpp
@@ -177,7 +177,9 @@ void BVHOptiX::pack_tlas()
       }
     }
 
-    pool.push(function_bind(&BVHOptiX::pack_instance, this, geom, pack_offset, pack_verts_offset, object_index, object_visibility));
+    if (geom->is_modified()) {
+      pool.push(function_bind(&BVHOptiX::pack_instance, this, geom, pack_offset, pack_verts_offset, object_index, object_visibility));
+    }
 
     if (!bvh_pack.prim_index.empty()) {
       pack_offset += bvh_pack.prim_index.size();
@@ -191,7 +193,7 @@ void BVHOptiX::pack_tlas()
   pool.wait_work();
 }
 
-void BVHOptiX::pack_instance(Geometry *geom, size_t pack_offset, size_t pack_verts_offset, int object_index, int object_visibility)
+void BVHOptiX::pack_instance(Geometry *geom, size_t pack_offset, size_t pack_verts_offset_, int object_index, int object_visibility)
 {
   int *pack_prim_type = pack.prim_type.data();
   int *pack_prim_index = pack.prim_index.data();
@@ -210,29 +212,40 @@ void BVHOptiX::pack_instance(Geometry *geom, size_t pack_offset, size_t pack_ver
     uint *bvh_prim_tri_index = &bvh_pack.prim_tri_index[0];
     uint *bvh_prim_visibility = &bvh_pack.prim_visibility[0];
 
-    for (size_t i = 0; i < bvh_pack.prim_index.size(); i++, pack_offset++) {
-      if (bvh_pack.prim_type[i] & PRIMITIVE_ALL_CURVE) {
-        pack_prim_index[pack_offset] = bvh_prim_index[i] + geom_prim_offset;
-        pack_prim_tri_index[pack_offset] = -1;
-      }
-      else {
-        pack_prim_index[pack_offset] = bvh_prim_index[i] + geom_prim_offset;
-        pack_prim_tri_index[pack_offset] = bvh_prim_tri_index[i] + pack_verts_offset;
+    bool prims_have_changed = true;
+
+    if (geom->is_mesh()) {
+      Mesh *mesh = static_cast<Mesh *>(geom);
+
+      if (!mesh->triangles_is_modified()) {
+        prims_have_changed = false;
       }
+    }
 
-      pack_prim_type[pack_offset] = bvh_prim_type[i];
-      pack_prim_object[pack_offset] = object_index;
-      pack_prim_visibility[pack_offset] = bvh_prim_visibility[i] | object_visibility;
+    if (prims_have_changed) {
+      for (size_t i = 0; i < bvh_pack.prim_index.size(); i++, pack_offset++) {
+        if (bvh_pack.prim_type[i] & PRIMITIVE_ALL_CURVE) {
+          pack_prim_index[pack_offset] = bvh_prim_index[i] + geom_prim_offset;
+          pack_prim_tri_index[pack_offset] = -1;
+        }
+        else {
+          pack_prim_index[pack_offset] = bvh_prim_index[i] + geom_prim_offset;
+          pack_prim_tri_index[pack_offset] = bvh_prim_tri_index[i] + pack_verts_offset_;
+        }
+
+        pack_prim_type[pack_offset] = bvh_prim_type[i];
+        pack_prim_object[pack_offset] = object_index;
+        pack_prim_visibility[pack_offset] = bvh_prim_visibility[i] | object_visibility;
+      }
     }
   }
 
   // Merge triangle vertex data
   if (!bvh_pack.prim_tri_verts.empty()) {
     const size_t prim_tri_size = bvh_pack.prim_tri_verts.size();
-    memcpy(pack_prim_tri_verts + pack_verts_offset,
+    memcpy(pack_prim_tri_verts + pack_verts_offset_,
            bvh_pack.prim_tri_verts.data(),
            prim_tri_size * sizeof(float4));
-    pack_verts_offset += prim_tri_size;
   }
 }
 
diff --git a/intern/cycles/render/geometry.cpp b/intern/cycles/render/geometry.cpp
index 9f8f4157534..bd9655b47b9 100644
--- a/intern/cycles/render/geometry.cpp
+++ b/intern/cycles/render/geometry.cpp
@@ -1245,12 +1245,15 @@ void GeometryManager::device_update_bvh(Device *device,
         bvh->refit(progress);
       }
 
-#if 0
+#if 1
       PackedBVH &pack = bvh->pack;
-      dscene->bvh_nodes.give_data(pack.nodes);
-      dscene->bvh_leaf_nodes.give_data(pack.leaf_nodes);
-      dscene->object_node.give_data(pack.object_node);
-      dscene->prim_tri_index.give_data(pack.prim_tri_index);
+      dscene->prim_tri_verts.give_data(pack.prim_tri_verts);
+#else
+      PackedBVH &pack = bvh->pack;
+      //dscene->bvh_nodes.give_data(pack.nodes);
+      //dscene->bvh_leaf_nodes.give_data(pack.leaf_nodes);
+      //dscene->object_node.give_data(pack.object_node);
+      dscene->prim_tri_index.give_data(pack.prim_tri_index);      
       dscene->prim_tri_verts.give_data(pack.prim_tri_verts);
       dscene->prim_type.give_data(pack.prim_type);
       dscene->prim_visibility.give_data(pack.prim_visibility);



More information about the Bf-blender-cvs mailing list