[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