From 48b9286626d5eef43228f0d787aaff05fcb06d9b Mon Sep 17 00:00:00 2001 From: jonahwilliams Date: Mon, 23 Oct 2023 21:32:07 -0700 Subject: [PATCH 1/4] [Impeller] adjustments to submitKHR and queries. --- impeller/renderer/backend/vulkan/context_vk.cc | 13 +++++++++++++ impeller/renderer/backend/vulkan/context_vk.h | 13 +++++++++++++ impeller/renderer/backend/vulkan/gpu_tracer_vk.cc | 2 +- .../renderer/backend/vulkan/swapchain_impl_vk.cc | 2 +- impeller/renderer/context.h | 4 +++- 5 files changed, 31 insertions(+), 3 deletions(-) diff --git a/impeller/renderer/backend/vulkan/context_vk.cc b/impeller/renderer/backend/vulkan/context_vk.cc index 8204f5965e39f..08037c0be9a6d 100644 --- a/impeller/renderer/backend/vulkan/context_vk.cc +++ b/impeller/renderer/backend/vulkan/context_vk.cc @@ -3,6 +3,7 @@ // found in the LICENSE file. #include "impeller/renderer/backend/vulkan/context_vk.h" +#include "fml/concurrent_message_loop.h" #ifdef FML_OS_ANDROID #include @@ -128,6 +129,12 @@ void ContextVK::Setup(Settings settings) { return; } + submit_message_loop_ = fml::ConcurrentMessageLoop::Create(1u); + submit_message_loop_->PostTaskToAllWorkers([]() { + // submitKHR is extremely cheap and mostly blocks on an internal fence. + fml::RequestAffinity(fml::CpuAffinity::kEfficiency); + }); + raster_message_loop_ = fml::ConcurrentMessageLoop::Create( std::min(4u, std::thread::hardware_concurrency())); raster_message_loop_->PostTaskToAllWorkers([]() { @@ -486,6 +493,11 @@ const vk::Device& ContextVK::GetDevice() const { return device_holder_->device.get(); } +const std::shared_ptr +ContextVK::GetSubmitTaskRunner() const { + return submit_message_loop_->GetTaskRunner(); +} + const std::shared_ptr ContextVK::GetConcurrentWorkerTaskRunner() const { return raster_message_loop_->GetTaskRunner(); @@ -500,6 +512,7 @@ void ContextVK::Shutdown() { fence_waiter_.reset(); resource_manager_.reset(); + submit_message_loop_->Terminate(); raster_message_loop_->Terminate(); } diff --git a/impeller/renderer/backend/vulkan/context_vk.h b/impeller/renderer/backend/vulkan/context_vk.h index 0febc8b03da15..92a0831c43f28 100644 --- a/impeller/renderer/backend/vulkan/context_vk.h +++ b/impeller/renderer/backend/vulkan/context_vk.h @@ -133,6 +133,18 @@ class ContextVK final : public Context, const std::shared_ptr GetConcurrentWorkerTaskRunner() const; + /// @brief A single-threaded task runner that should only be used for + /// submitKHR. + /// + /// SubmitKHR will block until all previously submitted command buffers have + /// been scheduled. If there are no platform views in the scene (excluding + /// texture backed platform views). Then it is safe for SwapchainImpl::Present + /// to return before submit has completed. To do so, we offload the submit + /// command to a specialized single threaded task runner. The single thread + /// ensures that we do not queue up too much work and that the submissions + /// proceed in order. + const std::shared_ptr GetSubmitTaskRunner() const; + std::shared_ptr CreateSurfaceContext(); const std::shared_ptr& GetGraphicsQueue() const; @@ -176,6 +188,7 @@ class ContextVK final : public Context, std::shared_ptr command_pool_recycler_; std::string device_name_; std::shared_ptr raster_message_loop_; + std::shared_ptr submit_message_loop_; std::shared_ptr gpu_tracer_; bool sync_presentation_ = false; diff --git a/impeller/renderer/backend/vulkan/gpu_tracer_vk.cc b/impeller/renderer/backend/vulkan/gpu_tracer_vk.cc index ea738ad269ce4..921677408697c 100644 --- a/impeller/renderer/backend/vulkan/gpu_tracer_vk.cc +++ b/impeller/renderer/backend/vulkan/gpu_tracer_vk.cc @@ -16,7 +16,7 @@ namespace impeller { -static constexpr uint32_t kPoolSize = 64u; +static constexpr uint32_t kPoolSize = 1024u; GPUTracerVK::GPUTracerVK(const std::shared_ptr& device_holder) : device_holder_(device_holder) { diff --git a/impeller/renderer/backend/vulkan/swapchain_impl_vk.cc b/impeller/renderer/backend/vulkan/swapchain_impl_vk.cc index eb089e44ec45d..60f471f969ac9 100644 --- a/impeller/renderer/backend/vulkan/swapchain_impl_vk.cc +++ b/impeller/renderer/backend/vulkan/swapchain_impl_vk.cc @@ -522,7 +522,7 @@ bool SwapchainImplVK::Present(const std::shared_ptr& image, if (context.GetSyncPresentation()) { task(); } else { - context.GetConcurrentWorkerTaskRunner()->PostTask(task); + context.GetSubmitTaskRunner()->PostTask(task); } return true; } diff --git a/impeller/renderer/context.h b/impeller/renderer/context.h index 3d0cb9d97ad6e..45cb62cbaeb78 100644 --- a/impeller/renderer/context.h +++ b/impeller/renderer/context.h @@ -175,7 +175,9 @@ class Context { /// /// This is required for correct rendering on Android when using /// the hybrid composition mode. This has no effect on other - /// backends. + /// backends. This is analogous to the check for isMainThread in + /// surface_mtl.mm to block presentation on scheduling of all + /// pending work. virtual void SetSyncPresentation(bool value) {} //---------------------------------------------------------------------------- From c0382ba06a8fd26356e2fd8e37f32db91f835db5 Mon Sep 17 00:00:00 2001 From: jonahwilliams Date: Mon, 23 Oct 2023 22:12:46 -0700 Subject: [PATCH 2/4] ++ --- impeller/renderer/backend/vulkan/context_vk.cc | 12 ++++++------ impeller/renderer/backend/vulkan/context_vk.h | 5 +++-- .../renderer/backend/vulkan/swapchain_impl_vk.cc | 2 +- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/impeller/renderer/backend/vulkan/context_vk.cc b/impeller/renderer/backend/vulkan/context_vk.cc index 08037c0be9a6d..b21802e02185e 100644 --- a/impeller/renderer/backend/vulkan/context_vk.cc +++ b/impeller/renderer/backend/vulkan/context_vk.cc @@ -129,8 +129,8 @@ void ContextVK::Setup(Settings settings) { return; } - submit_message_loop_ = fml::ConcurrentMessageLoop::Create(1u); - submit_message_loop_->PostTaskToAllWorkers([]() { + queue_submit_thread_ = std::make_unique("QueueSubmitThread"); + queue_submit_thread_->GetTaskRunner()->PostTask([]() { // submitKHR is extremely cheap and mostly blocks on an internal fence. fml::RequestAffinity(fml::CpuAffinity::kEfficiency); }); @@ -493,9 +493,9 @@ const vk::Device& ContextVK::GetDevice() const { return device_holder_->device.get(); } -const std::shared_ptr -ContextVK::GetSubmitTaskRunner() const { - return submit_message_loop_->GetTaskRunner(); +const fml::RefPtr ContextVK::GetQueueSubmitRunner() + const { + return queue_submit_thread_->GetTaskRunner(); } const std::shared_ptr @@ -512,7 +512,7 @@ void ContextVK::Shutdown() { fence_waiter_.reset(); resource_manager_.reset(); - submit_message_loop_->Terminate(); + queue_submit_thread_->Join(); raster_message_loop_->Terminate(); } diff --git a/impeller/renderer/backend/vulkan/context_vk.h b/impeller/renderer/backend/vulkan/context_vk.h index 92a0831c43f28..b4cc241c7e475 100644 --- a/impeller/renderer/backend/vulkan/context_vk.h +++ b/impeller/renderer/backend/vulkan/context_vk.h @@ -10,6 +10,7 @@ #include "flutter/fml/macros.h" #include "flutter/fml/mapping.h" #include "flutter/fml/unique_fd.h" +#include "fml/thread.h" #include "impeller/base/backend_cast.h" #include "impeller/core/formats.h" #include "impeller/renderer/backend/vulkan/command_pool_vk.h" @@ -143,7 +144,7 @@ class ContextVK final : public Context, /// command to a specialized single threaded task runner. The single thread /// ensures that we do not queue up too much work and that the submissions /// proceed in order. - const std::shared_ptr GetSubmitTaskRunner() const; + const fml::RefPtr GetQueueSubmitRunner() const; std::shared_ptr CreateSurfaceContext(); @@ -188,7 +189,7 @@ class ContextVK final : public Context, std::shared_ptr command_pool_recycler_; std::string device_name_; std::shared_ptr raster_message_loop_; - std::shared_ptr submit_message_loop_; + std::unique_ptr queue_submit_thread_; std::shared_ptr gpu_tracer_; bool sync_presentation_ = false; diff --git a/impeller/renderer/backend/vulkan/swapchain_impl_vk.cc b/impeller/renderer/backend/vulkan/swapchain_impl_vk.cc index 60f471f969ac9..3063451f570ad 100644 --- a/impeller/renderer/backend/vulkan/swapchain_impl_vk.cc +++ b/impeller/renderer/backend/vulkan/swapchain_impl_vk.cc @@ -522,7 +522,7 @@ bool SwapchainImplVK::Present(const std::shared_ptr& image, if (context.GetSyncPresentation()) { task(); } else { - context.GetSubmitTaskRunner()->PostTask(task); + context.GetQueueSubmitRunner()->PostTask(task); } return true; } From 688d12dc8a11fd8e241f34e0c501ed9e2f46412c Mon Sep 17 00:00:00 2001 From: jonahwilliams Date: Mon, 23 Oct 2023 22:13:07 -0700 Subject: [PATCH 3/4] ++ --- impeller/renderer/backend/vulkan/context_vk.cc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/impeller/renderer/backend/vulkan/context_vk.cc b/impeller/renderer/backend/vulkan/context_vk.cc index b21802e02185e..0eb60eb6189b0 100644 --- a/impeller/renderer/backend/vulkan/context_vk.cc +++ b/impeller/renderer/backend/vulkan/context_vk.cc @@ -493,8 +493,7 @@ const vk::Device& ContextVK::GetDevice() const { return device_holder_->device.get(); } -const fml::RefPtr ContextVK::GetQueueSubmitRunner() - const { +const fml::RefPtr ContextVK::GetQueueSubmitRunner() const { return queue_submit_thread_->GetTaskRunner(); } From 502f1fe2c482c3d75806fc2c98e6264de893fdab Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Mon, 23 Oct 2023 22:23:23 -0700 Subject: [PATCH 4/4] Update context_vk.cc --- impeller/renderer/backend/vulkan/context_vk.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/impeller/renderer/backend/vulkan/context_vk.cc b/impeller/renderer/backend/vulkan/context_vk.cc index 0eb60eb6189b0..d57018ffdc523 100644 --- a/impeller/renderer/backend/vulkan/context_vk.cc +++ b/impeller/renderer/backend/vulkan/context_vk.cc @@ -3,6 +3,7 @@ // found in the LICENSE file. #include "impeller/renderer/backend/vulkan/context_vk.h" + #include "fml/concurrent_message_loop.h" #ifdef FML_OS_ANDROID