diff options
author | Bastien Montagne <bastien@blender.org> | 2022-02-02 18:30:12 +0300 |
---|---|---|
committer | Bastien Montagne <bastien@blender.org> | 2022-02-02 18:30:12 +0300 |
commit | 04a93b795c2399f7861f99039444b1d56cb47b8e (patch) | |
tree | adef90bb217c5304c2be154e73a352149f2adca6 /source | |
parent | e54fba5591a95238b7106b6e1fba6164c69dd622 (diff) | |
parent | 43b0ff3054bae229ce033d440b116c6b73fd01bc (diff) |
Merge branch 'blender-v3.1-release'
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/blenkernel/intern/lib_override.c | 40 | ||||
-rw-r--r-- | source/blender/draw/engines/image/image_drawing_mode.hh | 22 | ||||
m--------- | source/tools | 0 |
3 files changed, 50 insertions, 12 deletions
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 |