Skip to content

Commit 586c067

Browse files
committed
Fix shader generator memory leaks
1 parent b3630c4 commit 586c067

File tree

4 files changed

+35
-13
lines changed

4 files changed

+35
-13
lines changed

panda/src/gobj/config_gobj.cxx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,11 @@ ConfigVariableBool dump_generated_shaders
255255
"to disk. This is useful for debugging broken shader "
256256
"generators."));
257257

258+
ConfigVariableBool cache_generated_shaders
259+
("cache-generated-shaders", true,
260+
PRC_DESC("Set this true to cause all generated shaders to be cached in "
261+
"memory. This is useful to prevent unnecessary recompilation."));
262+
258263
ConfigVariableBool enforce_attrib_lock
259264
("enforce-attrib-lock", true,
260265
PRC_DESC("When a MaterialAttrib, TextureAttrib, or LightAttrib is "

panda/src/gobj/config_gobj.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ extern EXPCL_PANDA_GOBJ ConfigVariableBool display_list_animation;
6464
extern EXPCL_PANDA_GOBJ ConfigVariableBool connect_triangle_strips;
6565
extern EXPCL_PANDA_GOBJ ConfigVariableBool preserve_triangle_strips;
6666
extern EXPCL_PANDA_GOBJ ConfigVariableBool dump_generated_shaders;
67+
extern EXPCL_PANDA_GOBJ ConfigVariableBool cache_generated_shaders;
6768
extern EXPCL_PANDA_GOBJ ConfigVariableBool enforce_attrib_lock;
6869
extern EXPCL_PANDA_GOBJ ConfigVariableBool vertices_float64;
6970
extern EXPCL_PANDA_GOBJ ConfigVariableInt vertex_column_alignment;

panda/src/gobj/shader.cxx

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1829,6 +1829,7 @@ cg_analyze_shader(const ShaderCaps &caps) {
18291829
// }
18301830
// }
18311831

1832+
cg_release_resources();
18321833
return true;
18331834
}
18341835

@@ -2657,9 +2658,12 @@ make(const string &body, ShaderLanguage lang) {
26572658
#endif
26582659

26592660
ShaderFile sbody(body);
2660-
ShaderTable::const_iterator i = _make_table.find(sbody);
2661-
if (i != _make_table.end() && (lang == SL_none || lang == i->second->_language)) {
2662-
return i->second;
2661+
2662+
if (cache_generated_shaders) {
2663+
ShaderTable::const_iterator i = _make_table.find(sbody);
2664+
if (i != _make_table.end() && (lang == SL_none || lang == i->second->_language)) {
2665+
return i->second;
2666+
}
26632667
}
26642668

26652669
PT(Shader) shader = new Shader(lang);
@@ -2678,7 +2682,9 @@ make(const string &body, ShaderLanguage lang) {
26782682
}
26792683
#endif
26802684

2681-
_make_table[sbody] = shader;
2685+
if (cache_generated_shaders) {
2686+
_make_table[sbody] = shader;
2687+
}
26822688

26832689
if (dump_generated_shaders) {
26842690
ostringstream fns;
@@ -2718,9 +2724,11 @@ make(ShaderLanguage lang, const string &vertex, const string &fragment,
27182724

27192725
ShaderFile sbody(vertex, fragment, geometry, tess_control, tess_evaluation);
27202726

2721-
ShaderTable::const_iterator i = _make_table.find(sbody);
2722-
if (i != _make_table.end() && (lang == SL_none || lang == i->second->_language)) {
2723-
return i->second;
2727+
if (cache_generated_shaders) {
2728+
ShaderTable::const_iterator i = _make_table.find(sbody);
2729+
if (i != _make_table.end() && (lang == SL_none || lang == i->second->_language)) {
2730+
return i->second;
2731+
}
27242732
}
27252733

27262734
PT(Shader) shader = new Shader(lang);
@@ -2737,8 +2745,10 @@ make(ShaderLanguage lang, const string &vertex, const string &fragment,
27372745
}
27382746
#endif
27392747

2748+
if (cache_generated_shaders) {
2749+
_make_table[sbody] = shader;
2750+
}
27402751

2741-
_make_table[sbody] = shader;
27422752
return shader;
27432753
}
27442754

@@ -2759,16 +2769,22 @@ make_compute(ShaderLanguage lang, const string &body) {
27592769
sbody._separate = true;
27602770
sbody._compute = body;
27612771

2762-
ShaderTable::const_iterator i = _make_table.find(sbody);
2763-
if (i != _make_table.end() && (lang == SL_none || lang == i->second->_language)) {
2764-
return i->second;
2772+
2773+
if (cache_generated_shaders) {
2774+
ShaderTable::const_iterator i = _make_table.find(sbody);
2775+
if (i != _make_table.end() && (lang == SL_none || lang == i->second->_language)) {
2776+
return i->second;
2777+
}
27652778
}
27662779

27672780
PT(Shader) shader = new Shader(lang);
27682781
shader->_filename = ShaderFile("created-shader");
27692782
shader->_text = sbody;
27702783

2771-
_make_table[sbody] = shader;
2784+
if (cache_generated_shaders) {
2785+
_make_table[sbody] = shader;
2786+
}
2787+
27722788
return shader;
27732789
}
27742790

panda/src/pgraphnodes/shaderGenerator.cxx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -649,7 +649,7 @@ synthesize_shader(const RenderState *rs) {
649649

650650
text << "//Cg\n";
651651

652-
text << "/* Generated shader for render state " << rs << ":\n";
652+
text << "/* Generated shader for render state:\n";
653653
rs->write(text, 2);
654654
text << "*/\n";
655655

0 commit comments

Comments
 (0)