[Bf-blender-cvs] [5d534f947d8] soc-2019-npr: LANPR: hide render_buffer from SceneLANPR, implemented copy and free functions. No memory leaks on software mode now.

Yiming Wu noreply at git.blender.org
Mon Jun 10 10:15:23 CEST 2019


Commit: 5d534f947d802f86df6271ee54185540dc12216a
Author: Yiming Wu
Date:   Mon Jun 10 16:15:11 2019 +0800
Branches: soc-2019-npr
https://developer.blender.org/rB5d534f947d802f86df6271ee54185540dc12216a

LANPR: hide render_buffer from SceneLANPR, implemented copy and free functions. No memory leaks on software mode now.

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

M	source/blender/blenkernel/intern/scene.c
M	source/blender/blenloader/intern/readfile.c
M	source/blender/draw/engines/lanpr/lanpr_access.c
M	source/blender/draw/engines/lanpr/lanpr_access.h
M	source/blender/draw/engines/lanpr/lanpr_all.h
M	source/blender/draw/engines/lanpr/lanpr_dpix.c
M	source/blender/draw/engines/lanpr/lanpr_engine.c
M	source/blender/draw/engines/lanpr/lanpr_ops.c
M	source/blender/makesdna/DNA_scene_types.h

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

diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c
index 34aef80f88f..0768279724f 100644
--- a/source/blender/blenkernel/intern/scene.c
+++ b/source/blender/blenkernel/intern/scene.c
@@ -95,6 +95,8 @@
 
 #include "engines/eevee/eevee_lightcache.h"
 
+#include "engines/lanpr/lanpr_access.h"
+
 #include "PIL_time.h"
 
 #include "IMB_colormanagement.h"
@@ -333,6 +335,11 @@ void BKE_scene_copy_data(Main *bmain, Scene *sce_dst, const Scene *sce_src, cons
   sce_dst->eevee.light_cache = NULL;
   sce_dst->eevee.light_cache_info[0] = '\0';
   /* TODO Copy the cache. */
+
+  /* lanpr data */
+
+  lanpr_copy_data(sce_src,sce_dst);
+  
 }
 
 Scene *BKE_scene_copy(Main *bmain, Scene *sce, int type)
@@ -542,6 +549,8 @@ void BKE_scene_free_ex(Scene *sce, const bool do_id_user)
     sce->eevee.light_cache = NULL;
   }
 
+  lanpr_free_everything(sce);
+
   /* These are freed on doversion. */
   BLI_assert(sce->layer_properties == NULL);
 }
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 26b3bb2b971..2bf7bfa109a 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -6988,7 +6988,6 @@ static void direct_link_scene(FileData *fd, Scene *sce)
 
   /* LANPR things */
   sce->lanpr.active_layer = newdataadr(fd, sce->lanpr.active_layer);
-  sce->lanpr.render_buffer = NULL;
   link_list(fd, &sce->lanpr.line_layers);
   for (LANPR_LineLayer *ll = sce->lanpr.line_layers.first; ll; ll = ll->next) {
     link_list(fd, &ll->components);
diff --git a/source/blender/draw/engines/lanpr/lanpr_access.c b/source/blender/draw/engines/lanpr/lanpr_access.c
index e17daec4a48..fb3b34d7b35 100644
--- a/source/blender/draw/engines/lanpr/lanpr_access.c
+++ b/source/blender/draw/engines/lanpr/lanpr_access.c
@@ -25,6 +25,8 @@
 #include "lanpr_all.h"
 #include "lanpr_access.h"
 
+extern LANPR_SharedResource lanpr_share;
+
 static BMVert *split_edge_and_move(BMesh *bm, BMEdge *edge, const float new_pos[3])
 {
   // Split edge one time and move the created vert to new_pos
@@ -42,7 +44,7 @@ void lanpr_generate_gpencil_geometry(
 {
   StrokeGpencilModifierData *gpmd = (StrokeGpencilModifierData *)md;
   Scene *scene = DEG_get_evaluated_scene(depsgraph);
-  LANPR_RenderBuffer *rb = scene->lanpr.render_buffer;
+  LANPR_RenderBuffer *rb = lanpr_share.render_buffer_shared;
 
   if (gpmd->object == NULL) {
     printf("NULL object!\n");
@@ -237,7 +239,7 @@ void lanpr_generate_gpencil_from_chain(
 {
   StrokeGpencilModifierData *gpmd = (StrokeGpencilModifierData *)md;
   Scene *scene = DEG_get_evaluated_scene(depsgraph);
-  LANPR_RenderBuffer *rb = scene->lanpr.render_buffer;
+  LANPR_RenderBuffer *rb = lanpr_share.render_buffer_shared;
 
   if (rb == NULL) {
     printf("NULL LANPR rb!\n");
@@ -288,7 +290,45 @@ void lanpr_update_data_for_external(Depsgraph *depsgraph)
   SceneLANPR *lanpr = &scene->lanpr;
   if (lanpr->master_mode != LANPR_MASTER_MODE_SOFTWARE)
     return;
-  if (!lanpr->render_buffer || lanpr->render_buffer->cached_for_frame != scene->r.cfra) {
+  if (!lanpr_share.render_buffer_shared || lanpr_share.render_buffer_shared->cached_for_frame != scene->r.cfra) {
     lanpr_compute_feature_lines_internal(depsgraph, lanpr, scene);
   }
 }
+
+void lanpr_copy_data(Scene* from, Scene* to){
+  SceneLANPR *lanpr= &from->lanpr;
+  LANPR_RenderBuffer* rb = lanpr_share.render_buffer_shared, *new_rb;
+  LANPR_LineLayer* ll,*new_ll;
+  LANPR_LineLayerComponent* llc,*new_llc;
+
+  list_handle_empty(&to->lanpr.line_layers);
+
+  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));
+    list_handle_empty(&new_ll->components);
+    new_ll->next=new_ll->prev=NULL;
+    BLI_addtail(&to->lanpr.line_layers,new_ll);
+    for(llc = ll->components.first;llc;llc=llc->next){
+      new_llc = MEM_callocN(sizeof(LANPR_LineLayerComponent),"Copied Line Layer Component");
+      memcpy(new_llc,llc,sizeof(LANPR_LineLayerComponent));
+      new_llc->next=new_llc->prev=NULL;
+      BLI_addtail(&new_ll->components,new_llc);
+    }
+  }
+
+  // render_buffer now only accessible from lanpr_share
+
+}
+
+void lanpr_free_everything(Scene* s){
+  SceneLANPR *lanpr= &s->lanpr;
+  LANPR_LineLayer* ll;
+  LANPR_LineLayerComponent* llc;
+  
+  while(ll = BLI_pophead(&lanpr->line_layers)){
+    while(llc=BLI_pophead(&ll->components))
+      MEM_freeN(llc);
+    MEM_freeN(ll);
+  }
+}
diff --git a/source/blender/draw/engines/lanpr/lanpr_access.h b/source/blender/draw/engines/lanpr/lanpr_access.h
index 5bc56b19910..cb16c3ae962 100644
--- a/source/blender/draw/engines/lanpr/lanpr_access.h
+++ b/source/blender/draw/engines/lanpr/lanpr_access.h
@@ -24,4 +24,8 @@ int lanpr_compute_feature_lines_internal(Depsgraph *depsgraph, SceneLANPR *lanpr
 
 void lanpr_destroy_render_data(struct LANPR_RenderBuffer *rb);
 
+void lanpr_copy_data(Scene* from, Scene* to);
+
+void lanpr_free_everything(Scene* s);
+
 #endif
diff --git a/source/blender/draw/engines/lanpr/lanpr_all.h b/source/blender/draw/engines/lanpr/lanpr_all.h
index 05fa5a47491..c302de82bb3 100644
--- a/source/blender/draw/engines/lanpr/lanpr_all.h
+++ b/source/blender/draw/engines/lanpr/lanpr_all.h
@@ -95,8 +95,6 @@ typedef struct LANPR_SharedResource {
   void *ved_viewport;
   void *ved_render;
 
-  void *rb_ref;
-
   int init_complete;
 
   SpinLock render_flag_lock;
@@ -268,7 +266,6 @@ typedef struct LANPR_Data {
 typedef struct LANPR_RenderTaskInfo {
   // thrd_t           ThreadHandle;
 
-  struct LANPR_RenderBuffer *render_buffer;
   int thread_id;
 
   LinkData *contour;
@@ -291,6 +288,8 @@ typedef struct LANPR_RenderTaskInfo {
 typedef struct LANPR_RenderBuffer {
   struct LANPR_RenderBuffer *prev, *next;
 
+  int is_copied; // for render.
+
   int w, h;
   int tile_size_w, tile_size_h;
   int tile_count_x, tile_count_y;
diff --git a/source/blender/draw/engines/lanpr/lanpr_dpix.c b/source/blender/draw/engines/lanpr/lanpr_dpix.c
index 4ea30ebf703..f81d7c7a504 100644
--- a/source/blender/draw/engines/lanpr/lanpr_dpix.c
+++ b/source/blender/draw/engines/lanpr/lanpr_dpix.c
@@ -227,7 +227,7 @@ int lanpr_feed_atlas_data_intersection_cache(void *vedata,
   LANPR_PrivateData *pd = stl->g_data;
   const DRWContextState *draw_ctx = DRW_context_state_get();
   SceneLANPR *lanpr = &draw_ctx->scene->lanpr;
-  LANPR_RenderBuffer *rb = lanpr->render_buffer;
+  LANPR_RenderBuffer *rb = lanpr_share.render_buffer_shared;
   LinkData *lip;
   LANPR_RenderLine *rl;
   int i, idx;
@@ -342,7 +342,7 @@ void lanpr_create_atlas_intersection_preview(void *vedata, int begin_index)
   LANPR_PrivateData *pd = stl->g_data;
   const DRWContextState *draw_ctx = DRW_context_state_get();
   SceneLANPR *lanpr = &draw_ctx->scene->lanpr;
-  LANPR_RenderBuffer *rb = lanpr->render_buffer;
+  LANPR_RenderBuffer *rb = lanpr_share.render_buffer_shared;
   float co[2];
   int i;
 
diff --git a/source/blender/draw/engines/lanpr/lanpr_engine.c b/source/blender/draw/engines/lanpr/lanpr_engine.c
index db0528dd182..5e2e1d820bf 100644
--- a/source/blender/draw/engines/lanpr/lanpr_engine.c
+++ b/source/blender/draw/engines/lanpr/lanpr_engine.c
@@ -173,8 +173,9 @@ static void lanpr_engine_free(void)
     stl->g_data = 0;
   }
 
-  lanpr_destroy_render_data(lanpr_share.rb_ref);
-
+  lanpr_destroy_render_data(lanpr_share.render_buffer_shared);
+  MEM_freeN(lanpr_share.render_buffer_shared);//no longer needed.
+  lanpr_share.render_buffer_shared=NULL;
 }
 
 void lanpr_calculate_normal_object_vector(LANPR_LineLayer *ll, float *normal_object_direction);
@@ -438,7 +439,7 @@ static void lanpr_cache_finish(void *vedata)
 
   if (lanpr->master_mode == LANPR_MASTER_MODE_DPIX && lanpr->active_layer) {
     if (lanpr->reloaded) {
-      if (lanpr->render_buffer) {
+      if (lanpr_share.render_buffer_shared) {
         lanpr_feed_atlas_data_intersection_cache(vedata,
                                                  pd->atlas_pl,
                                                  pd->atlas_pr,
@@ -469,10 +470,10 @@ static void lanpr_cache_finish(void *vedata)
       DRW_shgroup_call(pd->dpix_preview_shgrp, bi->dpix_preview_batch, 0);
     }
 
-    if (lanpr->render_buffer && lanpr->render_buffer->DPIXIntersectionBatch) {
+    if (lanpr_share.render_buffer_shared && lanpr_share.render_buffer_shared->DPIXIntersectionBatch) {
       DRW_shgroup_call(
-          pd->dpix_transform_shgrp, lanpr->render_buffer->DPIXIntersectionTransformBatch, 0);
-      DRW_shgroup_call(pd->dpix_preview_shgrp, lanpr->render_buffer->DPIXIntersectionBatch, 0);
+          pd->dpix_transform_shgrp, lanpr_share.render_buffer_shared->DPIXIntersectionTransformBatch, 0);
+      DRW_shgroup_call(pd->dpix_preview_shgrp, lanpr_share.render_buffer_shared->DPIXIntersectionBatch, 0);
     }
   }
 }
@@ -537,9 +538,6 @@ static void lanpr_draw_scene_exec(void *vedata, GPUFrameBuffer *dfb, int is_rend
     // should isolate these into a seperate function.
     lanpr_software_draw_scene(vedata, dfb, is_render);
   }
-
-  // Draw can create stuff there.
-  lanpr_share.rb_ref = lanpr->render_buffer;
 }
 
 static void lanpr_draw_scene(void *vedata)
@@ -625,9 +623,9 @@ static void lanpr_render_to_image(LANPR_Data *vedata,
 
   if (lanpr->master_mode == LANPR_MASTER_MODE_SOFTWARE ||
       (lanpr->master_mode == LANPR_MASTER_MODE_DPIX && lanpr->enable_intersections)) {
-    if (!lanpr->render_buffer)
+    if (!lanpr_share.render_buffer_shared)
       lanpr_create_render_buffer(lanpr);
-    if (lanpr->render_buffer->cached_for_frame != scene->r.cfra || LANPR_GLOBAL_update_tag) {
+    if (lanpr_share.render_buffer_shared->cached_for_frame != scene->r.cfra || LANPR_GLOBAL_update_tag) {
       lanpr_compute_feature_lines_internal(draw_ctx->depsgraph, lanpr, scene);
     }
   }
@@ -662,7 +660,7 @@ static void lanpr_render_to_image(LANPR_Data *vedata,
   lanpr_cache_finish(vedata);
 
   /* get ref for destroy data */
-  lanpr_share.rb_ref = lanpr->render_buffer;
+  //lanpr_share.rb_ref = lanpr->render_buffer;
 
   DRW_render_instance_buffer_finish();
 
diff --git a/source/blender/draw/engines/lanpr/lanpr_ops.c b/

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list