[Bf-blender-cvs] [27dd3accc2d] cycles_procedural_api: add code from optimization branch

Kévin Dietrich noreply at git.blender.org
Thu Nov 5 18:57:53 CET 2020


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. @@



More information about the Bf-blender-cvs mailing list