|
|
@@ -121,6 +121,45 @@ bool ShaderDiskCacheOpenGL::LoadTransferable(std::vector<ShaderDiskCacheRaw>& ra
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
+std::vector<ShaderDiskCachePrecompiledEntry> ShaderDiskCacheOpenGL::LoadPrecompiled() {
|
|
|
+ FileUtil::IOFile file(GetPrecompiledPath(), "rb");
|
|
|
+ if (!file.IsOpen()) {
|
|
|
+ LOG_INFO(Render_OpenGL, "No precompiled shader cache found for game with title id={}",
|
|
|
+ GetTitleID());
|
|
|
+ return {};
|
|
|
+ }
|
|
|
+ const u64 file_size = file.GetSize();
|
|
|
+
|
|
|
+ u64 precompiled_hash{};
|
|
|
+ file.ReadBytes(&precompiled_hash, sizeof(precompiled_hash));
|
|
|
+ if (precompiled_hash != PrecompiledHash) {
|
|
|
+ LOG_INFO(Render_OpenGL, "Precompiled cache is from another version of yuzu - removing");
|
|
|
+ file.Close();
|
|
|
+ InvalidatePrecompiled();
|
|
|
+ return {};
|
|
|
+ }
|
|
|
+
|
|
|
+ std::vector<ShaderDiskCachePrecompiledEntry> precompiled;
|
|
|
+ while (file.Tell() < file_size) {
|
|
|
+ ShaderDiskCachePrecompiledEntry entry;
|
|
|
+ file.ReadBytes(&entry.usage, sizeof(entry.usage));
|
|
|
+
|
|
|
+ file.ReadBytes(&entry.binary_format, sizeof(u32));
|
|
|
+
|
|
|
+ u32 binary_length{};
|
|
|
+ file.ReadBytes(&binary_length, sizeof(u32));
|
|
|
+ entry.binary.resize(binary_length);
|
|
|
+ file.ReadBytes(entry.binary.data(), entry.binary.size());
|
|
|
+
|
|
|
+ precompiled.push_back(entry);
|
|
|
+ }
|
|
|
+ return precompiled;
|
|
|
+}
|
|
|
+
|
|
|
+void ShaderDiskCacheOpenGL::InvalidatePrecompiled() const {
|
|
|
+ FileUtil::Delete(GetPrecompiledPath());
|
|
|
+}
|
|
|
+
|
|
|
void ShaderDiskCacheOpenGL::SaveRaw(const ShaderDiskCacheRaw& entry) {
|
|
|
const u64 id = entry.GetUniqueIdentifier();
|
|
|
if (transferable.find(id) != transferable.end()) {
|