Browse Source

Fix shader generator memory leaks

rdb 10 years ago
parent
commit
586c067d69

+ 5 - 0
panda/src/gobj/config_gobj.cxx

@@ -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 "

+ 1 - 0
panda/src/gobj/config_gobj.h

@@ -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;

+ 28 - 12
panda/src/gobj/shader.cxx

@@ -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;
 }
 

+ 1 - 1
panda/src/pgraphnodes/shaderGenerator.cxx

@@ -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";