[Bf-blender-cvs] [117c0c18a35] lanpr-under-gp: LANPR: Memory copy/deleting implemented into depsgrapgh callback. No leaks now.

YimingWu noreply at git.blender.org
Sun Jun 7 16:29:10 CEST 2020


Commit: 117c0c18a35af68b55960f7f8a7fb506e7aa75b8
Author: YimingWu
Date:   Thu Jun 4 22:27:54 2020 +0800
Branches: lanpr-under-gp
https://developer.blender.org/rB117c0c18a35af68b55960f7f8a7fb506e7aa75b8

LANPR: Memory copy/deleting implemented into depsgrapgh callback. No leaks now.

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

M	source/blender/blenkernel/intern/collection.c
M	source/blender/blenkernel/intern/scene.c
M	source/blender/editors/lanpr/lanpr_cpu.c

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

diff --git a/source/blender/blenkernel/intern/collection.c b/source/blender/blenkernel/intern/collection.c
index 1352c0b8a14..dd99654e2d4 100644
--- a/source/blender/blenkernel/intern/collection.c
+++ b/source/blender/blenkernel/intern/collection.c
@@ -74,6 +74,15 @@ static bool collection_find_child_recursive(Collection *parent, Collection *coll
 
 /****************************** Collection Datablock ************************/
 
+static void collection_lanpr_copy(const Collection *src, Collection *dst)
+{
+  if (src->lanpr) {
+    CollectionLANPR *lanpr = MEM_callocN(sizeof(CollectionLANPR), "CollectionLANPR");
+    dst->lanpr = lanpr;
+    memcpy(dst->lanpr, src->lanpr, sizeof(CollectionLANPR));
+  }
+}
+
 /**
  * Only copy internal data of Collection ID from source
  * to already allocated/initialized destination.
@@ -113,6 +122,7 @@ static void collection_copy_data(Main *bmain, ID *id_dst, const ID *id_src, cons
   LISTBASE_FOREACH (CollectionObject *, cob, &collection_src->gobject) {
     collection_object_add(bmain, collection_dst, cob->ob, flag, false);
   }
+  collection_lanpr_copy(collection_src, collection_dst);
 }
 
 static void collection_free_data(ID *id)
@@ -127,6 +137,9 @@ static void collection_free_data(ID *id)
   BLI_freelistN(&collection->parents);
 
   BKE_collection_object_cache_free(collection);
+
+  /* Remove LANPR configurations */
+  MEM_SAFE_FREE(collection->lanpr);
 }
 
 static void collection_foreach_id(ID *id, LibraryForeachIDData *data)
diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c
index 4c11d5c9263..4cb6a7157e5 100644
--- a/source/blender/blenkernel/intern/scene.c
+++ b/source/blender/blenkernel/intern/scene.c
@@ -221,6 +221,35 @@ static void scene_init_data(ID *id)
   BKE_view_layer_add(scene, "View Layer", NULL, VIEWLAYER_ADD_NEW);
 }
 
+static void BKE_lanpr_free_everything(Scene *s)
+{
+  SceneLANPR *lanpr = &s->lanpr;
+  LANPR_LineLayer *ll;
+
+  while ((ll = BLI_pophead(&lanpr->line_layers)) != NULL) {
+    MEM_freeN(ll);
+  }
+}
+
+static void BKE_lanpr_copy_data(const Scene *from, Scene *to)
+{
+  const SceneLANPR *lanpr = &from->lanpr;
+  LANPR_LineLayer *ll, *new_ll;
+
+  to->lanpr.line_layers.first = to->lanpr.line_layers.last = NULL;
+  memset(&to->lanpr.line_layers, 0, sizeof(ListBase));
+
+  for (ll = lanpr->line_layers.first; ll; ll = ll->next) {
+    new_ll = MEM_callocN(sizeof(LANPR_LineLayer), "Copied Line Layer");
+    memcpy(new_ll, ll, sizeof(LANPR_LineLayer));
+    new_ll->next = new_ll->prev = NULL;
+    new_ll->batch = NULL;
+    BLI_addtail(&to->lanpr.line_layers, new_ll);
+  }
+
+  /*  render_buffer now only accessible from lanpr_share */
+}
+
 static void scene_copy_data(Main *bmain, ID *id_dst, const ID *id_src, const int flag)
 {
   Scene *scene_dst = (Scene *)id_dst;
@@ -331,6 +360,9 @@ static void scene_copy_data(Main *bmain, ID *id_dst, const ID *id_src, const int
     scene_dst->preview = NULL;
   }
 
+  /*  LANPR  data */
+  BKE_lanpr_copy_data(scene_src, scene_dst);
+
   BKE_scene_copy_data_eevee(scene_dst, scene_src);
 }
 
@@ -417,6 +449,9 @@ static void scene_free_data(ID *id)
     scene->display.shading.prop = NULL;
   }
 
+  /* LANPR data */
+  BKE_lanpr_free_everything(scene);
+
   /* These are freed on doversion. */
   BLI_assert(scene->layer_properties == NULL);
 }
@@ -978,6 +1013,9 @@ Scene *BKE_scene_copy(Main *bmain, Scene *sce, int type)
       BKE_sequencer_editing_free(sce_copy, true);
     }
 
+    /*  LANPR  data */
+    BKE_lanpr_copy_data(sce, sce_copy);
+
     /* NOTE: part of SCE_COPY_FULL operations
      * are done outside of blenkernel with ED_object_single_users! */
 
diff --git a/source/blender/editors/lanpr/lanpr_cpu.c b/source/blender/editors/lanpr/lanpr_cpu.c
index a08e2a052ed..0624cd8b00a 100644
--- a/source/blender/editors/lanpr/lanpr_cpu.c
+++ b/source/blender/editors/lanpr/lanpr_cpu.c
@@ -2507,7 +2507,7 @@ static void lanpr_compute_scene_contours(LANPR_RenderBuffer *rb, const float thr
 
 /* Buffer operations */
 
-void ED_lanpr_destroy_render_data(void)
+static void lanpr_destroy_render_data(void)
 {
   LANPR_RenderBuffer *rb = lanpr_share.render_buffer_shared;
   if (rb == NULL) {
@@ -2542,13 +2542,21 @@ void ED_lanpr_destroy_render_data(void)
 
   mem_static_destroy(&rb->render_data_pool);
 }
+
+void ED_lanpr_destroy_render_data(void)
+{
+  lanpr_destroy_render_data();
+  LANPR_RenderBuffer *rb = lanpr_share.render_buffer_shared;
+  if (rb) {
+    MEM_freeN(rb);
+  }
+}
+
 LANPR_RenderBuffer *ED_lanpr_create_render_buffer(Scene *s)
 {
   /* Re-init render_buffer_shared */
   if (lanpr_share.render_buffer_shared) {
-    LANPR_RenderBuffer *rb = lanpr_share.render_buffer_shared;
     ED_lanpr_destroy_render_data();
-    MEM_freeN(rb);
   }
 
   LANPR_RenderBuffer *rb = MEM_callocN(sizeof(LANPR_RenderBuffer), "LANPR render buffer");



More information about the Bf-blender-cvs mailing list