From 2aee03218c93ce74ca4937dbc192bbd9aaa7eebb Mon Sep 17 00:00:00 2001 From: Fire Cube Date: Wed, 30 Apr 2025 19:56:38 +0200 Subject: [PATCH] temp push --- CMakeLists.txt | 1 + src/common/binary_helper.h | 43 +++++++++++++++++++ .../renderer_vulkan/shader_cache.cpp | 28 ++++++++++++ src/video_core/renderer_vulkan/shader_cache.h | 0 .../renderer_vulkan/vk_pipeline_cache.cpp | 5 +-- 5 files changed, 74 insertions(+), 3 deletions(-) create mode 100644 src/common/binary_helper.h create mode 100644 src/video_core/renderer_vulkan/shader_cache.cpp create mode 100644 src/video_core/renderer_vulkan/shader_cache.h diff --git a/CMakeLists.txt b/CMakeLists.txt index e36c1f280..2014dd1aa 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -633,6 +633,7 @@ set(COMMON src/common/logging/backend.cpp src/common/arch.h src/common/assert.cpp src/common/assert.h + src/common/binary_helper.h src/common/bit_field.h src/common/bounded_threadsafe_queue.h src/common/concepts.h diff --git a/src/common/binary_helper.h b/src/common/binary_helper.h new file mode 100644 index 000000000..b6883cf61 --- /dev/null +++ b/src/common/binary_helper.h @@ -0,0 +1,43 @@ +#include +#include + +using u32 = uint32_t; + +template +void writeBin(std::ostream& os, const T& v) { + os.write(reinterpret_cast(&v), sizeof(T)); +} + +template +void readBin(std::istream& is, T& v) { + is.read(reinterpret_cast(&v), sizeof(T)); +} + +// Spezialfall für Arrays/Blöcke +template +void writeBlock(std::ostream& os, const T* data, size_t count) { + os.write(reinterpret_cast(data), sizeof(T) * count); +} + +template +void readBlock(std::istream& is, T* data, size_t count) { + is.read(reinterpret_cast(data), sizeof(T) * count); +} + +// Spezialfall für Container +template +void writeContainer(std::ostream& os, const std::vector& v) { + u32 n = static_cast(v.size()); + writeBin(os, n); + if (n) + writeBlock(os, v.data(), n); +} + +template +void readContainer(std::istream& is, std::vector& v) { + u32 n; + readBin(is, n); + v.resize(n); + if (n) + readBlock(is, v.data(), n); +} \ No newline at end of file diff --git a/src/video_core/renderer_vulkan/shader_cache.cpp b/src/video_core/renderer_vulkan/shader_cache.cpp new file mode 100644 index 000000000..17860b4dc --- /dev/null +++ b/src/video_core/renderer_vulkan/shader_cache.cpp @@ -0,0 +1,28 @@ +#include +#include +#include + +namespace ShaderCache { + +const auto shader_cache_dir = Common::FS::GetUserPath(Common::FS::PathType::ShaderDir) / "cache"; +std::string CreateShaderID(std::ostream& info_dump, std::ostream& profile_dump) { + std::ostringstream info_stream, profile_stream; + info_stream << info_dump.rdbuf(); + profile_stream << profile_dump.rdbuf(); + + std::string combined_data = info_stream.str() + profile_stream.str(); + + std::hash hasher; + size_t shader_id = hasher(combined_data); + return std::to_string(shader_id); +} + +void GetShader{ + +} +void AddShader(std::vector spv, std::ostream& info_dump, std::ostream& profile_dump) { + + std::string spirv_cache_filename = shader_name + ".spv "; +} + +} \ No newline at end of file diff --git a/src/video_core/renderer_vulkan/shader_cache.h b/src/video_core/renderer_vulkan/shader_cache.h new file mode 100644 index 000000000..e69de29bb diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp index 49f3ba706..0d5fe8a69 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp @@ -493,13 +493,12 @@ vk::ShaderModule PipelineCache::CompileModule(Shader::Info& info, Shader::Runtim DumpShader(code, info.pgm_hash, info.stage, perm_idx, "bin"); const auto ir_program = Shader::TranslateProgram(code, pools, info, runtime_info, profile); - + std::string shader_name = GetShaderName(info.stage, info.pgm_hash, perm_idx); std::string spirv_cache_filename = shader_name + "_" + Common::g_scm_rev + ".spv "; - const auto shader_cache_dir = - Common::FS::GetUserPath(Common::FS::PathType::ShaderDir) / "cache"; + std::filesystem::path spirv_cache_file_path = shader_cache_dir / spirv_cache_filename; std::vector spv;