From 3435cd8d5e34f36ae493840fb5577b055a6b9fe2 Mon Sep 17 00:00:00 2001 From: ReinUsesLisp Date: Sun, 13 Jan 2019 23:30:37 -0300 Subject: gl_shader_disk_cache: Add transferable load --- .../renderer_opengl/gl_shader_disk_cache.cpp | 52 ++++++++++++++++++++++ .../renderer_opengl/gl_shader_disk_cache.h | 4 ++ 2 files changed, 56 insertions(+) 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 { } } +bool ShaderDiskCacheOpenGL::LoadTransferable(std::vector& raws, + std::vector& usages) { + FileUtil::IOFile file(GetTransferablePath(), "rb"); + if (!file.IsOpen()) { + LOG_INFO(Render_OpenGL, "No transferable shader cache found for game with title id={}", + GetTitleID()); + return false; + } + const u64 file_size = file.GetSize(); + + u32 version{}; + file.ReadBytes(&version, sizeof(version)); + + if (version < NativeVersion) { + LOG_INFO(Render_OpenGL, "Transferable shader cache is old - removing"); + file.Close(); + FileUtil::Delete(GetTransferablePath()); + return false; + } + if (version > NativeVersion) { + LOG_WARNING(Render_OpenGL, "Transferable shader cache was generated with a newer version " + "of the emulator - skipping"); + return false; + } + + // Version is valid, load the shaders + while (file.Tell() < file_size) { + EntryKind kind{}; + file.ReadBytes(&kind, sizeof(u32)); + + switch (kind) { + case EntryKind::Raw: { + ShaderDiskCacheRaw entry{file}; + transferable.insert({entry.GetUniqueIdentifier(), {}}); + raws.push_back(std::move(entry)); + break; + } + case EntryKind::Usage: { + ShaderDiskCacheUsage usage{}; + file.ReadBytes(&usage, sizeof(usage)); + usages.push_back(std::move(usage)); + break; + } + default: + LOG_ERROR(Render_OpenGL, "Unknown transferable shader cache entry kind={} - aborting", + static_cast(kind)); + return false; + } + } + return true; +} + void ShaderDiskCacheOpenGL::SaveRaw(const ShaderDiskCacheRaw& entry) { const u64 id = entry.GetUniqueIdentifier(); 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: class ShaderDiskCacheOpenGL { public: + /// Loads transferable cache. If file has a old version, it deletes it. Returns true on success. + bool LoadTransferable(std::vector& raws, + std::vector& usages); + /// Saves a raw dump to the transferable file. Checks for collisions. void SaveRaw(const ShaderDiskCacheRaw& entry); -- cgit v1.2.3