diff --git a/panda/src/gobj/config_gobj.cxx b/panda/src/gobj/config_gobj.cxx index a1d3c43d03..7723d6b10b 100644 --- a/panda/src/gobj/config_gobj.cxx +++ b/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 " diff --git a/panda/src/gobj/config_gobj.h b/panda/src/gobj/config_gobj.h index df8824b68b..b7634f0480 100644 --- a/panda/src/gobj/config_gobj.h +++ b/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; diff --git a/panda/src/gobj/shader.cxx b/panda/src/gobj/shader.cxx index 4c1bf76f17..95a2fff67d 100644 --- a/panda/src/gobj/shader.cxx +++ b/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; } diff --git a/panda/src/pgraphnodes/shaderGenerator.cxx b/panda/src/pgraphnodes/shaderGenerator.cxx index 9e76063177..90265514ed 100644 --- a/panda/src/pgraphnodes/shaderGenerator.cxx +++ b/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";