[Bf-blender-cvs] [f5237f77049] blender-v2.83-release: Fix long OptiX BVH build times in Cycles with many objects

Patrick Mours noreply at git.blender.org
Thu Apr 30 17:57:29 CEST 2020


Commit: f5237f77049f8e5545d4f857e6e1a800b45e82ba
Author: Patrick Mours
Date:   Thu Apr 30 14:59:06 2020 +0200
Branches: blender-v2.83-release
https://developer.blender.org/rBf5237f77049f8e5545d4f857e6e1a800b45e82ba

Fix long OptiX BVH build times in Cycles with many objects

Looping over all primitives for every object is really slow, so this patch avoids that by moving
the necessary assignments inline with the primitive merging done for every geometry.

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

M	intern/cycles/bvh/bvh_optix.cpp

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

diff --git a/intern/cycles/bvh/bvh_optix.cpp b/intern/cycles/bvh/bvh_optix.cpp
index 26b64c24db5..740994b2ebc 100644
--- a/intern/cycles/bvh/bvh_optix.cpp
+++ b/intern/cycles/bvh/bvh_optix.cpp
@@ -156,6 +156,19 @@ void BVHOptiX::pack_tlas()
     PackedBVH &bvh_pack = geom->bvh->pack;
     int geom_prim_offset = geom->prim_offset;
 
+    // Merge visibility flags of all objects and fix object indices for non-instanced geometry
+    int object_index = 0;  // Unused for instanced geometry
+    int object_visibility = 0;
+    foreach (Object *ob, objects) {
+      if (ob->geometry == geom) {
+        object_visibility |= ob->visibility_for_tracing();
+        if (!geom->is_instanced()) {
+          object_index = ob->get_device_index();
+          break;
+        }
+      }
+    }
+
     // Merge primitive, object and triangle indexes
     if (!bvh_pack.prim_index.empty()) {
       int *bvh_prim_type = &bvh_pack.prim_type[0];
@@ -174,8 +187,8 @@ void BVHOptiX::pack_tlas()
         }
 
         pack_prim_type[pack_offset] = bvh_prim_type[i];
-        pack_prim_object[pack_offset] = 0;  // Unused for instanced geometry
-        pack_prim_visibility[pack_offset] = bvh_prim_visibility[i];
+        pack_prim_object[pack_offset] = object_index;
+        pack_prim_visibility[pack_offset] = bvh_prim_visibility[i] | object_visibility;
       }
     }
 
@@ -188,27 +201,6 @@ void BVHOptiX::pack_tlas()
       pack_verts_offset += prim_tri_size;
     }
   }
-
-  // Merge visibility flags of all objects and fix object indices for non-instanced geometry
-  foreach (Object *ob, objects) {
-    Geometry *const geom = ob->geometry;
-    size_t num_primitives = 0;
-
-    if (geom->type == Geometry::MESH) {
-      num_primitives = static_cast<Mesh *const>(geom)->num_triangles();
-    }
-    else if (geom->type == Geometry::HAIR) {
-      num_primitives = static_cast<Hair *const>(geom)->num_segments();
-    }
-
-    for (size_t i = 0; i < num_primitives; ++i) {
-      if (!geom->is_instanced()) {
-        assert(pack.prim_object[geom->optix_prim_offset + i] == 0);
-        pack.prim_object[geom->optix_prim_offset + i] = ob->get_device_index();
-      }
-      pack.prim_visibility[geom->optix_prim_offset + i] |= ob->visibility_for_tracing();
-    }
-  }
 }
 
 void BVHOptiX::pack_nodes(const BVHNode *)



More information about the Bf-blender-cvs mailing list