[Bf-blender-cvs] [f3b5476f460] soc-2019-npr: LANPR: GPU memory leak fixed.

YimingWu noreply at git.blender.org
Wed Aug 7 04:01:12 CEST 2019


Commit: f3b5476f460e2d863f5817a5f28519d388a835c4
Author: YimingWu
Date:   Wed Aug 7 10:00:56 2019 +0800
Branches: soc-2019-npr
https://developer.blender.org/rBf3b5476f460e2d863f5817a5f28519d388a835c4

LANPR: GPU memory leak fixed.

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

M	source/blender/draw/engines/lanpr/lanpr_dpix.c
M	source/blender/draw/engines/lanpr/lanpr_engine.c

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

diff --git a/source/blender/draw/engines/lanpr/lanpr_dpix.c b/source/blender/draw/engines/lanpr/lanpr_dpix.c
index 737c05be3d4..7e394f370e0 100644
--- a/source/blender/draw/engines/lanpr/lanpr_dpix.c
+++ b/source/blender/draw/engines/lanpr/lanpr_dpix.c
@@ -375,9 +375,9 @@ int lanpr_feed_atlas_trigger_preview_obj(void *UNUSED(vedata), Object *ob, int b
   }
 
   GPUBatch *gb = GPU_batch_create_ex(
-      GPU_PRIM_POINTS, vbo, 0, GPU_USAGE_STATIC | GPU_BATCH_OWNS_VBO);
+      GPU_PRIM_POINTS, vbo, 0, GPU_USAGE_DYNAMIC | GPU_BATCH_OWNS_VBO);
   GPUBatch *gb2 = GPU_batch_create_ex(
-      GPU_PRIM_POINTS, vbo2, 0, GPU_USAGE_STATIC | GPU_BATCH_OWNS_VBO);
+      GPU_PRIM_POINTS, vbo2, 0, GPU_USAGE_DYNAMIC | GPU_BATCH_OWNS_VBO);
 
   LANPR_BatchItem *bi = BLI_mempool_alloc(lanpr_share.mp_batch_list);
   BLI_addtail(&lanpr_share.dpix_batch_list, bi);
@@ -442,9 +442,9 @@ void lanpr_create_atlas_intersection_preview(void *UNUSED(vedata), int begin_ind
     GPU_vertbuf_attr_set(vbo2, attr_id2.pos, i, co);
   }
   rb->DPIXIntersectionTransformBatch = GPU_batch_create_ex(
-      GPU_PRIM_POINTS, vbo, 0, GPU_USAGE_STATIC | GPU_BATCH_OWNS_VBO);
+      GPU_PRIM_POINTS, vbo, 0, GPU_USAGE_DYNAMIC | GPU_BATCH_OWNS_VBO);
   rb->DPIXIntersectionBatch = GPU_batch_create_ex(
-      GPU_PRIM_POINTS, vbo2, 0, GPU_USAGE_STATIC | GPU_BATCH_OWNS_VBO);
+      GPU_PRIM_POINTS, vbo2, 0, GPU_USAGE_DYNAMIC | GPU_BATCH_OWNS_VBO);
 }
 
 void lanpr_dpix_draw_scene(LANPR_TextureList *txl,
diff --git a/source/blender/draw/engines/lanpr/lanpr_engine.c b/source/blender/draw/engines/lanpr/lanpr_engine.c
index 2b8e2573b9d..04bf6a5986e 100644
--- a/source/blender/draw/engines/lanpr/lanpr_engine.c
+++ b/source/blender/draw/engines/lanpr/lanpr_engine.c
@@ -132,6 +132,23 @@ static void lanpr_engine_init(void *ved)
   lanpr_share.init_complete = 1;
 }
 
+static void lanpr_dpix_batch_free(void){
+  LANPR_BatchItem *dpbi;
+    while ((dpbi = BLI_pophead(&lanpr_share.dpix_batch_list)) != NULL) {
+      GPU_BATCH_DISCARD_SAFE(dpbi->dpix_preview_batch);
+      GPU_BATCH_DISCARD_SAFE(dpbi->dpix_transform_batch);
+    }
+    LANPR_RenderBuffer *rb = lanpr_share.render_buffer_shared;
+    if (rb) {
+      if (rb->DPIXIntersectionBatch) {
+        GPU_BATCH_DISCARD_SAFE(rb->DPIXIntersectionBatch);
+      }
+      if (rb->DPIXIntersectionTransformBatch) {
+        GPU_BATCH_DISCARD_SAFE(rb->DPIXIntersectionTransformBatch);
+      }
+    }
+}
+
 static void lanpr_engine_free(void)
 {
   DRW_SHADER_FREE_SAFE(lanpr_share.multichannel_shader);
@@ -143,12 +160,7 @@ static void lanpr_engine_free(void)
   DRW_SHADER_FREE_SAFE(lanpr_share.edge_thinning_shader);
   DRW_SHADER_FREE_SAFE(lanpr_share.software_shader);
 
-  BLI_mempool *mp = lanpr_share.mp_batch_list;
-
-  if (mp) {
-    BLI_mempool_destroy(mp);
-    mp = NULL;
-  }
+  lanpr_dpix_batch_free();
 
   if (lanpr_share.render_buffer_shared) {
     LANPR_RenderBuffer* rb = lanpr_share.render_buffer_shared;
@@ -159,6 +171,12 @@ static void lanpr_engine_free(void)
     MEM_freeN(rb);
     lanpr_share.render_buffer_shared = NULL;
   }
+
+  BLI_mempool *mp = lanpr_share.mp_batch_list;
+
+  if (mp) {
+    BLI_mempool_destroy(mp);
+  }
 }
 
 static void lanpr_cache_init(void *vedata)
@@ -390,23 +408,8 @@ static void lanpr_cache_init(void *vedata)
       pd->atlas_nl = MEM_callocN(fsize, "atlas_normal_l");
       pd->atlas_nr = MEM_callocN(fsize, "atlas_normal_l");
       pd->atlas_edge_mask = MEM_callocN(fsize, "atlas_edge_mask"); /*  should always be float */
-
-      LANPR_BatchItem *dpbi;
-      while ((dpbi = BLI_pophead(&lanpr_share.dpix_batch_list)) != NULL) {
-        GPU_BATCH_DISCARD_SAFE(dpbi->dpix_preview_batch);
-        GPU_BATCH_DISCARD_SAFE(dpbi->dpix_transform_batch);
-      }
-      LANPR_RenderBuffer *rb = lanpr_share.render_buffer_shared;
-      if (rb) {
-        if (rb->DPIXIntersectionBatch) {
-          GPU_BATCH_DISCARD_SAFE(rb->DPIXIntersectionBatch);
-          rb->DPIXIntersectionBatch = 0;
-        }
-        if (rb->DPIXIntersectionTransformBatch) {
-          GPU_BATCH_DISCARD_SAFE(rb->DPIXIntersectionTransformBatch);
-          rb->DPIXIntersectionTransformBatch = 0;
-        }
-      }
+      
+      lanpr_dpix_batch_free();
 
       BLI_mempool_clear(lanpr_share.mp_batch_list);
     }



More information about the Bf-blender-cvs mailing list