Improve shader caching; cache result of preprocess if cache-generated-shaders is set

This commit is contained in:
rdb 2016-12-19 22:26:16 +01:00
parent 36f2eda9ec
commit 4b5c317160
1 changed files with 36 additions and 3 deletions

View File

@ -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)) {