[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [54093] branches/ge_harmony/source/blender : Cleaning up some memory leaks caused by custom shaders and shader merging .

Daniel Stokes kupomail at gmail.com
Fri Jan 25 06:34:10 CET 2013


Revision: 54093
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=54093
Author:   kupoman
Date:     2013-01-25 05:34:03 +0000 (Fri, 25 Jan 2013)
Log Message:
-----------
Cleaning up some memory leaks caused by custom shaders and shader merging.

Modified Paths:
--------------
    branches/ge_harmony/source/blender/blenkernel/intern/shader.c
    branches/ge_harmony/source/blender/gpu/intern/gpu_codegen.c

Modified: branches/ge_harmony/source/blender/blenkernel/intern/shader.c
===================================================================
--- branches/ge_harmony/source/blender/blenkernel/intern/shader.c	2013-01-25 05:02:36 UTC (rev 54092)
+++ branches/ge_harmony/source/blender/blenkernel/intern/shader.c	2013-01-25 05:34:03 UTC (rev 54093)
@@ -65,11 +65,19 @@
 
 void BKE_shader_free(Shader *sh)
 {
+	Uniform *uni;
 	if (sh->source)
 		MEM_freeN(sh->source);
+	
+	for (uni = sh->uniforms.first; uni; uni = uni->next) {
+		if (uni->data)
+			MEM_freeN(uni->data);
+	}
 
 	BLI_freelistN(&sh->uniforms);
 	BLI_ghash_free(sh->uniform_cache, NULL, (GHashValFreeFP)MEM_freeN);
+
+	MEM_freeN(sh);
 }
 
 struct Shader *BKE_shader_add(const char *name)
@@ -97,7 +105,7 @@
 
 void BKE_shader_source_merge(Shader *dst, const Shader *src)
 {
-	DynStr *new_source = BLI_dynstr_new();
+	DynStr *new_source;
 	char fname1[40] = "main\0";
 	char fname2[40] = "main\0";
 	char count[33];
@@ -118,6 +126,8 @@
 		return;
 	}
 
+	new_source = BLI_dynstr_new();
+
 	/* Find main, and assume there is nothing after it */
 	dst_main = strstr(dst->source, "void main");
 	src_main = strstr(src->source, "void main");
@@ -157,7 +167,9 @@
 	search = BLI_dynstr_get_cstring(new_source);
 	dst->source = MEM_mallocN(strlen(search)+1, "Merged shader source");
 	strcpy(dst->source, search);
+
 	BLI_dynstr_free(new_source);
+	MEM_freeN(search);
 }
 
 void gather_uniforms(Shader *sh);

Modified: branches/ge_harmony/source/blender/gpu/intern/gpu_codegen.c
===================================================================
--- branches/ge_harmony/source/blender/gpu/intern/gpu_codegen.c	2013-01-25 05:02:36 UTC (rev 54092)
+++ branches/ge_harmony/source/blender/gpu/intern/gpu_codegen.c	2013-01-25 05:34:03 UTC (rev 54093)
@@ -40,6 +40,7 @@
 
 #include "BLI_blenlib.h"
 #include "BLI_utildefines.h"
+#include "BLI_string.h"
 #include "BLI_dynstr.h"
 #include "BLI_ghash.h"
 #include "BLI_heap.h"
@@ -1387,7 +1388,7 @@
 	GPUPass *pass;
 	Shader *cs, *sh_vert, *sh_frag, *sh_geom;
 	LinkData *link;
-	char *vertexcode, *fragmentcode, *geometrycode, *libcode=NULL;
+	char *vertexcode, *fragmentcode, *libcode=NULL;
 
 	/*if (!FUNCTION_LIB) {
 		GPU_nodes_free(nodes);
@@ -1405,8 +1406,14 @@
 	sh_frag = BKE_shader_empty();
 	sh_geom = BKE_shader_empty();
 
-	BKE_shader_source_merge_ch(sh_vert, code_generate_vertex(nodes));
-	BKE_shader_source_merge_ch(sh_frag, code_generate_fragment(nodes, outlink->output, name));
+	vertexcode = code_generate_vertex(nodes);
+	BKE_shader_source_merge_ch(sh_vert, vertexcode);
+	MEM_freeN(vertexcode);
+
+	fragmentcode = code_generate_fragment(nodes, outlink->output, name);
+	BKE_shader_source_merge_ch(sh_frag, fragmentcode);
+	MEM_freeN(fragmentcode);
+
 	libcode = glsl_material_library;
 
 	/* merge custom shaders */
@@ -1425,12 +1432,16 @@
 	shader = GPU_shader_create(sh_vert->source, sh_frag->source, sh_geom->source, libcode,
 		sh_geom->geom_in, sh_geom->geom_out);
 
-
 	/* failed? */
 	if (!shader) {
 		memset(attribs, 0, sizeof(*attribs));
 		memset(builtins, 0, sizeof(*builtins));
 		GPU_nodes_free(nodes);
+
+		BKE_shader_free(sh_vert);
+		BKE_shader_free(sh_frag);
+		BKE_shader_free(sh_geom);
+
 		return NULL;
 	}
 	
@@ -1442,8 +1453,16 @@
 	pass->fragmentcode = sh_frag->source;
 	pass->vertexcode = sh_vert->source;
 	pass->geometrycode = sh_geom->source;
+	pass->fragmentcode = BLI_strdupn(sh_frag->source, strlen(sh_frag->source));
+	pass->vertexcode = BLI_strdupn(sh_vert->source, strlen(sh_vert->source));
+	if (sh_geom->source)
+		pass->geometrycode = BLI_strdupn(sh_geom->source, strlen(sh_geom->source));
 	pass->libcode = glsl_material_library;
 
+	BKE_shader_free(sh_vert);
+	BKE_shader_free(sh_frag);
+	BKE_shader_free(sh_geom);
+
 	/* extract dynamic inputs and throw away nodes */
 	GPU_nodes_extract_dynamic_inputs(pass, nodes);
 	GPU_nodes_free(nodes);




More information about the Bf-blender-cvs mailing list