diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp index dcbfda2bb..72bef73dc 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp @@ -6,6 +6,7 @@ #include "common/common_paths.h" #include "common/file_util.h" #include "common/logging/log.h" +#include "core/settings.h" #include "video_core/renderer_vulkan/pica_to_vk.h" #include "video_core/renderer_vulkan/vk_instance.h" #include "video_core/renderer_vulkan/vk_pipeline_cache.h" @@ -118,7 +119,6 @@ PipelineCache::PipelineCache(const Instance& instance, TaskScheduler& scheduler, : instance{instance}, scheduler{scheduler}, renderpass_cache{renderpass_cache} { descriptor_dirty.fill(true); - LoadDiskCache(); BuildLayout(); trivial_vertex_shader = Compile(GenerateTrivialVertexShader(), vk::ShaderStageFlagBits::eVertex, instance.GetDevice(), ShaderOptimization::Debug); @@ -156,6 +156,61 @@ PipelineCache::~PipelineCache() { graphics_pipelines.clear(); } +void PipelineCache::LoadDiskCache() { + if (!Settings::values.use_disk_shader_cache || !EnsureDirectories()) { + return; + } + + const std::string cache_file_path = fmt::format("{}{:x}{:x}.bin", GetPipelineCacheDir(), + instance.GetVendorID(), instance.GetDeviceID()); + vk::PipelineCacheCreateInfo cache_info = {.initialDataSize = 0, .pInitialData = nullptr}; + + std::vector cache_data; + FileUtil::IOFile cache_file{cache_file_path, "r"}; + if (cache_file.IsOpen()) { + LOG_INFO(Render_Vulkan, "Loading pipeline cache"); + + const u64 cache_file_size = cache_file.GetSize(); + cache_data.resize(cache_file_size); + if (cache_file.ReadBytes(cache_data.data(), cache_file_size)) { + if (!IsCacheValid(cache_data.data(), cache_file_size)) { + LOG_WARNING(Render_Vulkan, "Pipeline cache provided invalid, ignoring"); + } else { + cache_info.initialDataSize = cache_file_size; + cache_info.pInitialData = cache_data.data(); + } + } + + cache_file.Close(); + } + + vk::Device device = instance.GetDevice(); + pipeline_cache = device.createPipelineCache(cache_info); +} + +void PipelineCache::SaveDiskCache() { + if (!Settings::values.use_disk_shader_cache || !EnsureDirectories()) { + return; + } + + const std::string cache_file_path = fmt::format("{}{:x}{:x}.bin", GetPipelineCacheDir(), + instance.GetVendorID(), instance.GetDeviceID()); + FileUtil::IOFile cache_file{cache_file_path, "wb"}; + if (!cache_file.IsOpen()) { + LOG_INFO(Render_Vulkan, "Unable to open pipeline cache for writing"); + return; + } + + vk::Device device = instance.GetDevice(); + auto cache_data = device.getPipelineCacheData(pipeline_cache); + if (!cache_file.WriteBytes(cache_data.data(), cache_data.size())) { + LOG_WARNING(Render_Vulkan, "Error during pipeline cache write"); + return; + } + + cache_file.Close(); +} + void PipelineCache::BindPipeline(const PipelineInfo& info) { ApplyDynamic(info); @@ -625,61 +680,6 @@ void PipelineCache::BindDescriptorSets() { RASTERIZER_SET_COUNT, descriptor_sets.data(), 0, nullptr); } -void PipelineCache::LoadDiskCache() { - if (!EnsureDirectories()) { - return; - } - - const std::string cache_file_path = fmt::format("{}{:x}{:x}.bin", GetPipelineCacheDir(), - instance.GetVendorID(), instance.GetDeviceID()); - vk::PipelineCacheCreateInfo cache_info = {.initialDataSize = 0, .pInitialData = nullptr}; - - std::vector cache_data; - FileUtil::IOFile cache_file{cache_file_path, "r"}; - if (cache_file.IsOpen()) { - LOG_INFO(Render_Vulkan, "Loading pipeline cache"); - - const u64 cache_file_size = cache_file.GetSize(); - cache_data.resize(cache_file_size); - if (cache_file.ReadBytes(cache_data.data(), cache_file_size)) { - if (!IsCacheValid(cache_data.data(), cache_file_size)) { - LOG_WARNING(Render_Vulkan, "Pipeline cache provided invalid, ignoring"); - } else { - cache_info.initialDataSize = cache_file_size; - cache_info.pInitialData = cache_data.data(); - } - } - - cache_file.Close(); - } - - vk::Device device = instance.GetDevice(); - pipeline_cache = device.createPipelineCache(cache_info); -} - -void PipelineCache::SaveDiskCache() { - if (!EnsureDirectories()) { - return; - } - - const std::string cache_file_path = fmt::format("{}{:x}{:x}.bin", GetPipelineCacheDir(), - instance.GetVendorID(), instance.GetDeviceID()); - FileUtil::IOFile cache_file{cache_file_path, "wb"}; - if (!cache_file.IsOpen()) { - LOG_INFO(Render_Vulkan, "Unable to open pipeline cache for writing"); - return; - } - - vk::Device device = instance.GetDevice(); - auto cache_data = device.getPipelineCacheData(pipeline_cache); - if (!cache_file.WriteBytes(cache_data.data(), cache_data.size())) { - LOG_WARNING(Render_Vulkan, "Error during pipeline cache write"); - return; - } - - cache_file.Close(); -} - bool PipelineCache::IsCacheValid(const u8* data, u64 size) const { if (size < sizeof(vk::PipelineCacheHeaderVersionOne)) { LOG_ERROR(Render_Vulkan, "Pipeline cache failed validation: Invalid header"); diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.h b/src/video_core/renderer_vulkan/vk_pipeline_cache.h index c186405dc..64cb68480 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_cache.h +++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.h @@ -147,6 +147,12 @@ public: RenderpassCache& renderpass_cache); ~PipelineCache(); + /// Loads the pipeline cache stored to disk + void LoadDiskCache(); + + /// Stores the generated pipeline cache to disk + void SaveDiskCache(); + /// Binds a pipeline using the provided information void BindPipeline(const PipelineInfo& info); @@ -206,12 +212,6 @@ private: /// Builds descriptor sets that reference the currently bound resources void BindDescriptorSets(); - /// Loads the pipeline cache stored to disk - void LoadDiskCache(); - - /// Stores the generated pipeline cache to disk - void SaveDiskCache(); - /// Returns true when the disk data can be used by the current driver bool IsCacheValid(const u8* data, u64 size) const; diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index acf603308..a9d66ffa8 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp @@ -202,7 +202,7 @@ RasterizerVulkan::~RasterizerVulkan() { void RasterizerVulkan::LoadDiskResources(const std::atomic_bool& stop_loading, const VideoCore::DiskResourceLoadCallback& callback) { - // shader_program_manager->LoadDiskCache(stop_loading, callback); + pipeline_cache.LoadDiskCache(); } void RasterizerVulkan::SyncEntireState() {