From bd80ace2da72256801ca7579ca92cf4fe7a6a513 Mon Sep 17 00:00:00 2001 From: Dalai Felinto Date: Tue, 26 Dec 2017 13:31:45 -0200 Subject: Depsgraph: Fix copy-on-write assert when freeing Freestyle config We were bumping user count when duplicating viewlayer and its freestyleconfig depending on the flag, however when freeing we were always decreasing user count. This fixes this and get rid of the assert when running: `--factory-startup --enable-copy-on-write` And closing Blender. --- source/blender/blenkernel/BKE_freestyle.h | 2 +- source/blender/blenkernel/BKE_layer.h | 1 + source/blender/blenkernel/intern/freestyle.c | 10 +++++++--- source/blender/blenkernel/intern/layer.c | 9 +++++++-- source/blender/blenkernel/intern/scene.c | 2 +- source/blender/blenloader/intern/versioning_280.c | 6 +++--- 6 files changed, 20 insertions(+), 10 deletions(-) diff --git a/source/blender/blenkernel/BKE_freestyle.h b/source/blender/blenkernel/BKE_freestyle.h index 1045fde0039..f7368683d93 100644 --- a/source/blender/blenkernel/BKE_freestyle.h +++ b/source/blender/blenkernel/BKE_freestyle.h @@ -49,7 +49,7 @@ typedef struct FreestyleModuleSettings FreestyleModuleSettings; /* FreestyleConfig */ void BKE_freestyle_config_init(FreestyleConfig *config); -void BKE_freestyle_config_free(FreestyleConfig *config); +void BKE_freestyle_config_free(FreestyleConfig *config, const bool do_id_user); void BKE_freestyle_config_copy(FreestyleConfig *new_config, FreestyleConfig *config, const int flag); /* FreestyleConfig.modules */ diff --git a/source/blender/blenkernel/BKE_layer.h b/source/blender/blenkernel/BKE_layer.h index 6a762c9b711..77f760a7843 100644 --- a/source/blender/blenkernel/BKE_layer.h +++ b/source/blender/blenkernel/BKE_layer.h @@ -66,6 +66,7 @@ struct ViewLayer *BKE_view_layer_group_add(struct Group *group); struct ViewLayer *BKE_view_layer_context_active_PLACEHOLDER(const struct Scene *scene); void BKE_view_layer_free(struct ViewLayer *view_layer); +void BKE_view_layer_free_ex(struct ViewLayer *view_layer, const bool do_id_user); void BKE_view_layer_selected_objects_tag(struct ViewLayer *view_layer, const int tag); diff --git a/source/blender/blenkernel/intern/freestyle.c b/source/blender/blenkernel/intern/freestyle.c index 686fe3bda93..b656d2cf7c0 100644 --- a/source/blender/blenkernel/intern/freestyle.c +++ b/source/blender/blenkernel/intern/freestyle.c @@ -61,17 +61,21 @@ void BKE_freestyle_config_init(FreestyleConfig *config) BLI_listbase_clear(&config->linesets); } -void BKE_freestyle_config_free(FreestyleConfig *config) +void BKE_freestyle_config_free(FreestyleConfig *config, const bool do_id_user) { FreestyleLineSet *lineset; for (lineset = (FreestyleLineSet *)config->linesets.first; lineset; lineset = lineset->next) { if (lineset->group) { - id_us_min(&lineset->group->id); + if (do_id_user) { + id_us_min(&lineset->group->id); + } lineset->group = NULL; } if (lineset->linestyle) { - id_us_min(&lineset->linestyle->id); + if (do_id_user) { + id_us_min(&lineset->linestyle->id); + } lineset->linestyle = NULL; } } diff --git a/source/blender/blenkernel/intern/layer.c b/source/blender/blenkernel/intern/layer.c index 2e6cd769db8..288dcb34439 100644 --- a/source/blender/blenkernel/intern/layer.c +++ b/source/blender/blenkernel/intern/layer.c @@ -163,10 +163,15 @@ ViewLayer *BKE_view_layer_group_add(Group *group) return view_layer; } +void BKE_view_layer_free(ViewLayer *view_layer) +{ + BKE_view_layer_free_ex(view_layer, true); +} + /** * Free (or release) any data used by this ViewLayer. */ -void BKE_view_layer_free(ViewLayer *view_layer) +void BKE_view_layer_free_ex(ViewLayer *view_layer, const bool do_id_user) { view_layer->basact = NULL; @@ -205,7 +210,7 @@ void BKE_view_layer_free(ViewLayer *view_layer) MEM_SAFE_FREE(view_layer->stats); - BKE_freestyle_config_free(&view_layer->freestyle_config); + BKE_freestyle_config_free(&view_layer->freestyle_config, do_id_user); if (view_layer->id_properties) { IDP_FreeProperty(view_layer->id_properties); diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c index 22c3da09f13..a462e5b215c 100644 --- a/source/blender/blenkernel/intern/scene.c +++ b/source/blender/blenkernel/intern/scene.c @@ -540,7 +540,7 @@ void BKE_scene_free_ex(Scene *sce, const bool do_id_user) view_layer_next = view_layer->next; BLI_remlink(&sce->view_layers, view_layer); - BKE_view_layer_free(view_layer); + BKE_view_layer_free_ex(view_layer, do_id_user); } /* Master Collection */ diff --git a/source/blender/blenloader/intern/versioning_280.c b/source/blender/blenloader/intern/versioning_280.c index b864c75c90f..31d3b48aee0 100644 --- a/source/blender/blenloader/intern/versioning_280.c +++ b/source/blender/blenloader/intern/versioning_280.c @@ -352,7 +352,7 @@ void do_versions_after_linking_280(Main *main) view_layer->pass_xor = srl->pass_xor; view_layer->pass_alpha_threshold = srl->pass_alpha_threshold; - BKE_freestyle_config_free(&view_layer->freestyle_config); + BKE_freestyle_config_free(&view_layer->freestyle_config, true); view_layer->freestyle_config = srl->freestyleConfig; view_layer->id_properties = srl->prop; @@ -425,7 +425,7 @@ void do_versions_after_linking_280(Main *main) IDP_FreeProperty(srl->prop); MEM_freeN(srl->prop); } - BKE_freestyle_config_free(&srl->freestyleConfig); + BKE_freestyle_config_free(&srl->freestyleConfig, true); } } BLI_freelistN(&scene->r.layers); @@ -540,7 +540,7 @@ void do_versions_after_linking_280(Main *main) IDP_FreeProperty(srl->prop); MEM_freeN(srl->prop); } - BKE_freestyle_config_free(&srl->freestyleConfig); + BKE_freestyle_config_free(&srl->freestyleConfig, true); } BLI_freelistN(&scene->r.layers); } -- cgit v1.2.3