From 4b5c31716036258f421bd783faaac16e7fdf3ccb Mon Sep 17 00:00:00 2001 From: rdb Date: Mon, 19 Dec 2016 22:26:16 +0100 Subject: [PATCH] Improve shader caching; cache result of preprocess if cache-generated-shaders is set --- panda/src/gobj/shader.cxx | 39 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/panda/src/gobj/shader.cxx b/panda/src/gobj/shader.cxx index e067c18582..306f76f6f8 100644 --- a/panda/src/gobj/shader.cxx +++ b/panda/src/gobj/shader.cxx @@ -2380,6 +2380,12 @@ do_read_source(string &into, const Filename &fn, BamCacheRecord *record) { _last_modified = max(_last_modified, vf->get_timestamp()); _source_files.push_back(vf->get_filename()); } + + // Strip trailing whitespace. + while (isspace(into[into.size() - 1])) { + into.resize(into.size() - 1); + } + return true; } @@ -2521,6 +2527,11 @@ r_preprocess_source(ostream &out, const Filename &fn, line += line2.substr(block_end + 2); } + // Strip trailing whitespace. + while (isspace(line[line.size() - 1])) { + line.resize(line.size() - 1); + } + // Check if this line contains a #directive. char directive[64]; if (line.size() < 8 || sscanf(line.c_str(), " # %63s", directive) != 1) { @@ -2940,6 +2951,14 @@ load(const Filename &file, ShaderLanguage lang) { } _load_table[sfile] = shader; + + if (cache_generated_shaders) { + ShaderTable::const_iterator i = _make_table.find(shader->_text); + if (i != _make_table.end() && (lang == SL_none || lang == i->second->_language)) { + return i->second; + } + _make_table[shader->_text] = shader; + } return shader; } @@ -2970,6 +2989,14 @@ load(ShaderLanguage lang, const Filename &vertex, } _load_table[sfile] = shader; + + if (cache_generated_shaders) { + ShaderTable::const_iterator i = _make_table.find(shader->_text); + if (i != _make_table.end() && (lang == SL_none || lang == i->second->_language)) { + return i->second; + } + _make_table[shader->_text] = shader; + } return shader; } @@ -3025,14 +3052,21 @@ load_compute(ShaderLanguage lang, const Filename &fn) { if (!shader->read(sfile, record)) { return NULL; } + _load_table[sfile] = shader; + + if (cache_generated_shaders) { + ShaderTable::const_iterator i = _make_table.find(shader->_text); + if (i != _make_table.end() && (lang == SL_none || lang == i->second->_language)) { + return i->second; + } + _make_table[shader->_text] = shader; + } // It makes little sense to cache the shader before compilation, so we keep // the record for when we have the compiled the shader. swap(shader->_record, record); shader->_cache_compiled_shader = BamCache::get_global_ptr()->get_cache_compiled_shaders(); shader->_fullpath = shader->_source_files[0]; - - _load_table[sfile] = shader; return shader; } @@ -3166,7 +3200,6 @@ make_compute(ShaderLanguage lang, const string &body) { sbody._separate = true; sbody._compute = body; - if (cache_generated_shaders) { ShaderTable::const_iterator i = _make_table.find(sbody); if (i != _make_table.end() && (lang == SL_none || lang == i->second->_language)) {