Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
m---------release/datafiles/locale0
m---------release/scripts/addons0
m---------release/scripts/addons_contrib0
-rw-r--r--source/blender/blenkernel/intern/lib_override.c40
-rw-r--r--source/blender/draw/engines/image/image_drawing_mode.hh22
m---------source/tools0
6 files changed, 50 insertions, 12 deletions
diff --git a/release/datafiles/locale b/release/datafiles/locale
-Subproject 620b85f16d03a6aadd7cae56969c9c29b06b992
+Subproject 050058417452bfba0cc9ae8692173eb02ac1ef3
diff --git a/release/scripts/addons b/release/scripts/addons
-Subproject 67f1fbca1482d9d9362a4001332e785c3fd5d23
+Subproject faa9fc7f98e19be54a715c24061185b04dff5b6
diff --git a/release/scripts/addons_contrib b/release/scripts/addons_contrib
-Subproject 7936dde9ece881d531b1a2ee6c45ddb56d30038
+Subproject 61e45814503f51963c91c51aaf764612e7c5dc7
diff --git a/source/blender/blenkernel/intern/lib_override.c b/source/blender/blenkernel/intern/lib_override.c
index 5abe0f5e6be..871e73b12bb 100644
--- a/source/blender/blenkernel/intern/lib_override.c
+++ b/source/blender/blenkernel/intern/lib_override.c
@@ -624,6 +624,35 @@ static void lib_override_linked_group_tag_recursive(LibOverrideGroupTagData *dat
}
}
+static bool lib_override_linked_group_tag_collections_keep_tagged_check_recursive(
+ LibOverrideGroupTagData *data, Collection *collection)
+{
+ /* NOTE: Collection's object cache (using bases, as returned by #BKE_collection_object_cache_get)
+ * is not usable here, as it may have become invalid from some previous operation and it should
+ * not be updated here. So instead only use collections' reliable 'raw' data to check if some
+ * object in the hierarchy of the given collection is still tagged for override. */
+ for (CollectionObject *collection_object = collection->gobject.first; collection_object != NULL;
+ collection_object = collection_object->next) {
+ Object *object = collection_object->ob;
+ if (object == NULL) {
+ continue;
+ }
+ if ((object->id.tag & data->tag) != 0) {
+ return true;
+ }
+ }
+
+ for (CollectionChild *collection_child = collection->children.first; collection_child != NULL;
+ collection_child = collection_child->next) {
+ if (lib_override_linked_group_tag_collections_keep_tagged_check_recursive(
+ data, collection_child->collection)) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
static void lib_override_linked_group_tag_clear_boneshapes_objects(LibOverrideGroupTagData *data)
{
Main *bmain = data->bmain;
@@ -646,15 +675,8 @@ static void lib_override_linked_group_tag_clear_boneshapes_objects(LibOverrideGr
if ((collection->id.tag & data->tag) == 0) {
continue;
}
- bool keep_tagged = false;
- const ListBase object_bases = BKE_collection_object_cache_get(collection);
- LISTBASE_FOREACH (Base *, base, &object_bases) {
- if ((base->object->id.tag & data->tag) != 0) {
- keep_tagged = true;
- break;
- }
- }
- if (!keep_tagged) {
+
+ if (!lib_override_linked_group_tag_collections_keep_tagged_check_recursive(data, collection)) {
collection->id.tag &= ~data->tag;
}
}
diff --git a/source/blender/draw/engines/image/image_drawing_mode.hh b/source/blender/draw/engines/image/image_drawing_mode.hh
index 3be34ef6acb..0450bb2b548 100644
--- a/source/blender/draw/engines/image/image_drawing_mode.hh
+++ b/source/blender/draw/engines/image/image_drawing_mode.hh
@@ -211,7 +211,7 @@ template<typename TextureMethod> class ScreenSpaceDrawingMode : public AbstractD
if (iterator.tile_data.tile_buffer == nullptr) {
continue;
}
- ensure_float_buffer(*iterator.tile_data.tile_buffer);
+ const bool float_buffer_created = ensure_float_buffer(*iterator.tile_data.tile_buffer);
const float tile_width = static_cast<float>(iterator.tile_data.tile_buffer->x);
const float tile_height = static_cast<float>(iterator.tile_data.tile_buffer->y);
@@ -313,6 +313,10 @@ template<typename TextureMethod> class ScreenSpaceDrawingMode : public AbstractD
0);
imb_freerectImbuf_all(&extracted_buffer);
}
+ /* TODO(jbakker): Find leak when rendering VSE and remove this call. */
+ if (float_buffer_created) {
+ imb_freerectfloatImBuf(iterator.tile_data.tile_buffer);
+ }
}
}
@@ -366,12 +370,19 @@ template<typename TextureMethod> class ScreenSpaceDrawingMode : public AbstractD
/**
* \brief Ensure that the float buffer of the given image buffer is available.
+ *
+ * Returns true when a float buffer was created. Somehow the VSE cache increases the ref
+ * counter, but might use a different mechanism for destructing the image, that doesn't free the
+ * rect_float as the refcounter isn't 0. To work around this we destruct any created local
+ * buffers ourself.
*/
- void ensure_float_buffer(ImBuf &image_buffer) const
+ bool ensure_float_buffer(ImBuf &image_buffer) const
{
if (image_buffer.rect_float == nullptr) {
IMB_float_from_rect(&image_buffer);
+ return true;
}
+ return false;
}
void do_full_update_texture_slot(const IMAGE_InstanceData &instance_data,
@@ -382,7 +393,7 @@ template<typename TextureMethod> class ScreenSpaceDrawingMode : public AbstractD
{
const int texture_width = texture_buffer.x;
const int texture_height = texture_buffer.y;
- ensure_float_buffer(tile_buffer);
+ const bool float_buffer_created = ensure_float_buffer(tile_buffer);
/* IMB_transform works in a non-consistent space. This should be documented or fixed!.
* Construct a variant of the info_uv_to_texture that adds the texel space
@@ -417,6 +428,11 @@ template<typename TextureMethod> class ScreenSpaceDrawingMode : public AbstractD
IMB_FILTER_NEAREST,
uv_to_texel,
crop_rect_ptr);
+
+ /* TODO(jbakker): Find leak when rendering VSE and remove this call. */
+ if (float_buffer_created) {
+ imb_freerectfloatImBuf(&tile_buffer);
+ }
}
public:
diff --git a/source/tools b/source/tools
-Subproject 26bc78162ec89f21453ce3ded7b999bc6649f32
+Subproject 7fd2ed908b4f50140670caf6786e5ed245b7913