diff options
| author | 2019-01-13 23:30:37 -0300 | |
|---|---|---|
| committer | 2019-02-06 22:20:57 -0300 | |
| commit | 3435cd8d5e34f36ae493840fb5577b055a6b9fe2 (patch) | |
| tree | 4a497f4fe23f843032797e3070422ff6f9386d3b /src | |
| parent | gl_shader_disk_cache: Add transferable stores (diff) | |
| download | yuzu-3435cd8d5e34f36ae493840fb5577b055a6b9fe2.tar.gz yuzu-3435cd8d5e34f36ae493840fb5577b055a6b9fe2.tar.xz yuzu-3435cd8d5e34f36ae493840fb5577b055a6b9fe2.zip | |
gl_shader_disk_cache: Add transferable load
Diffstat (limited to 'src')
| -rw-r--r-- | src/video_core/renderer_opengl/gl_shader_disk_cache.cpp | 52 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/gl_shader_disk_cache.h | 4 |
2 files changed, 56 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 ef8cfffd6..eb9854b9f 100644 --- a/src/video_core/renderer_opengl/gl_shader_disk_cache.cpp +++ b/src/video_core/renderer_opengl/gl_shader_disk_cache.cpp | |||
| @@ -66,6 +66,58 @@ void ShaderDiskCacheRaw::Save(FileUtil::IOFile& file) const { | |||
| 66 | } | 66 | } |
| 67 | } | 67 | } |
| 68 | 68 | ||
| 69 | bool ShaderDiskCacheOpenGL::LoadTransferable(std::vector<ShaderDiskCacheRaw>& raws, | ||
| 70 | std::vector<ShaderDiskCacheUsage>& usages) { | ||
| 71 | FileUtil::IOFile file(GetTransferablePath(), "rb"); | ||
| 72 | if (!file.IsOpen()) { | ||
| 73 | LOG_INFO(Render_OpenGL, "No transferable shader cache found for game with title id={}", | ||
| 74 | GetTitleID()); | ||
| 75 | return false; | ||
| 76 | } | ||
| 77 | const u64 file_size = file.GetSize(); | ||
| 78 | |||
| 79 | u32 version{}; | ||
| 80 | file.ReadBytes(&version, sizeof(version)); | ||
| 81 | |||
| 82 | if (version < NativeVersion) { | ||
| 83 | LOG_INFO(Render_OpenGL, "Transferable shader cache is old - removing"); | ||
| 84 | file.Close(); | ||
| 85 | FileUtil::Delete(GetTransferablePath()); | ||
| 86 | return false; | ||
| 87 | } | ||
| 88 | if (version > NativeVersion) { | ||
| 89 | LOG_WARNING(Render_OpenGL, "Transferable shader cache was generated with a newer version " | ||
| 90 | "of the emulator - skipping"); | ||
| 91 | return false; | ||
| 92 | } | ||
| 93 | |||
| 94 | // Version is valid, load the shaders | ||
| 95 | while (file.Tell() < file_size) { | ||
| 96 | EntryKind kind{}; | ||
| 97 | file.ReadBytes(&kind, sizeof(u32)); | ||
| 98 | |||
| 99 | switch (kind) { | ||
| 100 | case EntryKind::Raw: { | ||
| 101 | ShaderDiskCacheRaw entry{file}; | ||
| 102 | transferable.insert({entry.GetUniqueIdentifier(), {}}); | ||
| 103 | raws.push_back(std::move(entry)); | ||
| 104 | break; | ||
| 105 | } | ||
| 106 | case EntryKind::Usage: { | ||
| 107 | ShaderDiskCacheUsage usage{}; | ||
| 108 | file.ReadBytes(&usage, sizeof(usage)); | ||
| 109 | usages.push_back(std::move(usage)); | ||
| 110 | break; | ||
| 111 | } | ||
| 112 | default: | ||
| 113 | LOG_ERROR(Render_OpenGL, "Unknown transferable shader cache entry kind={} - aborting", | ||
| 114 | static_cast<u32>(kind)); | ||
| 115 | return false; | ||
| 116 | } | ||
| 117 | } | ||
| 118 | return true; | ||
| 119 | } | ||
| 120 | |||
| 69 | void ShaderDiskCacheOpenGL::SaveRaw(const ShaderDiskCacheRaw& entry) { | 121 | void ShaderDiskCacheOpenGL::SaveRaw(const ShaderDiskCacheRaw& entry) { |
| 70 | const u64 id = entry.GetUniqueIdentifier(); | 122 | const u64 id = entry.GetUniqueIdentifier(); |
| 71 | if (transferable.find(id) != transferable.end()) { | 123 | 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 d4449c132..46d762b64 100644 --- a/src/video_core/renderer_opengl/gl_shader_disk_cache.h +++ b/src/video_core/renderer_opengl/gl_shader_disk_cache.h | |||
| @@ -132,6 +132,10 @@ public: | |||
| 132 | 132 | ||
| 133 | class ShaderDiskCacheOpenGL { | 133 | class ShaderDiskCacheOpenGL { |
| 134 | public: | 134 | public: |
| 135 | /// Loads transferable cache. If file has a old version, it deletes it. Returns true on success. | ||
| 136 | bool LoadTransferable(std::vector<ShaderDiskCacheRaw>& raws, | ||
| 137 | std::vector<ShaderDiskCacheUsage>& usages); | ||
| 138 | |||
| 135 | /// Saves a raw dump to the transferable file. Checks for collisions. | 139 | /// Saves a raw dump to the transferable file. Checks for collisions. |
| 136 | void SaveRaw(const ShaderDiskCacheRaw& entry); | 140 | void SaveRaw(const ShaderDiskCacheRaw& entry); |
| 137 | 141 | ||