Commit: 27dd3accc2d56ab9aa324803e8d0ace3f653863e Author: Kévin Dietrich Date: Thu Nov 5 09:56:16 2020 +0100 Branches: cycles_procedural_api https://developer.blender.org/rB27dd3accc2d56ab9aa324803e8d0ace3f653863e
add code from optimization branch =================================================================== M intern/cycles/blender/blender_curves.cpp M intern/cycles/blender/blender_mesh.cpp M intern/cycles/bvh/bvh_optix.cpp M intern/cycles/bvh/bvh_optix.h M intern/cycles/device/device_memory.h M intern/cycles/device/device_optix.cpp M intern/cycles/render/attribute.cpp M intern/cycles/render/attribute.h M intern/cycles/render/background.cpp M intern/cycles/render/geometry.cpp M intern/cycles/render/geometry.h M intern/cycles/render/hair.cpp M intern/cycles/render/hair.h M intern/cycles/render/integrator.cpp M intern/cycles/render/mesh.cpp M intern/cycles/render/mesh.h M intern/cycles/render/object.cpp M intern/cycles/render/object.h M intern/cycles/render/scene.cpp M intern/cycles/render/scene.h =================================================================== diff --git a/intern/cycles/blender/blender_curves.cpp b/intern/cycles/blender/blender_curves.cpp index 40f7a8c8c11..02f4f57e2dc 100644 --- a/intern/cycles/blender/blender_curves.cpp +++ b/intern/cycles/blender/blender_curves.cpp @@ -855,7 +855,16 @@ void BlenderSync::sync_hair(BL::Depsgraph b_depsgraph, BL::Object b_ob, Hair *ha } foreach (Attribute &attr, new_hair.attributes.attributes) { - hair->attributes.attributes.push_back(std::move(attr)); + Attribute *nattr = nullptr; + + if (attr.std != ATTR_STD_NONE) { + nattr = hair->attributes.add(attr.std, attr.name); + } + else { + nattr = hair->attributes.add(attr.name, attr.type, attr.element); + } + + nattr->set_data_from(attr); } /* tag update */ diff --git a/intern/cycles/blender/blender_mesh.cpp b/intern/cycles/blender/blender_mesh.cpp index 66347a59752..2e0335ca6da 100644 --- a/intern/cycles/blender/blender_mesh.cpp +++ b/intern/cycles/blender/blender_mesh.cpp @@ -1076,11 +1076,29 @@ void BlenderSync::sync_mesh(BL::Depsgraph b_depsgraph, BL::Object b_ob, Mesh *me } foreach (Attribute &attr, new_mesh.attributes.attributes) { - mesh->attributes.attributes.push_back(std::move(attr)); + Attribute *nattr = nullptr; + + if (attr.std != ATTR_STD_NONE) { + nattr = mesh->attributes.add(attr.std, attr.name); + } + else { + nattr = mesh->attributes.add(attr.name, attr.type, attr.element); + } + + nattr->set_data_from(attr); } foreach (Attribute &attr, new_mesh.subd_attributes.attributes) { - mesh->subd_attributes.attributes.push_back(std::move(attr)); + Attribute *nattr = nullptr; + + if (attr.std != ATTR_STD_NONE) { + nattr = mesh->subd_attributes.add(attr.std, attr.name); + } + else { + nattr = mesh->subd_attributes.add(attr.name, attr.type, attr.element); + } + + nattr->set_data_from(attr); } mesh->set_num_subd_faces(new_mesh.get_num_subd_faces()); diff --git a/intern/cycles/bvh/bvh_optix.cpp b/intern/cycles/bvh/bvh_optix.cpp index 52fc9c0a50d..cc4ebac13b0 100644 --- a/intern/cycles/bvh/bvh_optix.cpp +++ b/intern/cycles/bvh/bvh_optix.cpp @@ -29,6 +29,7 @@ # include "util/util_foreach.h" # include "util/util_logging.h" # include "util/util_progress.h" +# include "util/util_task.h" CCL_NAMESPACE_BEGIN @@ -147,24 +148,19 @@ void BVHOptiX::pack_tlas() size_t pack_verts_offset = 0; pack.prim_type.resize(prim_index_size); - int *pack_prim_type = pack.prim_type.data(); pack.prim_index.resize(prim_index_size); - int *pack_prim_index = pack.prim_index.data(); pack.prim_object.resize(prim_index_size); - int *pack_prim_object = pack.prim_object.data(); pack.prim_visibility.resize(prim_index_size); - uint *pack_prim_visibility = pack.prim_visibility.data(); pack.prim_tri_index.resize(prim_index_size); - uint *pack_prim_tri_index = pack.prim_tri_index.data(); pack.prim_tri_verts.resize(prim_tri_verts_size); - float4 *pack_prim_tri_verts = pack.prim_tri_verts.data(); + + TaskPool pool; // Top-level BVH should only contain instances, see 'Geometry::need_build_bvh' // Iterate over scene mesh list instead of objects, since the 'prim_offset' is calculated based // on that list, which may be ordered differently from the object list. foreach (Geometry *geom, geometry) { 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 @@ -179,38 +175,63 @@ void BVHOptiX::pack_tlas() } } - // Merge primitive, object and triangle indexes - if (!bvh_pack.prim_index.empty()) { - int *bvh_prim_type = &bvh_pack.prim_type[0]; - int *bvh_prim_index = &bvh_pack.prim_index[0]; - 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; - } + pool.push(function_bind(&BVHOptiX::pack_instance, this, geom, pack_offset, pack_verts_offset, object_index, object_visibility)); - 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 (!bvh_pack.prim_index.empty()) { + pack_offset += bvh_pack.prim_index.size(); } - // 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, - bvh_pack.prim_tri_verts.data(), - prim_tri_size * sizeof(float4)); - pack_verts_offset += prim_tri_size; + pack_verts_offset += bvh_pack.prim_tri_verts.size(); + } + } + + pool.wait_work(); +} + +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(); + int *pack_prim_object = pack.prim_object.data(); + uint *pack_prim_visibility = pack.prim_visibility.data(); + uint *pack_prim_tri_index = pack.prim_tri_index.data(); + float4 *pack_prim_tri_verts = pack.prim_tri_verts.data(); + + PackedBVH &bvh_pack = geom->bvh->pack; + int geom_prim_offset = geom->prim_offset; + + // Merge primitive, object and triangle indexes + if (!bvh_pack.prim_index.empty()) { + int *bvh_prim_type = &bvh_pack.prim_type[0]; + int *bvh_prim_index = &bvh_pack.prim_index[0]; + 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; + } + + 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, + bvh_pack.prim_tri_verts.data(), + prim_tri_size * sizeof(float4)); + pack_verts_offset += prim_tri_size; + } } void BVHOptiX::pack_nodes(const BVHNode *) diff --git a/intern/cycles/bvh/bvh_optix.h b/intern/cycles/bvh/bvh_optix.h index 663cba67260..a3ab92bbe53 100644 --- a/intern/cycles/bvh/bvh_optix.h +++ b/intern/cycles/bvh/bvh_optix.h @@ -49,6 +49,8 @@ class BVHOptiX : public BVH { void pack_blas(); void pack_tlas(); + void pack_instance(Geometry *geom, size_t pack_offset, size_t pack_verts_offset, int object_index, int object_visibility); + virtual void pack_nodes(const BVHNode *) override; virtual void refit_nodes() override; diff --git a/intern/cycles/device/device_memory.h b/intern/cycles/device/device_memory.h index 00b2aa864aa..f1180ce58ee 100644 --- a/intern/cycles/device/device_memory.h +++ b/intern/cycles/device/device_memory.h @@ -324,11 +324,15 @@ template<typename T> class device_only_memory : public device_memory { template<typename T> class device_vector : public device_memory { public: + bool modified; + size_t data_copied = 0; + device_vector(Device *device, const char *name, MemoryType type) : device_memory(device, name, type) { data_type = device_type_traits<T>::data_type; data_elements = device_type_traits<T>::num_elements; + modified = true; assert(data_elements > 0); } @@ -347,6 +351,7 @@ template<typename T> class device_vector : public device_memory { device_free(); host_free(); host_pointer = host_alloc(sizeof(T) * new_size); + modified = true; assert(device_pointer == 0); } @@ -411,10 +416,11 @@ template<typename T> class device_vector : public device_memory { data_height = 0; data_depth = 0; host_pointer = 0; + modified = true; assert(device_pointer == 0); } - size_t size() + size_t size() const { return data_size; } @@ -433,6 +439,13 @@ template<typename T> class device_vector : public device_memory { void copy_to_device() { device_copy_to(); + modified = false; + data_copied = byte_size(); + } + + size_t byte_size() const + { + return size() * sizeof(T); } void copy_from_device() diff --git a/intern/cycles/device/device_optix.cpp b/intern/cycles/device/device_optix.cpp index 95234845f98..a5a8c8b54b9 100644 --- a/intern/cycles/device/device_optix.cpp +++ b/intern/cycles/device/device_optix.cpp @@ -1193,10 +1193,19 @@ class OptiXDevice : public CUDADevice { // Free all previous acceleration structures which can not be refit std::set<CUdeviceptr> refit_mem; + if (static_cast<BVHOptiX *>(bvh)->do_refit) { + refit_mem.insert(static_cast<BVHOptiX *>(bvh)->optix_data_handle); + } + for (Geometry *geom : bvh->geometry) { if (static_cast<BVHOptiX *>(geom->bvh)->do_refit) { refit_mem.insert(static_cast<BVHOptiX *>(geom->bvh)->optix_data_handle); } + + if (!geom->is_modified()) { + static_cast<BVHOptiX *>(geom->bvh)->do_refit = true; + refit_mem.insert(static_cast<BVHOptiX *>(geom->bvh)->optix_data_handle @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs