summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar ReinUsesLisp2019-01-13 23:33:31 -0300
committerGravatar ReinUsesLisp2019-02-06 22:20:57 -0300
commita1faed99501d04b233d44a7cab0368449d8a9cb5 (patch)
tree01cc9ac951d4ef4b62a7db35b2d7c84342acd3cc /src
parentgl_shader_disk_cache: Add precompiled save (diff)
downloadyuzu-a1faed99501d04b233d44a7cab0368449d8a9cb5.tar.gz
yuzu-a1faed99501d04b233d44a7cab0368449d8a9cb5.tar.xz
yuzu-a1faed99501d04b233d44a7cab0368449d8a9cb5.zip
gl_shader_disk_cache: Add precompiled load
Diffstat (limited to 'src')
-rw-r--r--src/video_core/renderer_opengl/gl_shader_disk_cache.cpp39
-rw-r--r--src/video_core/renderer_opengl/gl_shader_disk_cache.h6
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
124std::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
159void ShaderDiskCacheOpenGL::InvalidatePrecompiled() const {
160 FileUtil::Delete(GetPrecompiledPath());
161}
162
124void ShaderDiskCacheOpenGL::SaveRaw(const ShaderDiskCacheRaw& entry) { 163void 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