Fix shader generator memory leaks

This commit is contained in:
rdb 2015-05-14 17:17:38 +02:00
parent b3630c4e18
commit 586c067d69
4 changed files with 35 additions and 13 deletions

View File

@ -255,6 +255,11 @@ ConfigVariableBool dump_generated_shaders
"to disk. This is useful for debugging broken shader "
"generators."));
ConfigVariableBool cache_generated_shaders
("cache-generated-shaders", true,
PRC_DESC("Set this true to cause all generated shaders to be cached in "
"memory. This is useful to prevent unnecessary recompilation."));
ConfigVariableBool enforce_attrib_lock
("enforce-attrib-lock", true,
PRC_DESC("When a MaterialAttrib, TextureAttrib, or LightAttrib is "

View File

@ -64,6 +64,7 @@ extern EXPCL_PANDA_GOBJ ConfigVariableBool display_list_animation;
extern EXPCL_PANDA_GOBJ ConfigVariableBool connect_triangle_strips;
extern EXPCL_PANDA_GOBJ ConfigVariableBool preserve_triangle_strips;
extern EXPCL_PANDA_GOBJ ConfigVariableBool dump_generated_shaders;
extern EXPCL_PANDA_GOBJ ConfigVariableBool cache_generated_shaders;
extern EXPCL_PANDA_GOBJ ConfigVariableBool enforce_attrib_lock;
extern EXPCL_PANDA_GOBJ ConfigVariableBool vertices_float64;
extern EXPCL_PANDA_GOBJ ConfigVariableInt vertex_column_alignment;

View File

@ -1829,6 +1829,7 @@ cg_analyze_shader(const ShaderCaps &caps) {
// }
// }
cg_release_resources();
return true;
}
@ -2657,9 +2658,12 @@ make(const string &body, ShaderLanguage lang) {
#endif
ShaderFile sbody(body);
ShaderTable::const_iterator i = _make_table.find(sbody);
if (i != _make_table.end() && (lang == SL_none || lang == i->second->_language)) {
return i->second;
if (cache_generated_shaders) {
ShaderTable::const_iterator i = _make_table.find(sbody);
if (i != _make_table.end() && (lang == SL_none || lang == i->second->_language)) {
return i->second;
}
}
PT(Shader) shader = new Shader(lang);
@ -2678,7 +2682,9 @@ make(const string &body, ShaderLanguage lang) {
}
#endif
_make_table[sbody] = shader;
if (cache_generated_shaders) {
_make_table[sbody] = shader;
}
if (dump_generated_shaders) {
ostringstream fns;
@ -2718,9 +2724,11 @@ make(ShaderLanguage lang, const string &vertex, const string &fragment,
ShaderFile sbody(vertex, fragment, geometry, tess_control, tess_evaluation);
ShaderTable::const_iterator i = _make_table.find(sbody);
if (i != _make_table.end() && (lang == SL_none || lang == i->second->_language)) {
return i->second;
if (cache_generated_shaders) {
ShaderTable::const_iterator i = _make_table.find(sbody);
if (i != _make_table.end() && (lang == SL_none || lang == i->second->_language)) {
return i->second;
}
}
PT(Shader) shader = new Shader(lang);
@ -2737,8 +2745,10 @@ make(ShaderLanguage lang, const string &vertex, const string &fragment,
}
#endif
if (cache_generated_shaders) {
_make_table[sbody] = shader;
}
_make_table[sbody] = shader;
return shader;
}
@ -2759,16 +2769,22 @@ make_compute(ShaderLanguage lang, const string &body) {
sbody._separate = true;
sbody._compute = body;
ShaderTable::const_iterator i = _make_table.find(sbody);
if (i != _make_table.end() && (lang == SL_none || lang == i->second->_language)) {
return i->second;
if (cache_generated_shaders) {
ShaderTable::const_iterator i = _make_table.find(sbody);
if (i != _make_table.end() && (lang == SL_none || lang == i->second->_language)) {
return i->second;
}
}
PT(Shader) shader = new Shader(lang);
shader->_filename = ShaderFile("created-shader");
shader->_text = sbody;
_make_table[sbody] = shader;
if (cache_generated_shaders) {
_make_table[sbody] = shader;
}
return shader;
}

View File

@ -649,7 +649,7 @@ synthesize_shader(const RenderState *rs) {
text << "//Cg\n";
text << "/* Generated shader for render state " << rs << ":\n";
text << "/* Generated shader for render state:\n";
rs->write(text, 2);
text << "*/\n";