diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp index eb73f02600..4dd7d19d51 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp @@ -715,6 +715,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 ecdd33acfa..bd5dab70c6 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 @@ -78,6 +79,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; @@ -271,6 +280,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 5216a436c8..8e1421c10c 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 @@ -52,6 +53,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(); @@ -128,6 +132,8 @@ public: std::mutex submit_mutex; private: + using Clock = std::chrono::steady_clock; + class Command { public: virtual ~Command() = default; @@ -250,6 +256,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{};