diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp index 97b7cc8b0..e61359acf 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp @@ -84,8 +84,9 @@ PipelineCache::PipelineCache(const Instance& instance_, Scheduler& scheduler_, RenderManager& renderpass_cache_, DescriptorUpdateQueue& update_queue_) : instance{instance_}, scheduler{scheduler_}, renderpass_cache{renderpass_cache_}, update_queue{update_queue_}, - num_worker_threads{std::max(std::thread::hardware_concurrency(), 2U) >> 1}, - workers{num_worker_threads, "Pipeline workers"}, + num_worker_threads{std::max(std::thread::hardware_concurrency(), 2U) / 2}, + pipeline_workers{num_worker_threads, "Pipeline workers"}, + shader_workers{num_worker_threads, "Shader workers"}, descriptor_heaps{ DescriptorHeap{instance, scheduler.GetMasterSemaphore(), BUFFER_BINDINGS, 32}, DescriptorHeap{instance, scheduler.GetMasterSemaphore(), TEXTURE_BINDINGS<1>}, @@ -144,7 +145,8 @@ void PipelineCache::BuildLayout() { } PipelineCache::~PipelineCache() { - workers.WaitForRequests(); + pipeline_workers.WaitForRequests(); + shader_workers.WaitForRequests(); SaveDriverPipelineDiskCache(); } diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.h b/src/video_core/renderer_vulkan/vk_pipeline_cache.h index 111960073..8222391b6 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_cache.h +++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.h @@ -147,7 +147,8 @@ private: vk::UniquePipelineCache driver_pipeline_cache; vk::UniquePipelineLayout pipeline_layout; std::size_t num_worker_threads; - Common::ThreadWorker workers; + Common::ThreadWorker pipeline_workers; + Common::ThreadWorker shader_workers; PipelineInfo current_info{}; GraphicsPipeline* current_pipeline{}; std::array descriptor_heaps; diff --git a/src/video_core/renderer_vulkan/vk_shader_disk_cache.cpp b/src/video_core/renderer_vulkan/vk_shader_disk_cache.cpp index fd8809443..b45e4677c 100644 --- a/src/video_core/renderer_vulkan/vk_shader_disk_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_shader_disk_cache.cpp @@ -123,7 +123,7 @@ std::optional> ShaderDiskCache::UseProgrammableVer shader.program = std::move(program); const vk::Device device = parent.instance.GetDevice(); - parent.workers.QueueWork([device, &shader, this, spirv_id] { + parent.shader_workers.QueueWork([device, &shader, this, spirv_id] { auto spirv = CompileGLSL(shader.program, vk::ShaderStageFlagBits::eVertex); AppendVSSPIRV(vs_cache, spirv, spirv_id); shader.program.clear(); @@ -157,7 +157,7 @@ std::optional> ShaderDiskCache::UseFragmentShader( if (new_shader) { LOG_NEW_OBJECT(Render_Vulkan, "New FS config {:016X}", fs_config_hash); - parent.workers.QueueWork([fs_config, user, this, &shader, fs_config_hash]() { + parent.shader_workers.QueueWork([fs_config, user, this, &shader, fs_config_hash]() { std::vector spirv; const bool use_spirv = parent.profile.vk_use_spirv_generator; if (use_spirv && !fs_config.UsesSpirvIncompatibleConfig()) { @@ -212,7 +212,7 @@ std::optional> ShaderDiskCache::UseFixedGeometrySh if (new_shader) { LOG_NEW_OBJECT(Render_Vulkan, "New GS config {:016X}", gs_config_hash); - parent.workers.QueueWork([gs_config, this, &shader, gs_config_hash]() { + parent.shader_workers.QueueWork([gs_config, this, &shader, gs_config_hash]() { ExtraFixedGSConfig extra; extra.use_clip_planes = parent.profile.has_clip_planes; extra.separable_shader = true; @@ -252,7 +252,7 @@ GraphicsPipeline* ShaderDiskCache::GetPipeline(const PipelineInfo& info) { } it.value() = std::make_unique( parent.instance, parent.renderpass_cache, info, *parent.driver_pipeline_cache, - *parent.pipeline_layout, parent.current_shaders, &parent.workers); + *parent.pipeline_layout, parent.current_shaders, &parent.pipeline_workers); } if (known_graphic_pipelines.emplace(hash).second) { @@ -1454,7 +1454,7 @@ bool ShaderDiskCache::InitPLCache(const std::atomic_bool& stop_loading, auto [it_pl, _] = graphics_pipelines.try_emplace(pl_hash_opt); it_pl.value() = std::make_unique( parent.instance, parent.renderpass_cache, info, *parent.driver_pipeline_cache, - *parent.pipeline_layout, shaders, &parent.workers); + *parent.pipeline_layout, shaders, &parent.pipeline_workers); it_pl.value()->TryBuild(false);