[Bf-blender-cvs] [5e2fab456de] soc-2019-npr: LANPR: sample and batch pool goes to lanpr_share.

Yiming Wu noreply at git.blender.org
Mon Jun 10 11:17:35 CEST 2019


Commit: 5e2fab456de6eb92ab7df64eee345ff0077bf4f5
Author: Yiming Wu
Date:   Mon Jun 10 17:17:29 2019 +0800
Branches: soc-2019-npr
https://developer.blender.org/rB5e2fab456de6eb92ab7df64eee345ff0077bf4f5

LANPR: sample and batch pool goes to lanpr_share.

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

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_snake.c

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

diff --git a/source/blender/draw/engines/lanpr/lanpr_all.h b/source/blender/draw/engines/lanpr/lanpr_all.h
index c302de82bb3..bbf07ce39e8 100644
--- a/source/blender/draw/engines/lanpr/lanpr_all.h
+++ b/source/blender/draw/engines/lanpr/lanpr_all.h
@@ -78,6 +78,12 @@ typedef struct LANPR_SharedResource {
   /* We only allocate once for all */
   LANPR_RenderBuffer *render_buffer_shared;
 
+  /* cache */
+  BLI_mempool *mp_sample;
+  BLI_mempool *mp_line_strip;
+  BLI_mempool *mp_line_strip_point;
+  BLI_mempool *mp_batch_list;
+
   /* Snake */
   GPUShader *multichannel_shader;
   GPUShader *edge_detect_shader;
@@ -192,11 +198,6 @@ typedef struct LANPR_PrivateData {
   int width, height;  // if not match recreate buffer.
   void **sample_table;
 
-  BLI_mempool *mp_sample;
-  BLI_mempool *mp_line_strip;
-  BLI_mempool *mp_line_strip_point;
-  BLI_mempool *mp_batch_list;
-
   ListBase pending_samples;
   ListBase erased_samples;
   ListBase line_strips;
diff --git a/source/blender/draw/engines/lanpr/lanpr_dpix.c b/source/blender/draw/engines/lanpr/lanpr_dpix.c
index f81d7c7a504..674c622ff02 100644
--- a/source/blender/draw/engines/lanpr/lanpr_dpix.c
+++ b/source/blender/draw/engines/lanpr/lanpr_dpix.c
@@ -327,7 +327,7 @@ int lanpr_feed_atlas_trigger_preview_obj(void *vedata, Object *ob, int begin_ind
   GPUBatch *gb2 = GPU_batch_create_ex(
       GPU_PRIM_POINTS, vbo2, 0, GPU_USAGE_STATIC | GPU_BATCH_OWNS_VBO);
 
-  LANPR_BatchItem *bi = BLI_mempool_alloc(pd->mp_batch_list);
+  LANPR_BatchItem *bi = BLI_mempool_alloc(lanpr_share.mp_batch_list);
   BLI_addtail(&pd->dpix_batch_list, bi);
   bi->dpix_transform_batch = gb;
   bi->dpix_preview_batch = gb2;
diff --git a/source/blender/draw/engines/lanpr/lanpr_engine.c b/source/blender/draw/engines/lanpr/lanpr_engine.c
index 5e2e1d820bf..e3724dcd1db 100644
--- a/source/blender/draw/engines/lanpr/lanpr_engine.c
+++ b/source/blender/draw/engines/lanpr/lanpr_engine.c
@@ -157,25 +157,19 @@ static void lanpr_engine_init(void *ved)
 static void lanpr_engine_free(void)
 {
   void *ved = lanpr_share.ved_viewport;
-  if(ved){
-    LANPR_Data *vedata = (LANPR_Data *)ved;
-    LANPR_StorageList *stl = ((LANPR_Data *)vedata)->stl;
 
-    // only free custom data in storage list.
+  BLI_mempool* mp = lanpr_share.mp_batch_list;
 
-    BLI_mempool_destroy(stl->g_data->mp_line_strip);
-    BLI_mempool_destroy(stl->g_data->mp_line_strip_point);
-    BLI_mempool_destroy(stl->g_data->mp_sample);
-    BLI_mempool_destroy(stl->g_data->mp_batch_list);
-
-    lanpr_destroy_atlas(vedata);
-
-    stl->g_data = 0;
+  if(mp){
+    BLI_mempool_destroy(mp);
+    mp=NULL;
+  }
+  
+  if(lanpr_share.render_buffer_shared){
+    lanpr_destroy_render_data(lanpr_share.render_buffer_shared);
+    MEM_freeN(lanpr_share.render_buffer_shared);
+    lanpr_share.render_buffer_shared=NULL;
   }
-
-  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);
@@ -194,13 +188,10 @@ static void lanpr_cache_init(void *vedata)
   if (!stl->g_data) {
     /* Alloc transient pointers */
     stl->g_data = MEM_callocN(sizeof(*stl->g_data), __func__);
-    stl->g_data->mp_sample = BLI_mempool_create(
-        sizeof(LANPR_TextureSample), 0, 512, BLI_MEMPOOL_NOP);
-    stl->g_data->mp_line_strip = BLI_mempool_create(
-        sizeof(LANPR_LineStrip), 0, 512, BLI_MEMPOOL_NOP);
-    stl->g_data->mp_line_strip_point = BLI_mempool_create(
-        sizeof(LANPR_LineStripPoint), 0, 1024, BLI_MEMPOOL_NOP);
-    stl->g_data->mp_batch_list = BLI_mempool_create(
+  }
+
+  if(!lanpr_share.mp_batch_list){
+    lanpr_share.mp_batch_list = BLI_mempool_create(
         sizeof(LANPR_BatchItem), 0, 128, BLI_MEMPOOL_NOP);
   }
 
@@ -381,7 +372,7 @@ static void lanpr_cache_init(void *vedata)
       pd->atlas_edge_mask = MEM_callocN(fsize, "atlas_edge_mask");  // should always be float
 
       pd->dpix_batch_list.first = pd->dpix_batch_list.last = 0;
-      BLI_mempool_clear(pd->mp_batch_list);
+      BLI_mempool_clear(lanpr_share.mp_batch_list);
     }
   }
   else if (lanpr->master_mode == LANPR_MASTER_MODE_SOFTWARE) {
diff --git a/source/blender/draw/engines/lanpr/lanpr_snake.c b/source/blender/draw/engines/lanpr/lanpr_snake.c
index 612ce328e75..fe6dfe9a533 100644
--- a/source/blender/draw/engines/lanpr/lanpr_snake.c
+++ b/source/blender/draw/engines/lanpr/lanpr_snake.c
@@ -96,13 +96,13 @@ int lanpr_detect_direction(LANPR_PrivateData *pd, int col, int row, int LastDire
 
 LANPR_LineStrip *lanpr_create_line_strip(LANPR_PrivateData *pd)
 {
-  LANPR_LineStrip *ls = BLI_mempool_calloc(pd->mp_line_strip);
+  LANPR_LineStrip *ls = BLI_mempool_calloc(lanpr_share.mp_line_strip);
   return ls;
 }
 LANPR_LineStripPoint *lanpr_append_point(
     LANPR_PrivateData *pd, LANPR_LineStrip *ls, real X, real Y, real Z)
 {
-  LANPR_LineStripPoint *lsp = BLI_mempool_calloc(pd->mp_line_strip_point);
+  LANPR_LineStripPoint *lsp = BLI_mempool_calloc(lanpr_share.mp_line_strip_point);
 
   lsp->P[0] = X;
   lsp->P[1] = Y;
@@ -117,7 +117,7 @@ LANPR_LineStripPoint *lanpr_append_point(
 LANPR_LineStripPoint *lanpr_push_point(
     LANPR_PrivateData *pd, LANPR_LineStrip *ls, real X, real Y, real Z)
 {
-  LANPR_LineStripPoint *lsp = BLI_mempool_calloc(pd->mp_line_strip_point);
+  LANPR_LineStripPoint *lsp = BLI_mempool_calloc(lanpr_share.mp_line_strip_point);
 
   lsp->P[0] = X;
   lsp->P[1] = Y;
@@ -134,9 +134,9 @@ void lanpr_destroy_line_strip(LANPR_PrivateData *pd, LANPR_LineStrip *ls)
 {
   LANPR_LineStripPoint *lsp;
   while (lsp = BLI_pophead(&ls->points)) {
-    BLI_mempool_free(pd->mp_line_strip_point, lsp);
+    BLI_mempool_free(lanpr_share.mp_line_strip_point, lsp);
   }
-  BLI_mempool_free(pd->mp_line_strip, ls);
+  BLI_mempool_free(lanpr_share.mp_line_strip, ls);
 }
 
 void lanpr_remove_sample(LANPR_PrivateData *pd, int row, int col)
@@ -353,7 +353,7 @@ GPUBatch *lanpr_get_snake_batch(LANPR_PrivateData *pd)
       GPU_PRIM_LINES_ADJ, vbo, GPU_indexbuf_build(&elb), GPU_USAGE_STATIC | GPU_BATCH_OWNS_VBO);
 }
 
-void lanpr_snake_free_pool_data(LANPR_PrivateData *pd)
+void lanpr_snake_prepare_cache(LANPR_PrivateData *pd)
 {
   if (pd->line_result_8bit)
     MEM_freeN(pd->line_result_8bit);
@@ -361,10 +361,26 @@ void lanpr_snake_free_pool_data(LANPR_PrivateData *pd)
   if (pd->line_result)
     MEM_freeN(pd->line_result);
   pd->line_result = 0;
-  BLI_mempool_clear(pd->mp_line_strip);
-  BLI_mempool_clear(pd->mp_line_strip_point);
-  BLI_mempool_clear(pd->mp_sample);
-  BLI_mempool_clear(pd->mp_batch_list);
+  lanpr_share.mp_sample = BLI_mempool_create(
+        sizeof(LANPR_TextureSample), 0, 512, BLI_MEMPOOL_NOP);
+  lanpr_share.mp_line_strip = BLI_mempool_create(
+        sizeof(LANPR_LineStrip), 0, 512, BLI_MEMPOOL_NOP);
+  lanpr_share.mp_line_strip_point = BLI_mempool_create(
+        sizeof(LANPR_LineStripPoint), 0, 1024, BLI_MEMPOOL_NOP);
+  
+}
+void lanpe_sanke_free_cache(LANPR_PrivateData *pd)
+{
+  if (pd->line_result_8bit)
+    MEM_freeN(pd->line_result_8bit);
+  pd->line_result_8bit = 0;
+  if (pd->line_result)
+    MEM_freeN(pd->line_result);
+  pd->line_result = 0;
+
+  BLI_mempool_destroy(lanpr_share.mp_line_strip);
+  BLI_mempool_destroy(lanpr_share.mp_line_strip_point);
+  BLI_mempool_destroy(lanpr_share.mp_sample);
 }
 void lanpr_snake_free_readback_data(LANPR_PrivateData *pd)
 {
@@ -486,7 +502,7 @@ void lanpr_snake_draw_scene(LANPR_TextureList *txl,
       int index = h * texw + w;
       if ((sample = pd->line_result[index]) > 0.9) {
         pd->line_result_8bit[index] = 255;
-        LANPR_TextureSample *ts = BLI_mempool_calloc(pd->mp_sample);
+        LANPR_TextureSample *ts = BLI_mempool_calloc(lanpr_share.mp_sample);
         BLI_addtail(&pd->pending_samples, ts);
         pd->sample_table[index] = ts;
         ts->X = w;
@@ -533,7 +549,7 @@ void lanpr_snake_draw_scene(LANPR_TextureList *txl,
 
   GPUBatch *snake_batch = lanpr_get_snake_batch(pd);
 
-  lanpr_snake_free_pool_data(pd);
+  lanpr_snake_prepare_cache(pd);
 
   psl->snake_pass = DRW_pass_create("Snake Visualization Pass",
                                     DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH |
@@ -554,9 +570,9 @@ void lanpr_snake_draw_scene(LANPR_TextureList *txl,
   DRW_draw_pass(psl->snake_pass);
   GPU_batch_discard(snake_batch);
 
-  BLI_mempool_clear(pd->mp_sample);
-  BLI_mempool_clear(pd->mp_line_strip);
-  BLI_mempool_clear(pd->mp_line_strip_point);
+  BLI_mempool_clear(lanpr_share.mp_sample);
+  BLI_mempool_clear(lanpr_share.mp_line_strip);
+  BLI_mempool_clear(lanpr_share.mp_line_strip_point);
 
   pd->pending_samples.first = pd->pending_samples.last = 0;
   pd->erased_samples.first = pd->erased_samples.last = 0;
@@ -564,4 +580,6 @@ void lanpr_snake_draw_scene(LANPR_TextureList *txl,
 
   GPU_framebuffer_bind(DefaultFB);
   DRW_multisamples_resolve(txl->depth, txl->edge_intermediate, 1);
+
+  lanpe_sanke_free_cache(pd);
 }



More information about the Bf-blender-cvs mailing list