Просмотр исходного кода

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

rdb 9 лет назад
Родитель
Сommit
4b5c317160
1 измененных файлов с 36 добавлено и 3 удалено
  1. 36 3
      panda/src/gobj/shader.cxx

+ 36 - 3
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)) {