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.
This commit is contained in:
Campbell Barton 2017-04-13 13:30:53 +10:00
parent c080702e73
commit 64660b902c
23 changed files with 139 additions and 190 deletions

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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);

View File

@ -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)

View File

@ -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;
}

View File

@ -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 */

View File

@ -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(SHC.drw_empty_cone);
if (SHC.drw_arrows)
Batch_discard_all(SHC.drw_arrows);
if (SHC.drw_axis_names)
Batch_discard_all(SHC.drw_axis_names);
if (SHC.drw_field_wind)
Batch_discard_all(SHC.drw_field_wind);
if (SHC.drw_field_force)
Batch_discard_all(SHC.drw_field_force);
if (SHC.drw_field_vortex)
Batch_discard_all(SHC.drw_field_vortex);
if (SHC.drw_field_tube_limit)
Batch_discard_all(SHC.drw_field_tube_limit);
if (SHC.drw_field_cone_limit)
Batch_discard_all(SHC.drw_field_cone_limit);
if (SHC.drw_lamp)
Batch_discard_all(SHC.drw_lamp);
if (SHC.drw_lamp_sunrays)
Batch_discard_all(SHC.drw_lamp_sunrays);
if (SHC.drw_lamp_area)
Batch_discard_all(SHC.drw_lamp_area);
if (SHC.drw_lamp_hemi)
Batch_discard_all(SHC.drw_lamp_hemi);
if (SHC.drw_lamp_spot)
Batch_discard_all(SHC.drw_lamp_spot);
if (SHC.drw_lamp_spot_square)
Batch_discard_all(SHC.drw_lamp_spot_square);
if (SHC.drw_speaker)
Batch_discard_all(SHC.drw_speaker);
if (SHC.drw_bone_octahedral)
Batch_discard_all(SHC.drw_bone_octahedral);
if (SHC.drw_bone_octahedral_wire)
Batch_discard_all(SHC.drw_bone_octahedral_wire);
if (SHC.drw_bone_point)
Batch_discard_all(SHC.drw_bone_point);
if (SHC.drw_bone_point_wire)
Batch_discard_all(SHC.drw_bone_point_wire);
if (SHC.drw_bone_arrows)
Batch_discard_all(SHC.drw_bone_arrows);
if (SHC.drw_camera)
Batch_discard_all(SHC.drw_camera);
if (SHC.drw_camera_tria)
Batch_discard_all(SHC.drw_camera_tria);
if (SHC.drw_camera_focus)
Batch_discard_all(SHC.drw_camera_focus);
BATCH_DISCARD_ALL_SAFE(SHC.drw_single_vertice);
BATCH_DISCARD_ALL_SAFE(SHC.drw_fullscreen_quad);
BATCH_DISCARD_ALL_SAFE(SHC.drw_plain_axes);
BATCH_DISCARD_ALL_SAFE(SHC.drw_single_arrow);
BATCH_DISCARD_ALL_SAFE(SHC.drw_cube);
BATCH_DISCARD_ALL_SAFE(SHC.drw_circle);
BATCH_DISCARD_ALL_SAFE(SHC.drw_square);
BATCH_DISCARD_ALL_SAFE(SHC.drw_line);
BATCH_DISCARD_ALL_SAFE(SHC.drw_line_endpoints);
BATCH_DISCARD_ALL_SAFE(SHC.drw_empty_sphere);
BATCH_DISCARD_ALL_SAFE(SHC.drw_empty_cone);
BATCH_DISCARD_ALL_SAFE(SHC.drw_arrows);
BATCH_DISCARD_ALL_SAFE(SHC.drw_axis_names);
BATCH_DISCARD_ALL_SAFE(SHC.drw_field_wind);
BATCH_DISCARD_ALL_SAFE(SHC.drw_field_force);
BATCH_DISCARD_ALL_SAFE(SHC.drw_field_vortex);
BATCH_DISCARD_ALL_SAFE(SHC.drw_field_tube_limit);
BATCH_DISCARD_ALL_SAFE(SHC.drw_field_cone_limit);
BATCH_DISCARD_ALL_SAFE(SHC.drw_lamp);
BATCH_DISCARD_ALL_SAFE(SHC.drw_lamp_sunrays);
BATCH_DISCARD_ALL_SAFE(SHC.drw_lamp_area);
BATCH_DISCARD_ALL_SAFE(SHC.drw_lamp_hemi);
BATCH_DISCARD_ALL_SAFE(SHC.drw_lamp_spot);
BATCH_DISCARD_ALL_SAFE(SHC.drw_lamp_spot_square);
BATCH_DISCARD_ALL_SAFE(SHC.drw_speaker);
BATCH_DISCARD_ALL_SAFE(SHC.drw_bone_octahedral);
BATCH_DISCARD_ALL_SAFE(SHC.drw_bone_octahedral_wire);
BATCH_DISCARD_ALL_SAFE(SHC.drw_bone_point);
BATCH_DISCARD_ALL_SAFE(SHC.drw_bone_point_wire);
BATCH_DISCARD_ALL_SAFE(SHC.drw_bone_arrows);
BATCH_DISCARD_ALL_SAFE(SHC.drw_camera);
BATCH_DISCARD_ALL_SAFE(SHC.drw_camera_tria);
BATCH_DISCARD_ALL_SAFE(SHC.drw_camera_focus);
}
/* Helper functions */

View File

@ -555,9 +555,7 @@ void DRW_shgroup_free(struct DRWShadingGroup *shgroup)
MEM_freeN(shgroup->interface);
if (shgroup->batch_geom) {
Batch_discard_all(shgroup->batch_geom);
}
BATCH_DISCARD_ALL_SAFE(shgroup->batch_geom);
}
void DRW_shgroup_call_add(DRWShadingGroup *shgroup, Batch *geom, float (*obmat)[4])

View File

@ -230,8 +230,7 @@ static void EDIT_CURVE_draw_scene(void *vedata)
* Mostly used for freeing shaders */
static void EDIT_CURVE_engine_free(void)
{
// if (custom_shader)
// DRW_shader_free(custom_shader);
// DRW_SHADER_FREE_SAFE(custom_shader);
}
/* Create collection settings here.

View File

@ -228,8 +228,7 @@ static void EDIT_LATTICE_draw_scene(void *vedata)
* Mostly used for freeing shaders */
static void EDIT_LATTICE_engine_free(void)
{
// if (custom_shader)
// DRW_shader_free(custom_shader);
// DRW_SHADER_FREE_SAFE(custom_shader);
}
/* Create collection settings here.

View File

@ -499,30 +499,18 @@ void EDIT_MESH_collection_settings_create(IDProperty *properties)
static void EDIT_MESH_engine_free(void)
{
if (e_data.overlay_tri_sh)
DRW_shader_free(e_data.overlay_tri_sh);
if (e_data.overlay_tri_fast_sh)
DRW_shader_free(e_data.overlay_tri_fast_sh);
if (e_data.overlay_tri_vcol_sh)
DRW_shader_free(e_data.overlay_tri_vcol_sh);
if (e_data.overlay_tri_vcol_fast_sh)
DRW_shader_free(e_data.overlay_tri_vcol_fast_sh);
if (e_data.overlay_edge_sh)
DRW_shader_free(e_data.overlay_edge_sh);
if (e_data.overlay_edge_vcol_sh)
DRW_shader_free(e_data.overlay_edge_vcol_sh);
if (e_data.overlay_vert_sh)
DRW_shader_free(e_data.overlay_vert_sh);
if (e_data.overlay_facedot_sh)
DRW_shader_free(e_data.overlay_facedot_sh);
if (e_data.overlay_mix_sh)
DRW_shader_free(e_data.overlay_mix_sh);
if (e_data.overlay_facefill_sh)
DRW_shader_free(e_data.overlay_facefill_sh);
if (e_data.normals_face_sh)
DRW_shader_free(e_data.normals_face_sh);
if (e_data.normals_sh)
DRW_shader_free(e_data.normals_sh);
DRW_SHADER_FREE_SAFE(e_data.overlay_tri_sh);
DRW_SHADER_FREE_SAFE(e_data.overlay_tri_fast_sh);
DRW_SHADER_FREE_SAFE(e_data.overlay_tri_vcol_sh);
DRW_SHADER_FREE_SAFE(e_data.overlay_tri_vcol_fast_sh);
DRW_SHADER_FREE_SAFE(e_data.overlay_edge_sh);
DRW_SHADER_FREE_SAFE(e_data.overlay_edge_vcol_sh);
DRW_SHADER_FREE_SAFE(e_data.overlay_vert_sh);
DRW_SHADER_FREE_SAFE(e_data.overlay_facedot_sh);
DRW_SHADER_FREE_SAFE(e_data.overlay_mix_sh);
DRW_SHADER_FREE_SAFE(e_data.overlay_facefill_sh);
DRW_SHADER_FREE_SAFE(e_data.normals_face_sh);
DRW_SHADER_FREE_SAFE(e_data.normals_sh);
}
static const DrawEngineDataSize EDIT_MESH_data_size = DRW_VIEWPORT_DATA_SIZE(EDIT_MESH_Data);

View File

@ -228,8 +228,7 @@ static void EDIT_METABALL_draw_scene(void *vedata)
* Mostly used for freeing shaders */
static void EDIT_METABALL_engine_free(void)
{
// if (custom_shader)
// DRW_shader_free(custom_shader);
// DRW_SHADER_FREE_SAFE(custom_shader);
}
/* Create collection settings here.

View File

@ -228,8 +228,7 @@ static void EDIT_SURFACE_draw_scene(void *vedata)
* Mostly used for freeing shaders */
static void EDIT_SURFACE_engine_free(void)
{
// if (custom_shader)
// DRW_shader_free(custom_shader);
// DRW_SHADER_FREE_SAFE(custom_shader);
}
/* Create collection settings here.

View File

@ -228,8 +228,7 @@ static void EDIT_TEXT_draw_scene(void *vedata)
* Mostly used for freeing shaders */
static void EDIT_TEXT_engine_free(void)
{
// if (custom_shader)
// DRW_shader_free(custom_shader);
// DRW_SHADER_FREE_SAFE(custom_shader);
}
/* Create collection settings here.

View File

@ -371,14 +371,10 @@ static void OBJECT_engine_init(void *vedata)
static void OBJECT_engine_free(void)
{
if (e_data.outline_resolve_sh)
DRW_shader_free(e_data.outline_resolve_sh);
if (e_data.outline_detect_sh)
DRW_shader_free(e_data.outline_detect_sh);
if (e_data.outline_fade_sh)
DRW_shader_free(e_data.outline_fade_sh);
if (e_data.grid_sh)
DRW_shader_free(e_data.grid_sh);
DRW_SHADER_FREE_SAFE(e_data.outline_resolve_sh);
DRW_SHADER_FREE_SAFE(e_data.outline_detect_sh);
DRW_SHADER_FREE_SAFE(e_data.outline_fade_sh);
DRW_SHADER_FREE_SAFE(e_data.grid_sh);
}
static DRWShadingGroup *shgroup_outline(DRWPass *pass, const float col[4], struct GPUShader *sh)

View File

@ -228,8 +228,7 @@ static void PAINT_TEXTURE_draw_scene(void *vedata)
* Mostly used for freeing shaders */
static void PAINT_TEXTURE_engine_free(void)
{
// if (custom_shader)
// DRW_shader_free(custom_shader);
// DRW_SHADER_FREE_SAFE(custom_shader);
}
/* Create collection settings here.

View File

@ -228,8 +228,7 @@ static void PAINT_VERTEX_draw_scene(void *vedata)
* Mostly used for freeing shaders */
static void PAINT_VERTEX_engine_free(void)
{
// if (custom_shader)
// DRW_shader_free(custom_shader);
// DRW_SHADER_FREE_SAFE(custom_shader);
}
/* Create collection settings here.

View File

@ -225,8 +225,7 @@ static void PAINT_WEIGHT_draw_scene(void *vedata)
* Mostly used for freeing shaders */
static void PAINT_WEIGHT_engine_free(void)
{
// if (custom_shader)
// DRW_shader_free(custom_shader);
// DRW_SHADER_FREE_SAFE(custom_shader);
}
/* Create collection settings here.

View File

@ -223,8 +223,7 @@ static void PARTICLE_draw_scene(void *vedata)
* Mostly used for freeing shaders */
static void PARTICLE_engine_free(void)
{
// if (custom_shader)
// DRW_shader_free(custom_shader);
// DRW_SHADER_FREE_SAFE(custom_shader);
}
/* Create collection settings here.

View File

@ -223,8 +223,7 @@ static void POSE_draw_scene(void *vedata)
* Mostly used for freeing shaders */
static void POSE_engine_free(void)
{
// if (custom_shader)
// DRW_shader_free(custom_shader);
// DRW_SHADER_FREE_SAFE(custom_shader);
}
/* Create collection settings here.

View File

@ -222,8 +222,7 @@ static void SCULPT_draw_scene(void *vedata)
* Mostly used for freeing shaders */
static void SCULPT_engine_free(void)
{
// if (custom_shader)
// DRW_shader_free(custom_shader);
// DRW_SHADER_FREE_SAFE(custom_shader);
}
/* Create collection settings here.