mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-03 02:15:43 -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 "
|
"to disk. This is useful for debugging broken shader "
|
||||||
"generators."));
|
"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
|
ConfigVariableBool enforce_attrib_lock
|
||||||
("enforce-attrib-lock", true,
|
("enforce-attrib-lock", true,
|
||||||
PRC_DESC("When a MaterialAttrib, TextureAttrib, or LightAttrib is "
|
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 connect_triangle_strips;
|
||||||
extern EXPCL_PANDA_GOBJ ConfigVariableBool preserve_triangle_strips;
|
extern EXPCL_PANDA_GOBJ ConfigVariableBool preserve_triangle_strips;
|
||||||
extern EXPCL_PANDA_GOBJ ConfigVariableBool dump_generated_shaders;
|
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 enforce_attrib_lock;
|
||||||
extern EXPCL_PANDA_GOBJ ConfigVariableBool vertices_float64;
|
extern EXPCL_PANDA_GOBJ ConfigVariableBool vertices_float64;
|
||||||
extern EXPCL_PANDA_GOBJ ConfigVariableInt vertex_column_alignment;
|
extern EXPCL_PANDA_GOBJ ConfigVariableInt vertex_column_alignment;
|
||||||
|
@ -1829,6 +1829,7 @@ cg_analyze_shader(const ShaderCaps &caps) {
|
|||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
cg_release_resources();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2657,10 +2658,13 @@ make(const string &body, ShaderLanguage lang) {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
ShaderFile sbody(body);
|
ShaderFile sbody(body);
|
||||||
|
|
||||||
|
if (cache_generated_shaders) {
|
||||||
ShaderTable::const_iterator i = _make_table.find(sbody);
|
ShaderTable::const_iterator i = _make_table.find(sbody);
|
||||||
if (i != _make_table.end() && (lang == SL_none || lang == i->second->_language)) {
|
if (i != _make_table.end() && (lang == SL_none || lang == i->second->_language)) {
|
||||||
return i->second;
|
return i->second;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
PT(Shader) shader = new Shader(lang);
|
PT(Shader) shader = new Shader(lang);
|
||||||
shader->_filename = ShaderFile("created-shader");
|
shader->_filename = ShaderFile("created-shader");
|
||||||
@ -2678,7 +2682,9 @@ make(const string &body, ShaderLanguage lang) {
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
if (cache_generated_shaders) {
|
||||||
_make_table[sbody] = shader;
|
_make_table[sbody] = shader;
|
||||||
|
}
|
||||||
|
|
||||||
if (dump_generated_shaders) {
|
if (dump_generated_shaders) {
|
||||||
ostringstream fns;
|
ostringstream fns;
|
||||||
@ -2718,10 +2724,12 @@ make(ShaderLanguage lang, const string &vertex, const string &fragment,
|
|||||||
|
|
||||||
ShaderFile sbody(vertex, fragment, geometry, tess_control, tess_evaluation);
|
ShaderFile sbody(vertex, fragment, geometry, tess_control, tess_evaluation);
|
||||||
|
|
||||||
|
if (cache_generated_shaders) {
|
||||||
ShaderTable::const_iterator i = _make_table.find(sbody);
|
ShaderTable::const_iterator i = _make_table.find(sbody);
|
||||||
if (i != _make_table.end() && (lang == SL_none || lang == i->second->_language)) {
|
if (i != _make_table.end() && (lang == SL_none || lang == i->second->_language)) {
|
||||||
return i->second;
|
return i->second;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
PT(Shader) shader = new Shader(lang);
|
PT(Shader) shader = new Shader(lang);
|
||||||
shader->_filename = ShaderFile("created-shader");
|
shader->_filename = ShaderFile("created-shader");
|
||||||
@ -2737,8 +2745,10 @@ make(ShaderLanguage lang, const string &vertex, const string &fragment,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
if (cache_generated_shaders) {
|
||||||
_make_table[sbody] = shader;
|
_make_table[sbody] = shader;
|
||||||
|
}
|
||||||
|
|
||||||
return shader;
|
return shader;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2759,16 +2769,22 @@ make_compute(ShaderLanguage lang, const string &body) {
|
|||||||
sbody._separate = true;
|
sbody._separate = true;
|
||||||
sbody._compute = body;
|
sbody._compute = body;
|
||||||
|
|
||||||
|
|
||||||
|
if (cache_generated_shaders) {
|
||||||
ShaderTable::const_iterator i = _make_table.find(sbody);
|
ShaderTable::const_iterator i = _make_table.find(sbody);
|
||||||
if (i != _make_table.end() && (lang == SL_none || lang == i->second->_language)) {
|
if (i != _make_table.end() && (lang == SL_none || lang == i->second->_language)) {
|
||||||
return i->second;
|
return i->second;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
PT(Shader) shader = new Shader(lang);
|
PT(Shader) shader = new Shader(lang);
|
||||||
shader->_filename = ShaderFile("created-shader");
|
shader->_filename = ShaderFile("created-shader");
|
||||||
shader->_text = sbody;
|
shader->_text = sbody;
|
||||||
|
|
||||||
|
if (cache_generated_shaders) {
|
||||||
_make_table[sbody] = shader;
|
_make_table[sbody] = shader;
|
||||||
|
}
|
||||||
|
|
||||||
return shader;
|
return shader;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -649,7 +649,7 @@ synthesize_shader(const RenderState *rs) {
|
|||||||
|
|
||||||
text << "//Cg\n";
|
text << "//Cg\n";
|
||||||
|
|
||||||
text << "/* Generated shader for render state " << rs << ":\n";
|
text << "/* Generated shader for render state:\n";
|
||||||
rs->write(text, 2);
|
rs->write(text, 2);
|
||||||
text << "*/\n";
|
text << "*/\n";
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user