[Bf-blender-cvs] [64660b902c3] blender2.8: Use 'safe' macros for common free operation

Campbell Barton noreply at git.blender.org
Thu Apr 13 05:37:00 CEST 2017


Commit: 64660b902c3fb52fe5a3cb5bf232f90283db8732
Author: Campbell Barton
Date:   Thu Apr 13 13:30:53 2017 +1000
Branches: blender2.8
https://developer.blender.org/rB64660b902c3fb52fe5a3cb5bf232f90283db8732

Use 'safe' macros for common free operation

Same as MEM_SAFE_FREE macro,
checks for NULL, runs free then sets NULL.

Blocks of code that do this many times are noisy and likely
errors here wouldn't be noticed immediately.

Also NULL's static vars which were being left set.

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

M	intern/gawain/gawain/batch.h
M	intern/gawain/gawain/element.h
M	intern/gawain/gawain/vertex_buffer.h
M	source/blender/blenkernel/intern/mesh_render.c
M	source/blender/draw/engines/clay/clay.c
M	source/blender/draw/engines/eevee/eevee.c
M	source/blender/draw/engines/eevee/eevee_lights.c
M	source/blender/draw/intern/DRW_render.h
M	source/blender/draw/intern/draw_cache.c
M	source/blender/draw/intern/draw_manager.c
M	source/blender/draw/modes/edit_curve_mode.c
M	source/blender/draw/modes/edit_lattice_mode.c
M	source/blender/draw/modes/edit_mesh_mode.c
M	source/blender/draw/modes/edit_metaball_mode.c
M	source/blender/draw/modes/edit_surface_mode.c
M	source/blender/draw/modes/edit_text_mode.c
M	source/blender/draw/modes/object_mode.c
M	source/blender/draw/modes/paint_texture_mode.c
M	source/blender/draw/modes/paint_vertex_mode.c
M	source/blender/draw/modes/paint_weight_mode.c
M	source/blender/draw/modes/particle_mode.c
M	source/blender/draw/modes/pose_mode.c
M	source/blender/draw/modes/sculpt_mode.c

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

diff --git a/intern/gawain/gawain/batch.h b/intern/gawain/gawain/batch.h
index 532c45ae832..2802dad3db3 100644
--- a/intern/gawain/gawain/batch.h
+++ b/intern/gawain/gawain/batch.h
@@ -109,3 +109,19 @@ Batch* create_BatchWithOwnVertexBufferAndElementList(PrimitiveType, VertexFormat
 Batch* create_BatchInGeneral(PrimitiveType, VertexBufferStuff, ElementListStuff);
 
 #endif // future plans
+
+
+/* Macros */
+
+#define BATCH_DISCARD_SAFE(batch) do { \
+	if (batch != NULL) { \
+		Batch_discard(batch); \
+		batch = NULL; \
+	} \
+} while (0)
+#define BATCH_DISCARD_ALL_SAFE(batch) do { \
+	if (batch != NULL) { \
+		Batch_discard_all(batch); \
+		batch = NULL; \
+	} \
+} while (0)
diff --git a/intern/gawain/gawain/element.h b/intern/gawain/gawain/element.h
index f22d7c0ffda..fde395ce898 100644
--- a/intern/gawain/gawain/element.h
+++ b/intern/gawain/gawain/element.h
@@ -62,3 +62,13 @@ ElementList* ElementList_build(ElementListBuilder*);
 void ElementList_build_in_place(ElementListBuilder*, ElementList*);
 
 void ElementList_discard(ElementList*);
+
+
+/* Macros */
+
+#define ELEMENTLIST_DISCARD_SAFE(elem) do { \
+	if (elem != NULL) { \
+		ElementList_discard(elem); \
+		elem = NULL; \
+	} \
+} while (0)
diff --git a/intern/gawain/gawain/vertex_buffer.h b/intern/gawain/gawain/vertex_buffer.h
index 687f15e9e98..3a2575fa2e1 100644
--- a/intern/gawain/gawain/vertex_buffer.h
+++ b/intern/gawain/gawain/vertex_buffer.h
@@ -62,3 +62,13 @@ void VertexBuffer_fill_attrib_stride(VertexBuffer*, unsigned a_idx, unsigned str
 //	void setAttrib4ub(unsigned a_idx, unsigned v_idx, unsigned char r, unsigned char g, unsigned char b, unsigned char a);
 
 void VertexBuffer_use(VertexBuffer*);
+
+
+/* Macros */
+
+#define VERTEXBUFFER_DISCARD_SAFE(verts) do { \
+	if (verts != NULL) { \
+		VertexBuffer_discard(verts); \
+		verts = NULL; \
+	} \
+} while (0)
diff --git a/source/blender/blenkernel/intern/mesh_render.c b/source/blender/blenkernel/intern/mesh_render.c
index cf4992cdcb4..2fd5435ba6f 100644
--- a/source/blender/blenkernel/intern/mesh_render.c
+++ b/source/blender/blenkernel/intern/mesh_render.c
@@ -877,22 +877,10 @@ void BKE_mesh_batch_selection_dirty(Mesh *me)
 	MeshBatchCache *cache = me->batch_cache;
 	if (cache) {
 		/* TODO Separate Flag vbo */
-		if (cache->overlay_triangles) {
-			Batch_discard_all(cache->overlay_triangles);
-			cache->overlay_triangles = NULL;
-		}
-		if (cache->overlay_loose_verts) {
-			Batch_discard_all(cache->overlay_loose_verts);
-			cache->overlay_loose_verts = NULL;
-		}
-		if (cache->overlay_loose_edges) {
-			Batch_discard_all(cache->overlay_loose_edges);
-			cache->overlay_loose_edges = NULL;
-		}
-		if (cache->overlay_facedots) {
-			Batch_discard_all(cache->overlay_facedots);
-			cache->overlay_facedots = NULL;
-		}
+		BATCH_DISCARD_ALL_SAFE(cache->overlay_triangles);
+		BATCH_DISCARD_ALL_SAFE(cache->overlay_loose_verts);
+		BATCH_DISCARD_ALL_SAFE(cache->overlay_loose_edges);
+		BATCH_DISCARD_ALL_SAFE(cache->overlay_facedots);
 	}
 }
 
@@ -903,27 +891,24 @@ void BKE_mesh_batch_cache_clear(Mesh *me)
 		return;
 	}
 
-	if (cache->all_verts) Batch_discard(cache->all_verts);
-	if (cache->all_edges) Batch_discard(cache->all_edges);
-	if (cache->all_triangles) Batch_discard(cache->all_triangles);
+	BATCH_DISCARD_SAFE(cache->all_verts);
+	BATCH_DISCARD_SAFE(cache->all_edges);
+	BATCH_DISCARD_SAFE(cache->all_triangles);
 
-	if (cache->pos_in_order) VertexBuffer_discard(cache->pos_in_order);
-	if (cache->edges_in_order) ElementList_discard(cache->edges_in_order);
-	if (cache->triangles_in_order) ElementList_discard(cache->triangles_in_order);
+	VERTEXBUFFER_DISCARD_SAFE(cache->pos_in_order);
+	ELEMENTLIST_DISCARD_SAFE(cache->edges_in_order);
+	ELEMENTLIST_DISCARD_SAFE(cache->triangles_in_order);
 
-	if (cache->overlay_triangles) Batch_discard_all(cache->overlay_triangles);
-	if (cache->overlay_loose_verts) Batch_discard_all(cache->overlay_loose_verts);
-	if (cache->overlay_loose_edges) Batch_discard_all(cache->overlay_loose_edges);
-	if (cache->overlay_facedots) Batch_discard_all(cache->overlay_facedots);
+	BATCH_DISCARD_ALL_SAFE(cache->overlay_triangles);
+	BATCH_DISCARD_ALL_SAFE(cache->overlay_loose_verts);
+	BATCH_DISCARD_ALL_SAFE(cache->overlay_loose_edges);
+	BATCH_DISCARD_ALL_SAFE(cache->overlay_facedots);
 
-	if (cache->triangles_with_normals) Batch_discard(cache->triangles_with_normals);
-	if (cache->points_with_normals) Batch_discard(cache->points_with_normals);
-	if (cache->pos_with_normals) VertexBuffer_discard(cache->pos_with_normals);
-	
+	BATCH_DISCARD_SAFE(cache->triangles_with_normals);
+	BATCH_DISCARD_SAFE(cache->points_with_normals);
+	VERTEXBUFFER_DISCARD_SAFE(cache->pos_with_normals);
 
-	if (cache->fancy_edges) {
-		Batch_discard_all(cache->fancy_edges);
-	}
+	BATCH_DISCARD_ALL_SAFE(cache->fancy_edges);
 }
 
 void BKE_mesh_batch_cache_free(Mesh *me)
diff --git a/source/blender/draw/engines/clay/clay.c b/source/blender/draw/engines/clay/clay.c
index 3f65efc2b28..7aa5e226a61 100644
--- a/source/blender/draw/engines/clay/clay.c
+++ b/source/blender/draw/engines/clay/clay.c
@@ -632,18 +632,10 @@ static void CLAY_collection_settings_create(RenderEngine *UNUSED(engine), IDProp
 
 static void CLAY_engine_free(void)
 {
-	if (e_data.clay_sh) {
-		DRW_shader_free(e_data.clay_sh);
-	}
-	if (e_data.matcap_array) {
-		DRW_texture_free(e_data.matcap_array);
-	}
-	if (e_data.jitter_tx) {
-		DRW_texture_free(e_data.jitter_tx);
-	}
-	if (e_data.sampling_tx) {
-		DRW_texture_free(e_data.sampling_tx);
-	}
+	DRW_SHADER_FREE_SAFE(e_data.clay_sh);
+	DRW_TEXTURE_FREE_SAFE(e_data.matcap_array);
+	DRW_TEXTURE_FREE_SAFE(e_data.jitter_tx);
+	DRW_TEXTURE_FREE_SAFE(e_data.sampling_tx);
 }
 
 static const DrawEngineDataSize CLAY_data_size = DRW_VIEWPORT_DATA_SIZE(CLAY_Data);
diff --git a/source/blender/draw/engines/eevee/eevee.c b/source/blender/draw/engines/eevee/eevee.c
index ae345ae97f0..224eb296b33 100644
--- a/source/blender/draw/engines/eevee/eevee.c
+++ b/source/blender/draw/engines/eevee/eevee.c
@@ -248,16 +248,11 @@ static void EEVEE_draw_scene(void *vedata)
 
 static void EEVEE_engine_free(void)
 {
-	if (e_data.default_lit)
-		DRW_shader_free(e_data.default_lit);
-	if (e_data.shadow_sh)
-		DRW_shader_free(e_data.shadow_sh);
-	if (e_data.tonemap)
-		DRW_shader_free(e_data.tonemap);
-	if (e_data.ltc_mat)
-		DRW_texture_free(e_data.ltc_mat);
-	if (e_data.ltc_mag)
-		DRW_texture_free(e_data.ltc_mag);
+	DRW_SHADER_FREE_SAFE(e_data.default_lit);
+	DRW_SHADER_FREE_SAFE(e_data.shadow_sh);
+	DRW_SHADER_FREE_SAFE(e_data.tonemap);
+	DRW_TEXTURE_FREE_SAFE(e_data.ltc_mat);
+	DRW_TEXTURE_FREE_SAFE(e_data.ltc_mag);
 }
 
 static void EEVEE_collection_settings_create(RenderEngine *UNUSED(engine), IDProperty *props)
diff --git a/source/blender/draw/engines/eevee/eevee_lights.c b/source/blender/draw/engines/eevee/eevee_lights.c
index 9a06c665ae2..3dc1f7cb48f 100644
--- a/source/blender/draw/engines/eevee/eevee_lights.c
+++ b/source/blender/draw/engines/eevee/eevee_lights.c
@@ -125,24 +125,15 @@ void EEVEE_lights_cache_finish(EEVEE_StorageList *stl, EEVEE_TextureList *txl, E
 	/* Step 5 Setup enough layers */
 	/* Free textures if number mismatch */
 	if (linfo->num_cube != linfo->cache_num_cube) {
-		if (txl->shadow_depth_cube_pool) {
-			DRW_texture_free(txl->shadow_depth_cube_pool);
-			txl->shadow_depth_cube_pool = NULL;
-		}
+		DRW_TEXTURE_FREE_SAFE(txl->shadow_depth_cube_pool);
 		linfo->cache_num_cube = linfo->num_cube;
 	}
 	if (linfo->num_map != linfo->cache_num_map) {
-		if (txl->shadow_depth_map_pool) {
-			DRW_texture_free(txl->shadow_depth_map_pool);
-			txl->shadow_depth_map_pool = NULL;
-		}
+		DRW_TEXTURE_FREE_SAFE(txl->shadow_depth_map_pool);
 		linfo->cache_num_map = linfo->num_map;
 	}
 	if (linfo->num_cascade != linfo->cache_num_cascade) {
-		if (txl->shadow_depth_cascade_pool) {
-			DRW_texture_free(txl->shadow_depth_cascade_pool);
-			txl->shadow_depth_cascade_pool = NULL;
-		}
+		DRW_TEXTURE_FREE_SAFE(txl->shadow_depth_cascade_pool);
 		linfo->cache_num_cascade = linfo->num_cascade;
 	}
 
diff --git a/source/blender/draw/intern/DRW_render.h b/source/blender/draw/intern/DRW_render.h
index c9435b532f7..b5913eb8742 100644
--- a/source/blender/draw/intern/DRW_render.h
+++ b/source/blender/draw/intern/DRW_render.h
@@ -153,6 +153,12 @@ struct GPUTexture *DRW_texture_create_2D_array(
 struct GPUTexture *DRW_texture_create_cube(
         int w, DRWTextureFormat format, DRWTextureFlag flags, const float *fpixels);
 void DRW_texture_free(struct GPUTexture *tex);
+#define DRW_TEXTURE_FREE_SAFE(tex) do { \
+	if (tex != NULL) { \
+		DRW_texture_free(tex); \
+		tex = NULL; \
+	} \
+} while (0)
 
 /* UBOs */
 struct GPUUniformBuffer *DRW_uniformbuffer_create(int size, const void *data);
@@ -200,6 +206,12 @@ struct GPUShader *DRW_shader_create_3D(const char *frag, const char *defines);
 struct GPUShader *DRW_shader_create_fullscreen(const char *frag, const char *defines);
 struct GPUShader *DRW_shader_create_3D_depth_only(void);
 void DRW_shader_free(struct GPUShader *shader);
+#define DRW_SHADER_FREE_SAFE(shader) do { \
+	if (shader != NULL) { \
+		DRW_shader_free(shader); \
+		shader = NULL; \
+	} \
+} while (0)
 
 /* Batches */
 
diff --git a/source/blender/draw/intern/draw_cache.c b/source/blender/draw/intern/draw_cache.c
index 79f9e26f3b5..2cb5aa374fd 100644
--- a/source/blender/draw/intern/draw_cache.c
+++ b/source/blender/draw/intern/draw_cache.c
@@ -76,72 +76,39 @@ static struct DRWShapeCache {
 
 void DRW_shape_cache_free(void)
 {
-	if (SHC.drw_single_vertice)
-		Batch_discard_all(SHC.drw_single_vertice);
-	if (SHC.drw_fullscreen_quad)
-		Batch_discard_all(SHC.drw_fullscreen_quad);
-	if (SHC.drw_plain_axes)
-		Batch_discard_all(SHC.drw_plain_axes);
-	if (SHC.drw_single_arrow)
-		Batch_discard_all(SHC.drw_single_arrow);
-	if (SHC.drw_cube)
-		Batch_discard_all(SHC.drw_cube);
-	if (SHC.drw_circle)
-		Batch_discard_all(SHC.drw_circle);
-	if (SHC.drw_square)
-		Batch_discard_all(SHC.drw_square);
-	if (SHC.drw_line)
-		Batch_discard_all(SHC.drw_line);
-	if (SHC.drw_line_endpoints)
-		Batch_discard_all(SHC.drw_line_endpoints);
-	if (SHC.drw_empty_sphere)
-		Batch_discard_all(SHC.drw_empty_sphere);
-	if (SHC.drw_empty_cone)
-		Batch_discard_all(

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list