From 2a3470804752dd54f4ed18f9a2f277b978e0a51c Mon Sep 17 00:00:00 2001 From: Fire Cube Date: Sat, 3 May 2025 22:14:07 +0200 Subject: [PATCH] more --- .../renderer_vulkan/shader_cache.cpp | 121 +++++++++++------- 1 file changed, 74 insertions(+), 47 deletions(-) diff --git a/src/video_core/renderer_vulkan/shader_cache.cpp b/src/video_core/renderer_vulkan/shader_cache.cpp index 8b12e5209..ffa8bb476 100644 --- a/src/video_core/renderer_vulkan/shader_cache.cpp +++ b/src/video_core/renderer_vulkan/shader_cache.cpp @@ -16,6 +16,7 @@ using u32 = uint32_t; namespace ShaderCache { const auto shader_cache_dir = Common::FS::GetUserPath(Common::FS::PathType::ShaderDir) / "cache"; +std::unordered_map> g_ud_storage; u64 CalculateSpecializationHash(const Shader::StageSpecialization& spec) { u64 hash = 0; @@ -407,54 +408,16 @@ void SerializeInfo(std::ostream& info_serialized, Shader::Info info) { for (size_t i = 0; i < info.stores.flags.size(); ++i) { writeBin(info_serialized, info.stores.flags[i]); } -} -bool CheckShaderCache(std::string shader_id) { - // Überprüfen, ob das Verzeichnis existiert - if (!std::filesystem::exists(shader_cache_dir)) { - LOG_INFO(Render_Vulkan, "Shader-Cache-Verzeichnis existiert nicht"); - return false; + // UserData + u32 userDataSize = static_cast(info.user_data.size()); + writeBin(info_serialized, userDataSize); + for (size_t i = 0; i < info.user_data.size(); ++i) { + writeBin(info_serialized, info.user_data[i]); } - // Überprüfen, ob sowohl die SPIR-V-Datei als auch die Ressourcendatei existieren - std::filesystem::path spirv_cache_file_path = shader_cache_dir / (shader_id + ".spv"); - std::filesystem::path resources_file_path = shader_cache_dir / (shader_id + ".resources"); - - if (!std::filesystem::exists(spirv_cache_file_path)) { - LOG_DEBUG(Render_Vulkan, "SPIR-V-Datei nicht gefunden: {}", spirv_cache_file_path.string()); - return false; - } - - if (!std::filesystem::exists(resources_file_path)) { - LOG_DEBUG(Render_Vulkan, "Ressourcendatei nicht gefunden: {}", - resources_file_path.string()); - return false; - } - - // Überprüfen, ob die Dateien lesbar und nicht leer sind - Common::FS::IOFile spirv_file(spirv_cache_file_path, Common::FS::FileAccessMode::Read); - Common::FS::IOFile resources_file(resources_file_path, Common::FS::FileAccessMode::Read); - - const bool spirv_valid = spirv_file.IsOpen() && spirv_file.GetSize() > 0; - const bool resources_valid = resources_file.IsOpen() && resources_file.GetSize() > 0; - - spirv_file.Close(); - resources_file.Close(); - - if (!spirv_valid || !resources_valid) { - LOG_WARNING(Render_Vulkan, "Ungueltige Dateien im Shader-Cache für ID: {}", shader_id); - // Fehlerhafte Dateien entfernen, um zukünftige Probleme zu vermeiden - if (std::filesystem::exists(spirv_cache_file_path)) { - std::filesystem::remove(spirv_cache_file_path); - } - if (std::filesystem::exists(resources_file_path)) { - std::filesystem::remove(resources_file_path); - } - return false; - } - - LOG_INFO(Render_Vulkan, "Shader mit ID {} im Cache gefunden", shader_id); - return true; + // Pgm Base + writeBin(info_serialized, info.pgm_base); } void DeserializeInfo(std::istream& info_serialized, Shader::Info& info) { @@ -729,13 +692,77 @@ void DeserializeInfo(std::istream& info_serialized, Shader::Info& info) { readBin(info_serialized, info.stores.flags[i]); } + // UserData + u32 userDataSize; + readBin(info_serialized, userDataSize); + + static std::vector temp_user_data_storage; + temp_user_data_storage.clear(); + temp_user_data_storage.resize(userDataSize); + + for (u32 i = 0; i < userDataSize; ++i) { + readBin(info_serialized, temp_user_data_storage[i]); + } + + info.user_data = std::span(temp_user_data_storage); + + // Pgm Base + readBin(info_serialized, info.pgm_base); + + // Check if there are any remaining bytes in the stream if (info_serialized.peek() != EOF) { - LOG_WARNING(Render_Vulkan, "Es sind noch {} Bytes im Stream übrig", - info_serialized.gcount()); + LOG_WARNING(Render_Vulkan, "Es sind noch Bytes im Stream übrig"); } } +bool CheckShaderCache(std::string shader_id) { + // Überprüfen, ob das Verzeichnis existiert + if (!std::filesystem::exists(shader_cache_dir)) { + LOG_INFO(Render_Vulkan, "Shader-Cache-Verzeichnis existiert nicht"); + return false; + } + + // Überprüfen, ob sowohl die SPIR-V-Datei als auch die Ressourcendatei existieren + std::filesystem::path spirv_cache_file_path = shader_cache_dir / (shader_id + ".spv"); + std::filesystem::path resources_file_path = shader_cache_dir / (shader_id + ".resources"); + + if (!std::filesystem::exists(spirv_cache_file_path)) { + LOG_DEBUG(Render_Vulkan, "SPIR-V-Datei nicht gefunden: {}", spirv_cache_file_path.string()); + return false; + } + + if (!std::filesystem::exists(resources_file_path)) { + LOG_DEBUG(Render_Vulkan, "Ressourcendatei nicht gefunden: {}", + resources_file_path.string()); + return false; + } + + // Überprüfen, ob die Dateien lesbar und nicht leer sind + Common::FS::IOFile spirv_file(spirv_cache_file_path, Common::FS::FileAccessMode::Read); + Common::FS::IOFile resources_file(resources_file_path, Common::FS::FileAccessMode::Read); + + const bool spirv_valid = spirv_file.IsOpen() && spirv_file.GetSize() > 0; + const bool resources_valid = resources_file.IsOpen() && resources_file.GetSize() > 0; + + spirv_file.Close(); + resources_file.Close(); + + if (!spirv_valid || !resources_valid) { + LOG_WARNING(Render_Vulkan, "Ungueltige Dateien im Shader-Cache für ID: {}", shader_id); + // Fehlerhafte Dateien entfernen, um zukünftige Probleme zu vermeiden + if (std::filesystem::exists(spirv_cache_file_path)) { + std::filesystem::remove(spirv_cache_file_path); + } + if (std::filesystem::exists(resources_file_path)) { + std::filesystem::remove(resources_file_path); + } + return false; + } + + LOG_INFO(Render_Vulkan, "Shader mit ID {} im Cache gefunden", shader_id); + return true; +} void GetShader(std::string shader_id, Shader::Info& info, std::vector& spv) { std::string spirv_cache_filename = shader_id + ".spv";