From 094b2a32745822b234ede30e90c18f2af671e645 Mon Sep 17 00:00:00 2001 From: CamilleLaVey Date: Thu, 4 Dec 2025 06:09:53 -0400 Subject: [PATCH] [vk] DrainPendingBuild --- src/video_core/renderer_vulkan/vk_pipeline_cache.cpp | 7 +++++++ src/video_core/renderer_vulkan/vk_pipeline_cache.h | 2 ++ src/video_core/renderer_vulkan/vk_rasterizer.cpp | 4 ++++ 3 files changed, 13 insertions(+) diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp index 1be7f8f641..1d9e3127d6 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp @@ -513,6 +513,13 @@ PipelineCache::~PipelineCache() { } } +void PipelineCache::DrainPendingBuilds() { + if (!device.HasBrokenParallelShaderCompiling()) { + return; + } + workers.WaitForRequests(); +} + GraphicsPipeline* PipelineCache::CurrentGraphicsPipeline() { if (!RefreshStages(graphics_key.unique_hashes)) { diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.h b/src/video_core/renderer_vulkan/vk_pipeline_cache.h index d4a30b026a..9a10ea4771 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_cache.h +++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.h @@ -115,6 +115,8 @@ public: void LoadDiskResources(u64 title_id, std::stop_token stop_loading, const VideoCore::DiskResourceLoadCallback& callback); + void DrainPendingBuilds(); + private: struct InFlightPipelineBuild { std::mutex mutex; diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index 51afa06327..c24ef9f0c7 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp @@ -261,6 +261,10 @@ void RasterizerVulkan::PrepareDraw(bool is_indexed, Func&& draw_func) { FlushWork(); gpu_memory->FlushCaching(); + if (device.HasBrokenParallelShaderCompiling()) { + pipeline_cache.DrainPendingBuilds(); + } + GraphicsPipeline* const pipeline{pipeline_cache.CurrentGraphicsPipeline()}; if (!pipeline) { return;