diff options
| -rw-r--r-- | src/video_core/renderer_opengl/gl_shader_disk_cache.cpp | 39 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_shader_disk_cache.h | 6 |
2 files changed, 45 insertions, 0 deletions
diff --git a/src/video_core/renderer_opengl/gl_shader_disk_cache.cpp b/src/video_core/renderer_opengl/gl_shader_disk_cache.cpp index 0c42e3d8a..a87bb1f9e 100644 --- a/src/video_core/renderer_opengl/gl_shader_disk_cache.cpp +++ b/src/video_core/renderer_opengl/gl_shader_disk_cache.cpp | |||
| @@ -121,6 +121,45 @@ bool ShaderDiskCacheOpenGL::LoadTransferable(std::vector<ShaderDiskCacheRaw>& ra | |||
| 121 | return true; | 121 | return true; |
| 122 | } | 122 | } |
| 123 | 123 | ||
| 124 | std::vector<ShaderDiskCachePrecompiledEntry> ShaderDiskCacheOpenGL::LoadPrecompiled() { | ||
| 125 | FileUtil::IOFile file(GetPrecompiledPath(), "rb"); | ||
| 126 | if (!file.IsOpen()) { | ||
| 127 | LOG_INFO(Render_OpenGL, "No precompiled shader cache found for game with title id={}", | ||
| 128 | GetTitleID()); | ||
| 129 | return {}; | ||
| 130 | } | ||
| 131 | const u64 file_size = file.GetSize(); | ||
| 132 | |||
| 133 | u64 precompiled_hash{}; | ||
| 134 | file.ReadBytes(&precompiled_hash, sizeof(precompiled_hash)); | ||
| 135 | if (precompiled_hash != PrecompiledHash) { | ||
| 136 | LOG_INFO(Render_OpenGL, "Precompiled cache is from another version of yuzu - removing"); | ||
| 137 | file.Close(); | ||
| 138 | InvalidatePrecompiled(); | ||
| 139 | return {}; | ||
| 140 | } | ||
| 141 | |||
| 142 | std::vector<ShaderDiskCachePrecompiledEntry> precompiled; | ||
| 143 | while (file.Tell() < file_size) { | ||
| 144 | ShaderDiskCachePrecompiledEntry entry; | ||
| 145 | file.ReadBytes(&entry.usage, sizeof(entry.usage)); | ||
| 146 | |||
| 147 | file.ReadBytes(&entry.binary_format, sizeof(u32)); | ||
| 148 | |||
| 149 | u32 binary_length{}; | ||
| 150 | file.ReadBytes(&binary_length, sizeof(u32)); | ||
| 151 | entry.binary.resize(binary_length); | ||
| 152 | file.ReadBytes(entry.binary.data(), entry.binary.size()); | ||
| 153 | |||
| 154 | precompiled.push_back(entry); | ||
| 155 | } | ||
| 156 | return precompiled; | ||
| 157 | } | ||
| 158 | |||
| 159 | void ShaderDiskCacheOpenGL::InvalidatePrecompiled() const { | ||
| 160 | FileUtil::Delete(GetPrecompiledPath()); | ||
| 161 | } | ||
| 162 | |||
| 124 | void ShaderDiskCacheOpenGL::SaveRaw(const ShaderDiskCacheRaw& entry) { | 163 | void ShaderDiskCacheOpenGL::SaveRaw(const ShaderDiskCacheRaw& entry) { |
| 125 | const u64 id = entry.GetUniqueIdentifier(); | 164 | const u64 id = entry.GetUniqueIdentifier(); |
| 126 | if (transferable.find(id) != transferable.end()) { | 165 | if (transferable.find(id) != transferable.end()) { |
diff --git a/src/video_core/renderer_opengl/gl_shader_disk_cache.h b/src/video_core/renderer_opengl/gl_shader_disk_cache.h index fdb29caa5..e68aea694 100644 --- a/src/video_core/renderer_opengl/gl_shader_disk_cache.h +++ b/src/video_core/renderer_opengl/gl_shader_disk_cache.h | |||
| @@ -144,6 +144,12 @@ public: | |||
| 144 | bool LoadTransferable(std::vector<ShaderDiskCacheRaw>& raws, | 144 | bool LoadTransferable(std::vector<ShaderDiskCacheRaw>& raws, |
| 145 | std::vector<ShaderDiskCacheUsage>& usages); | 145 | std::vector<ShaderDiskCacheUsage>& usages); |
| 146 | 146 | ||
| 147 | /// Loads current game's precompiled cache. Invalidates if emulator's version has changed. | ||
| 148 | std::vector<ShaderDiskCachePrecompiledEntry> LoadPrecompiled(); | ||
| 149 | |||
| 150 | /// Removes the precompiled cache file. | ||
| 151 | void InvalidatePrecompiled() const; | ||
| 152 | |||
| 147 | /// Saves a raw dump to the transferable file. Checks for collisions. | 153 | /// Saves a raw dump to the transferable file. Checks for collisions. |
| 148 | void SaveRaw(const ShaderDiskCacheRaw& entry); | 154 | void SaveRaw(const ShaderDiskCacheRaw& entry); |
| 149 | 155 | ||