[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