diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp index 3867bbb8e0..668dad397b 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp @@ -779,6 +779,7 @@ GraphicsPipeline* PipelineCache::BuiltPipeline(GraphicsPipeline* pipeline) const if (draw_state.index_buffer.count <= 6 || draw_state.vertex_buffer.count <= 6) { return pipeline; } + scheduler.KeepAliveTick(); return nullptr; } diff --git a/src/video_core/renderer_vulkan/vk_scheduler.cpp b/src/video_core/renderer_vulkan/vk_scheduler.cpp index 2c9f2e2e3e..7a05feef34 100644 --- a/src/video_core/renderer_vulkan/vk_scheduler.cpp +++ b/src/video_core/renderer_vulkan/vk_scheduler.cpp @@ -4,6 +4,7 @@ // SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later +#include #include #include #include @@ -92,6 +93,14 @@ void Scheduler::WaitWorker() { std::scoped_lock el{execution_mutex}; } +void Scheduler::KeepAliveTick() { + const auto now = Clock::now(); + if (now - last_submission_time < KEEPALIVE_INTERVAL) { + return; + } + Flush(); +} + void Scheduler::DispatchWork() { if (chunk->Empty()) { return; @@ -300,6 +309,7 @@ u64 Scheduler::SubmitExecution(VkSemaphore signal_semaphore, VkSemaphore wait_se }); chunk->MarkSubmit(); DispatchWork(); + last_submission_time = Clock::now(); return signal_value; } diff --git a/src/video_core/renderer_vulkan/vk_scheduler.h b/src/video_core/renderer_vulkan/vk_scheduler.h index 0709c3a370..d7683ffad0 100644 --- a/src/video_core/renderer_vulkan/vk_scheduler.h +++ b/src/video_core/renderer_vulkan/vk_scheduler.h @@ -6,6 +6,7 @@ #pragma once +#include #include #include #include @@ -53,6 +54,9 @@ public: /// safe to touch worker resources. void WaitWorker(); + /// Submits a tiny chunk of work if recent GPU submissions are stale. + void KeepAliveTick(); + /// Sends currently recorded work to the worker thread. void DispatchWork(); @@ -159,6 +163,8 @@ public: std::mutex submit_mutex; private: + using Clock = std::chrono::steady_clock; + class Command { public: virtual ~Command() = default; @@ -281,6 +287,9 @@ private: State state; + Clock::time_point last_submission_time{Clock::time_point::min()}; + static constexpr std::chrono::milliseconds KEEPALIVE_INTERVAL{4}; + u32 num_renderpass_images = 0; std::array renderpass_images{}; std::array renderpass_image_ranges{};