diff options
author | Patrick Mours <pmours@nvidia.com> | 2020-04-30 15:59:06 +0300 |
---|---|---|
committer | Patrick Mours <pmours@nvidia.com> | 2020-04-30 18:57:01 +0300 |
commit | f5237f77049f8e5545d4f857e6e1a800b45e82ba (patch) | |
tree | f469087c1366e49fc65c20ddcccf1cd2550b142e /intern/cycles/bvh/bvh_optix.cpp | |
parent | 9ee7fc15afdaf2649ecae1478fe6ad3ad89af325 (diff) |
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.
Diffstat (limited to 'intern/cycles/bvh/bvh_optix.cpp')
-rw-r--r-- | intern/cycles/bvh/bvh_optix.cpp | 38 |
1 files changed, 15 insertions, 23 deletions
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 *) |