mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-01 01:07:51 -04:00
Fix shader generator memory leaks
This commit is contained in:
parent
b3630c4e18
commit
586c067d69
@ -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 "
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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";
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user