[Bf-blender-cvs] [bd80ace2da7] blender2.8: Depsgraph: Fix copy-on-write assert when freeing Freestyle config

Dalai Felinto noreply at git.blender.org
Tue Dec 26 16:40:42 CET 2017


Commit: bd80ace2da72256801ca7579ca92cf4fe7a6a513
Author: Dalai Felinto
Date:   Tue Dec 26 13:31:45 2017 -0200
Branches: blender2.8
https://developer.blender.org/rBbd80ace2da72256801ca7579ca92cf4fe7a6a513

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.

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

M	source/blender/blenkernel/BKE_freestyle.h
M	source/blender/blenkernel/BKE_layer.h
M	source/blender/blenkernel/intern/freestyle.c
M	source/blender/blenkernel/intern/layer.c
M	source/blender/blenkernel/intern/scene.c
M	source/blender/blenloader/intern/versioning_280.c

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

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);
 		}



More information about the Bf-blender-cvs mailing list