[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