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); _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs