[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