From 4b0f581973376c4c0bdd2646b3a4317eb5adfab9 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 ae1f0dbd41..5efe9dde3f 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp @@ -522,6 +522,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 9388d46e56..1faa5c833b 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp @@ -244,6 +244,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;