[Bf-blender-cvs] [d8aa613d94c] master: Cleanup: add ImageHandle to centralize image ownership logic

Brecht Van Lommel noreply at git.blender.org
Wed Mar 11 20:48:42 CET 2020


Commit: d8aa613d94caf6a3d82a8f4e9e90b9b8f5c61a7d
Author: Brecht Van Lommel
Date:   Sun Mar 8 10:42:11 2020 +0100
Branches: master
https://developer.blender.org/rBd8aa613d94caf6a3d82a8f4e9e90b9b8f5c61a7d

Cleanup: add ImageHandle to centralize image ownership logic

===================================================================

M	intern/cycles/blender/blender_shader.cpp
M	intern/cycles/blender/blender_volume.cpp
M	intern/cycles/render/attribute.cpp
M	intern/cycles/render/attribute.h
M	intern/cycles/render/geometry.cpp
M	intern/cycles/render/geometry.h
M	intern/cycles/render/image.cpp
M	intern/cycles/render/image.h
M	intern/cycles/render/light.cpp
M	intern/cycles/render/mesh_volume.cpp
M	intern/cycles/render/nodes.cpp
M	intern/cycles/render/nodes.h

===================================================================

diff --git a/intern/cycles/blender/blender_shader.cpp b/intern/cycles/blender/blender_shader.cpp
index 25e1d60f84d..64367d5fcd0 100644
--- a/intern/cycles/blender/blender_shader.cpp
+++ b/intern/cycles/blender/blender_shader.cpp
@@ -686,14 +686,6 @@ static ShaderNode *add_node(Scene *scene,
       for (b_image.tiles.begin(b_iter); b_iter != b_image.tiles.end(); ++b_iter) {
         image->tiles.push_back(b_iter->number());
       }
-
-      /* TODO: restore */
-      /* TODO(sergey): Does not work properly when we change builtin type. */
-#if 0
-      if (b_image.is_updated()) {
-        scene->image_manager->tag_reload_image(image->image_key());
-      }
-#endif
     }
     node = image;
   }
@@ -730,14 +722,6 @@ static ShaderNode *add_node(Scene *scene,
 
       env->animated = b_env_node.image_user().use_auto_refresh();
       env->alpha_type = get_image_alpha_type(b_image);
-
-      /* TODO: restore */
-      /* TODO(sergey): Does not work properly when we change builtin type. */
-#if 0
-      if (b_image.is_updated()) {
-        scene->image_manager->tag_reload_image(env->image_key());
-      }
-#endif
     }
     node = env;
   }
@@ -885,14 +869,9 @@ static ShaderNode *add_node(Scene *scene,
     point_density->space = (NodeTexVoxelSpace)b_point_density_node.space();
     point_density->interpolation = get_image_interpolation(b_point_density_node);
     point_density->builtin_data = b_point_density_node.ptr.data;
-    point_density->image_manager = scene->image_manager;
 
-    /* TODO(sergey): Use more proper update flag. */
-    if (true) {
-      point_density->add_image();
-      b_point_density_node.cache_point_density(b_depsgraph);
-      scene->image_manager->tag_reload_image(point_density->image_key());
-    }
+    point_density->add_image(scene->image_manager);
+    b_point_density_node.cache_point_density(b_depsgraph);
     node = point_density;
 
     /* Transformation form world space to texture space.
diff --git a/intern/cycles/blender/blender_volume.cpp b/intern/cycles/blender/blender_volume.cpp
index 4dab60088bb..e11cc4ab18f 100644
--- a/intern/cycles/blender/blender_volume.cpp
+++ b/intern/cycles/blender/blender_volume.cpp
@@ -48,15 +48,12 @@ static void sync_smoke_volume(Scene *scene, BL::Object &b_ob, Mesh *mesh, float
     mesh->volume_isovalue = b_domain.clipping();
 
     Attribute *attr = mesh->attributes.add(std);
-    VoxelAttribute *volume_data = attr->data_voxel();
-    ImageMetaData metadata;
 
     ImageKey key;
     key.filename = Attribute::standard_name(std);
     key.builtin_data = b_ob.ptr.data;
 
-    volume_data->manager = image_manager;
-    volume_data->slot = image_manager->add_image(key, frame, metadata);
+    attr->add(image_manager->add_image(key, frame));
   }
 
   /* Create a matrix to transform from object space to mesh texture space.
diff --git a/intern/cycles/render/attribute.cpp b/intern/cycles/render/attribute.cpp
index 1e293f1aa16..fffd26f906a 100644
--- a/intern/cycles/render/attribute.cpp
+++ b/intern/cycles/render/attribute.cpp
@@ -28,13 +28,10 @@ CCL_NAMESPACE_BEGIN
 
 Attribute::~Attribute()
 {
-  /* for voxel data, we need to remove the image from the image manager */
+  /* For voxel data, we need to free the image handle. */
   if (element == ATTR_ELEMENT_VOXEL) {
-    VoxelAttribute *voxel_data = data_voxel();
-
-    if (voxel_data && voxel_data->slot != -1) {
-      voxel_data->manager->remove_image(voxel_data->slot);
-    }
+    ImageHandle &handle = data_voxel();
+    handle.~ImageHandle();
   }
 }
 
@@ -123,15 +120,13 @@ void Attribute::add(const Transform &f)
     buffer.push_back(data[i]);
 }
 
-void Attribute::add(const VoxelAttribute &f)
+void Attribute::add(const ImageHandle &handle)
 {
-  assert(data_sizeof() == sizeof(VoxelAttribute));
+  assert(data_sizeof() == sizeof(ImageHandle));
+  assert(buffer.size() == 0);
 
-  char *data = (char *)&f;
-  size_t size = sizeof(f);
-
-  for (size_t i = 0; i < size; i++)
-    buffer.push_back(data[i]);
+  buffer.resize(sizeof(ImageHandle));
+  new (buffer.data()) ImageHandle(handle);
 }
 
 void Attribute::add(const char *data)
@@ -145,7 +140,7 @@ void Attribute::add(const char *data)
 size_t Attribute::data_sizeof() const
 {
   if (element == ATTR_ELEMENT_VOXEL)
-    return sizeof(VoxelAttribute);
+    return sizeof(ImageHandle);
   else if (element == ATTR_ELEMENT_CORNER_BYTE)
     return sizeof(uchar4);
   else if (type == TypeDesc::TypeFloat)
diff --git a/intern/cycles/render/attribute.h b/intern/cycles/render/attribute.h
index f1fd30fd85a..23626410ac1 100644
--- a/intern/cycles/render/attribute.h
+++ b/intern/cycles/render/attribute.h
@@ -17,6 +17,8 @@
 #ifndef __ATTRIBUTE_H__
 #define __ATTRIBUTE_H__
 
+#include "render/image.h"
+
 #include "kernel/kernel_types.h"
 
 #include "util/util_list.h"
@@ -31,19 +33,12 @@ class Attribute;
 class AttributeRequest;
 class AttributeRequestSet;
 class AttributeSet;
-class ImageManager;
+class ImageHandle;
 class Geometry;
 class Hair;
 class Mesh;
 struct Transform;
 
-/* Attributes for voxels are images */
-
-struct VoxelAttribute {
-  ImageManager *manager;
-  int slot;
-};
-
 /* Attribute
  *
  * Arbitrary data layers on meshes.
@@ -105,10 +100,12 @@ class Attribute {
     assert(data_sizeof() == sizeof(Transform));
     return (Transform *)data();
   }
-  VoxelAttribute *data_voxel()
+
+  /* Attributes for voxels are images */
+  ImageHandle &data_voxel()
   {
-    assert(data_sizeof() == sizeof(VoxelAttribute));
-    return (VoxelAttribute *)data();
+    assert(data_sizeof() == sizeof(ImageHandle));
+    return *(ImageHandle *)data();
   }
 
   const char *data() const
@@ -140,10 +137,10 @@ class Attribute {
     assert(data_sizeof() == sizeof(Transform));
     return (const Transform *)data();
   }
-  const VoxelAttribute *data_voxel() const
+  const ImageHandle &data_voxel() const
   {
-    assert(data_sizeof() == sizeof(VoxelAttribute));
-    return (const VoxelAttribute *)data();
+    assert(data_sizeof() == sizeof(ImageHandle));
+    return *(const ImageHandle *)data();
   }
 
   void zero_data(void *dst);
@@ -153,8 +150,8 @@ class Attribute {
   void add(const float2 &f);
   void add(const float3 &f);
   void add(const uchar4 &f);
-  void add(const Transform &f);
-  void add(const VoxelAttribute &f);
+  void add(const Transform &tfm);
+  void add(const ImageHandle &handle);
   void add(const char *data);
 
   static bool same_storage(TypeDesc a, TypeDesc b);
diff --git a/intern/cycles/render/geometry.cpp b/intern/cycles/render/geometry.cpp
index 880fb7b4c7d..748a8f7cf67 100644
--- a/intern/cycles/render/geometry.cpp
+++ b/intern/cycles/render/geometry.cpp
@@ -534,8 +534,8 @@ static void update_attribute_element_offset(Geometry *geom,
 
     if (mattr->element == ATTR_ELEMENT_VOXEL) {
       /* store slot in offset value */
-      VoxelAttribute *voxel_data = mattr->data_voxel();
-      offset = voxel_data->slot;
+      ImageHandle &handle = mattr->data_voxel();
+      offset = handle.svm_slot();
     }
     else if (mattr->element == ATTR_ELEMENT_CORNER_BYTE) {
       uchar4 *data = mattr->data_uchar4();
@@ -1143,7 +1143,7 @@ void GeometryManager::device_update_preprocess(Device *device, Scene *scene, Pro
         }
 
         Mesh *mesh = static_cast<Mesh *>(geom);
-        create_volume_mesh(scene, mesh, progress);
+        create_volume_mesh(mesh, progress);
       }
     }
   }
@@ -1171,7 +1171,8 @@ void GeometryManager::device_update_displacement_images(Device *device,
           }
 
           ImageSlotTextureNode *image_node = static_cast<ImageSlotTextureNode *>(node);
-          foreach (int slot, image_node->slots) {
+          for (int i = 0; i < image_node->handle.num_tiles(); i++) {
+            const int slot = image_node->handle.svm_slot(i);
             if (slot != -1) {
               bump_images.insert(slot);
             }
@@ -1204,10 +1205,10 @@ void GeometryManager::device_update_volume_images(Device *device, Scene *scene,
         continue;
       }
 
-      VoxelAttribute *voxel = attr.data_voxel();
-
-      if (voxel->slot != -1) {
-        volume_images.insert(voxel->slot);
+      ImageHandle &handle = attr.data_voxel();
+      const int slot = handle.svm_slot();
+      if (slot != -1) {
+        volume_images.insert(slot);
       }
     }
   }
diff --git a/intern/cycles/render/geometry.h b/intern/cycles/render/geometry.h
index 66ae8472102..82f539d391d 100644
--- a/intern/cycles/render/geometry.h
+++ b/intern/cycles/render/geometry.h
@@ -166,7 +166,7 @@ class GeometryManager {
  protected:
   bool displace(Device *device, DeviceScene *dscene, Scene *scene, Mesh *mesh, Progress &progress);
 
-  void create_volume_mesh(Scene *scene, Mesh *mesh, Progress &progress);
+  void create_volume_mesh(Mesh *mesh, Progress &progress);
 
   /* Attributes */
   void update_osl_attributes(Device *device,
diff --git a/intern/cycles/render/image.cpp b/intern/cycles/render/image.cpp
index 7053d992621..123bb129466 100644
--- a/intern/cycles/render/image.cpp
+++ b/intern/cycles/render/image.cpp
@@ -79,6 +79,92 @@ const char *name_from_type(ImageDataType type)
 
 }  // namespace
 
+/* Image Handle */
+
+ImageHandle::ImageHandle() : manager(NULL)
+{
+}
+
+ImageHandle::ImageHandle(const ImageHandle &other) : slots(other.slots), manager(other.manager)
+{
+  /* Increase image user count. */
+  foreach (const int slot, slots) {
+    manager->add_image_user(slot);
+  }
+}
+
+ImageHandle &ImageHandle::operator=(const ImageHandle &other)
+{
+  clear();
+  manager = other.manager;
+  slots = other.slots;
+
+  foreach (const int slot, slots) {
+    manager->add_image_user(slot);
+  }
+
+  return *this;
+}
+
+ImageHandle::~ImageHandle()
+{
+  clear();
+}
+
+void ImageHandle::clear()
+{
+  foreach (const int slot, slots) {
+    manager->remove_image_user(slot);
+  }
+}
+
+bool ImageHandle::empty()
+{
+  return slots.empty();
+}
+
+int ImageHandle::num_tiles()
+{
+  return slots.size();
+}
+
+ImageMetaData ImageHandle::metadata()
+{
+  if (slots.empty()) {
+    return ImageMetaData();
+  }
+
+  return manager->images[slots.front()]->metadata;
+}
+
+int ImageHandle::svm_slot(const int tile_index)
+{
+  if (tile_index >= slots.size()) {
+    return -1;
+  }
+
+  if (manager->osl_texture_system

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list