diff options
| author | Callum Linden <113564339+callumlinden@users.noreply.github.com> | 2025-09-04 14:51:34 -0700 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-09-04 14:51:34 -0700 | 
| commit | 66ccfabdd39a8a54a94d5dbf15364ff7f94a13c2 (patch) | |
| tree | fae8bca7bb3f3ac05972803e2fefc05de8542408 /indra/llrender/llshadermgr.cpp | |
| parent | 0ae3de8f1e78dc74914ea70e725c8324390f3e97 (diff) | |
| parent | 90aa693f2a9ece9f1c624dba245f202e126bca5b (diff) | |
Merge branch 'project/mac_universal' into callum/viewer-cef-2025-08
Diffstat (limited to 'indra/llrender/llshadermgr.cpp')
| -rw-r--r-- | indra/llrender/llshadermgr.cpp | 61 | 
1 files changed, 43 insertions, 18 deletions
diff --git a/indra/llrender/llshadermgr.cpp b/indra/llrender/llshadermgr.cpp index 4807c12226..9cdd02f403 100644 --- a/indra/llrender/llshadermgr.cpp +++ b/indra/llrender/llshadermgr.cpp @@ -458,7 +458,7 @@ GLuint LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shader_lev  // endsure work-around for missing GLSL funcs gets propogated to feature shader files (e.g. srgbF.glsl)  #if LL_DARWIN -    if (defines) +    if (!gGLManager.mIsApple && defines)      {          (*defines)["OLD_SELECT"] = "1";      } @@ -989,16 +989,17 @@ bool LLShaderMgr::validateProgramObject(GLuint obj)      return success;  } -void LLShaderMgr::initShaderCache(bool enabled, const LLUUID& old_cache_version, const LLUUID& current_cache_version) +void LLShaderMgr::initShaderCache(bool enabled, const LLUUID& old_cache_version, const LLUUID& current_cache_version, bool second_instance)  { -    LL_INFOS() << "Initializing shader cache" << LL_ENDL; +    LL_PROFILE_ZONE_SCOPED; +    LL_INFOS("ShaderMgr") << "Initializing shader cache" << LL_ENDL;      mShaderCacheEnabled = gGLManager.mGLVersion >= 4.09 && enabled; -    if(!mShaderCacheEnabled || mShaderCacheInitialized) +    if(!mShaderCacheEnabled || mShaderCacheVersion.notNull())          return; -    mShaderCacheInitialized = true; +    mShaderCacheVersion = current_cache_version;      mShaderCacheDir = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "shader_cache");      LLFile::mkdir(mShaderCacheDir); @@ -1007,16 +1008,19 @@ void LLShaderMgr::initShaderCache(bool enabled, const LLUUID& old_cache_version,          std::string meta_out_path = gDirUtilp->add(mShaderCacheDir, "shaderdata.llsd");          if (gDirUtilp->fileExists(meta_out_path))          { -            LL_INFOS() << "Loading shader cache metadata" << LL_ENDL; +            LL_PROFILE_ZONE_NAMED("shader_cache"); +            LL_INFOS("ShaderMgr") << "Loading shader cache metadata" << LL_ENDL; -            llifstream instream(meta_out_path); +            llifstream instream(meta_out_path, std::ifstream::in | std::ifstream::binary);              LLSD in_data; -            LLSDSerialize::fromNotation(in_data, instream, LLSDSerialize::SIZE_UNLIMITED); +            // todo: this is likely very expensive to parse, should use binary +            LLSDSerialize::fromBinary(in_data, instream, LLSDSerialize::SIZE_UNLIMITED);              instream.close(); -            if (old_cache_version == current_cache_version) +            if (old_cache_version == current_cache_version +                && in_data["version"].asUUID() == current_cache_version)              { -                for (const auto& data_pair : llsd::inMap(in_data)) +                for (const auto& data_pair : llsd::inMap(in_data["shaders"]))                  {                      ProgramBinaryData binary_info = ProgramBinaryData();                      binary_info.mBinaryFormat = data_pair.second["binary_format"].asInteger(); @@ -1025,11 +1029,15 @@ void LLShaderMgr::initShaderCache(bool enabled, const LLUUID& old_cache_version,                      mShaderBinaryCache.insert_or_assign(LLUUID(data_pair.first), binary_info);                  }              } -            else +            else if (!second_instance)              { -                LL_INFOS() << "Shader cache version mismatch detected. Purging." << LL_ENDL; +                LL_INFOS("ShaderMgr") << "Shader cache version mismatch detected. Purging." << LL_ENDL;                  clearShaderCache();              } +            else +            { +                LL_INFOS("ShaderMgr") << "Shader cache version mismatch detected." << LL_ENDL; +            }          }      }  } @@ -1037,7 +1045,7 @@ void LLShaderMgr::initShaderCache(bool enabled, const LLUUID& old_cache_version,  void LLShaderMgr::clearShaderCache()  {      std::string shader_cache = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "shader_cache"); -    LL_INFOS() << "Removing shader cache at " << shader_cache << LL_ENDL; +    LL_INFOS("ShaderMgr") << "Removing shader cache at " << shader_cache << LL_ENDL;      const std::string mask = "*";      gDirUtilp->deleteFilesInDir(shader_cache, mask);      mShaderBinaryCache.clear(); @@ -1046,10 +1054,22 @@ void LLShaderMgr::clearShaderCache()  void LLShaderMgr::persistShaderCacheMetadata()  {      if(!mShaderCacheEnabled) return; +    if (mShaderCacheVersion.isNull()) +    { +        LL_WARNS("ShaderMgr") << "Attempted to save shader cache with no version set" << LL_ENDL; +        return; +    } -    LL_INFOS() << "Persisting shader cache metadata to disk" << LL_ENDL; +    LL_INFOS("ShaderMgr") << "Persisting shader cache metadata to disk" << LL_ENDL; -    LLSD out = LLSD::emptyMap(); +    LLSD out; +    // Settings and shader cache get saved at different time, thus making +    // RenderShaderCacheVersion unreliable when running multiple viewer +    // instances, or for cases where viewer crashes before saving settings. +    // Dupplicate version to the cache itself. +    out["version"] = mShaderCacheVersion; +    out["shaders"] = LLSD::emptyMap(); +    LLSD &shaders = out["shaders"];      static const F32 LRU_TIME = (60.f * 60.f) * 24.f * 7.f; // 14 days      const F32 current_time = (F32)LLTimer::getTotalSeconds(); @@ -1068,14 +1088,19 @@ void LLShaderMgr::persistShaderCacheMetadata()              data["binary_format"] = LLSD::Integer(shader_metadata.mBinaryFormat);              data["binary_size"] = LLSD::Integer(shader_metadata.mBinaryLength);              data["last_used"] = LLSD::Real(shader_metadata.mLastUsedTime); -            out[it->first.asString()] = data; +            shaders[it->first.asString()] = data;              ++it;          }      }      std::string meta_out_path = gDirUtilp->add(mShaderCacheDir, "shaderdata.llsd"); -    llofstream outstream(meta_out_path); -    LLSDSerialize::toNotation(out, outstream); +    llofstream outstream(meta_out_path, std::ios_base::out | std::ios_base::binary); +    if (!outstream.is_open()) +    { +        LL_WARNS("ShaderMgr") << "Failed to open file. Unable to save shader cache to: " << mShaderCacheDir << LL_ENDL; +        return; +    } +    LLSDSerialize::toBinary(out, outstream);      outstream.close();  }  | 
