[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