[Bf-blender-cvs] [d77ec21] GPU_data_request: Fix crashes on undo when workflow has a nodetree.

Antony Riakiotakis noreply at git.blender.org
Sat Apr 11 01:16:55 CEST 2015


Commit: d77ec2153b77935ff66ca9a2176fb9bc4f7c5d32
Author: Antony Riakiotakis
Date:   Sat Apr 11 01:16:27 2015 +0200
Branches: GPU_data_request
https://developer.blender.org/rBd77ec2153b77935ff66ca9a2176fb9bc4f7c5d32

Fix crashes on undo when workflow has a nodetree.

Still getting memory leaks on exit, they likely occur because main is
owner of nodetree but we should give it to workflow instead.

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

M	source/blender/blenkernel/BKE_node.h
M	source/blender/blenkernel/intern/library.c
M	source/blender/blenkernel/intern/node.c
M	source/blender/blenkernel/intern/workflow_shaders.c
M	source/blender/blenloader/intern/readfile.c
M	source/blender/blenloader/intern/writefile.c

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

diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h
index 4059861..316212f 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -45,6 +45,7 @@
 #include "DNA_texture_types.h"
 #include "DNA_world_types.h"
 #include "DNA_linestyle_types.h"
+#include "DNA_view3d_types.h"
 
 #include "RNA_types.h"
 
@@ -665,6 +666,7 @@ struct NodeTreeIterStore {
 	Lamp *lamp;
 	World *world;
 	FreestyleLineStyle *linestyle;
+	GPUWorkflowShader *wfshader;
 };
 
 void BKE_node_tree_iter_init(struct NodeTreeIterStore *ntreeiter, struct Main *bmain);
diff --git a/source/blender/blenkernel/intern/library.c b/source/blender/blenkernel/intern/library.c
index 07bdd41..52bec17 100644
--- a/source/blender/blenkernel/intern/library.c
+++ b/source/blender/blenkernel/intern/library.c
@@ -114,6 +114,7 @@
 #include "BKE_scene.h"
 #include "BKE_text.h"
 #include "BKE_texture.h"
+#include "BKE_workflow_shaders.h"
 #include "BKE_world.h"
 
 #include "RNA_access.h"
@@ -1036,6 +1037,9 @@ void BKE_libblock_free_ex(Main *bmain, void *idv, bool do_id_user)
 		case ID_PC:
 			BKE_paint_curve_free((PaintCurve *)id);
 			break;
+		case ID_GPUWS:
+			BKE_workflow_shader_free((GPUWorkflowShader *)id);
+			break;
 	}
 
 	/* avoid notifying on removed data */
diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c
index 3ff570b1..063fc96 100644
--- a/source/blender/blenkernel/intern/node.c
+++ b/source/blender/blenkernel/intern/node.c
@@ -3698,6 +3698,7 @@ void BKE_node_tree_iter_init(struct NodeTreeIterStore *ntreeiter, struct Main *b
 	ntreeiter->lamp = bmain->lamp.first;
 	ntreeiter->world = bmain->world.first;
 	ntreeiter->linestyle = bmain->linestyle.first;
+	ntreeiter->wfshader = bmain->gpuworkflows.first;
 }
 bool BKE_node_tree_iter_step(struct NodeTreeIterStore *ntreeiter,
                              bNodeTree **r_nodetree, struct ID **r_id)
@@ -3737,6 +3738,11 @@ bool BKE_node_tree_iter_step(struct NodeTreeIterStore *ntreeiter,
 		*r_id       = (ID *)ntreeiter->linestyle;
 		ntreeiter->linestyle = ntreeiter->linestyle->id.next;
 	}
+	else if (ntreeiter->wfshader) {
+		*r_nodetree =       ntreeiter->wfshader->nodetree;
+		*r_id       = (ID *)ntreeiter->wfshader;
+		ntreeiter->wfshader = ntreeiter->wfshader->id.next;
+	}
 	else {
 		return false;
 	}
diff --git a/source/blender/blenkernel/intern/workflow_shaders.c b/source/blender/blenkernel/intern/workflow_shaders.c
index 8a0ea05..1fb4cc7 100644
--- a/source/blender/blenkernel/intern/workflow_shaders.c
+++ b/source/blender/blenkernel/intern/workflow_shaders.c
@@ -33,12 +33,21 @@
 #include "DNA_object_types.h"
 
 #include "BKE_library.h"
+#include "BKE_node.h"
 #include "BKE_workflow_shaders.h"
 
+#include "MEM_guardedalloc.h"
+
 
 void BKE_workflow_shader_free(GPUWorkflowShader *shader)
 {
-
+	/* is no lib link block, but world extension */
+	if (shader->nodetree) {
+		/* will be freed once this is handled properly, currently this resides in nodetree list */
+		//ntreeFreeTree_ex(shader->nodetree, true);
+		//MEM_freeN(shader->nodetree);
+		//shader->nodetree = NULL;
+	}
 }
 
 struct GPUWorkflowShader *BKE_workflow_shader_add(struct Main *bmain, const char *name)
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index fedb93f..69c55aa 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -1952,23 +1952,6 @@ static void direct_link_palette(FileData *fd, Palette *palette)
 	link_list(fd, &palette->colors);
 }
 
-static void lib_link_workflow_shader(FileData *UNUSED(fd), Main *main)
-{
-	GPUWorkflowShader *wfshader;
-
-	/* only link ID pointers */
-	for (wfshader = main->gpuworkflows.first; wfshader; wfshader = wfshader->id.next) {
-		if (wfshader->id.flag & LIB_NEED_LINK) {
-			wfshader->id.flag -= LIB_NEED_LINK;
-		}
-	}
-}
-
-static void direct_link_workflow_shader(FileData *UNUSED(fd), GPUWorkflowShader *UNUSED(wfshader))
-{
-
-}
-
 static void lib_link_paint_curve(FileData *UNUSED(fd), Main *main)
 {
 	PaintCurve *pc;
@@ -2525,6 +2508,7 @@ static bNodeTree *nodetree_from_id(ID *id)
 		case ID_LA: return ((Lamp *)id)->nodetree;
 		case ID_TE: return ((Tex *)id)->nodetree;
 		case ID_LS: return ((FreestyleLineStyle *)id)->nodetree;
+		case ID_GPUWS: return ((GPUWorkflowShader *)id)->nodetree;
 	}
 	return NULL;
 }
@@ -3094,6 +3078,30 @@ static void direct_link_camera(FileData *fd, Camera *ca)
 	direct_link_animdata(fd, ca->adt);
 }
 
+/*************** READ WORKFLOW SHADER *****************/
+
+static void lib_link_workflow_shader(FileData *fd, Main *main)
+{
+	GPUWorkflowShader *wfshader;
+
+	/* only link ID pointers */
+	for (wfshader = main->gpuworkflows.first; wfshader; wfshader = wfshader->id.next) {
+		if (wfshader->id.flag & LIB_NEED_LINK) {
+			wfshader->id.flag -= LIB_NEED_LINK;
+
+			if (wfshader->nodetree) {
+				lib_link_ntree(fd, &wfshader->id, wfshader->nodetree);
+				wfshader->nodetree->id.lib = wfshader->id.lib;
+				wfshader->nodetree->view_center[0] = 0.0;
+			}
+		}
+	}
+}
+
+static void direct_link_workflow_shader(FileData *fd, GPUWorkflowShader *wfshader)
+{
+	wfshader->nodetree = newdataadr(fd, wfshader->nodetree);
+}
 
 /* ************ READ LAMP ***************** */
 
@@ -6215,6 +6223,7 @@ void blo_lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *cursc
 					if (v3d->camera == NULL)
 						v3d->camera = sc->scene->camera;
 					v3d->ob_centre = restore_pointer_by_name(newmain, (ID *)v3d->ob_centre, USER_ONE);
+					v3d->activeworkflow = restore_pointer_by_name(newmain, (ID *)v3d->activeworkflow, USER_ONE);
 					
 					for (bgpic= v3d->bgpicbase.first; bgpic; bgpic= bgpic->next) {
 						if ((bgpic->ima = restore_pointer_by_name(newmain, (ID *)bgpic->ima, USER_IGNORE))) {
diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c
index f8c97af..1be3b81 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -3131,6 +3131,10 @@ static void write_gpuworkflows(WriteData *wd, ListBase *idbase)
 	for (wfshader = idbase->first; wfshader; wfshader = wfshader->id.next) {
 		if (wfshader->id.us > 0 || wd->current) {
 			writestruct(wd, ID_GPUWS, "GPUWorkflowShader", 1, wfshader);
+			if (wfshader->nodetree) {
+				writestruct(wd, DATA, "bNodeTree", 1, wfshader->nodetree);
+				write_nodetree(wd, wfshader->nodetree);
+			}
 			if (wfshader->id.properties) IDP_WriteProperty(wfshader->id.properties, wd);
 		}
 	}




More information about the Bf-blender-cvs mailing list