From e7d53602eb6c3e7d29e65c31d6b98c3162cbecec Mon Sep 17 00:00:00 2001 From: jonahwilliams Date: Mon, 26 Jun 2023 13:22:26 -0700 Subject: [PATCH 1/2] [Impeller] treat suboptimalkhr as rotated. --- .../backend/vulkan/swapchain_impl_vk.cc | 18 +++++++++++++++--- .../backend/vulkan/swapchain_impl_vk.h | 7 +++++++ .../renderer/backend/vulkan/swapchain_vk.cc | 5 ++++- 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/impeller/renderer/backend/vulkan/swapchain_impl_vk.cc b/impeller/renderer/backend/vulkan/swapchain_impl_vk.cc index af52870ba9840..abfdae5836ba3 100644 --- a/impeller/renderer/backend/vulkan/swapchain_impl_vk.cc +++ b/impeller/renderer/backend/vulkan/swapchain_impl_vk.cc @@ -124,13 +124,15 @@ static std::optional ChoosePresentQueue( std::shared_ptr SwapchainImplVK::Create( const std::shared_ptr& context, vk::UniqueSurfaceKHR surface, + bool was_rotated, vk::SwapchainKHR old_swapchain) { - return std::shared_ptr( - new SwapchainImplVK(context, std::move(surface), old_swapchain)); + return std::shared_ptr(new SwapchainImplVK( + context, std::move(surface), was_rotated, old_swapchain)); } SwapchainImplVK::SwapchainImplVK(const std::shared_ptr& context, vk::UniqueSurfaceKHR surface, + bool was_rotated, vk::SwapchainKHR old_swapchain) { if (!context) { return; @@ -197,7 +199,7 @@ SwapchainImplVK::SwapchainImplVK(const std::shared_ptr& context, ); swapchain_info.imageArrayLayers = 1u; swapchain_info.imageUsage = vk::ImageUsageFlagBits::eColorAttachment; - swapchain_info.preTransform = caps.currentTransform; + swapchain_info.preTransform = vk::SurfaceTransformFlagBitsKHR::eIdentity; swapchain_info.compositeAlpha = composite.value(); // If we set the clipped value to true, Vulkan expects we will never read back // from the buffer. This is analogous to [CAMetalLayer framebufferOnly] in @@ -273,6 +275,8 @@ SwapchainImplVK::SwapchainImplVK(const std::shared_ptr& context, synchronizers_ = std::move(synchronizers); current_frame_ = synchronizers_.size() - 1u; is_valid_ = true; + was_rotated_ = was_rotated; + is_rotated_ = was_rotated; } SwapchainImplVK::~SwapchainImplVK() { @@ -314,6 +318,10 @@ SwapchainImplVK::AcquireResult SwapchainImplVK::AcquireNextDrawable() { return {}; } + if (was_rotated_ != is_rotated_) { + return AcquireResult{true /* out of date */}; + } + const auto& context = ContextVK::Cast(*context_strong); current_frame_ = (current_frame_ + 1u) % synchronizers_.size(); @@ -448,6 +456,10 @@ bool SwapchainImplVK::Present(const std::shared_ptr& image, // successfully. [[fallthrough]]; case vk::Result::eSuccess: + is_rotated_ = false; + return true; + case vk::Result::eSuboptimalKHR: + is_rotated_ = true; return true; default: VALIDATION_LOG << "Could not present queue: " << vk::to_string(result); diff --git a/impeller/renderer/backend/vulkan/swapchain_impl_vk.h b/impeller/renderer/backend/vulkan/swapchain_impl_vk.h index 0df1a2f7a200c..7f061971acc1b 100644 --- a/impeller/renderer/backend/vulkan/swapchain_impl_vk.h +++ b/impeller/renderer/backend/vulkan/swapchain_impl_vk.h @@ -31,6 +31,7 @@ class SwapchainImplVK final static std::shared_ptr Create( const std::shared_ptr& context, vk::UniqueSurfaceKHR surface, + bool was_rotated, vk::SwapchainKHR old_swapchain = VK_NULL_HANDLE); ~SwapchainImplVK(); @@ -47,6 +48,8 @@ class SwapchainImplVK final : surface(std::move(p_surface)) {} }; + bool GetIsRotated() const { return is_rotated_; } + AcquireResult AcquireNextDrawable(); vk::Format GetSurfaceFormat() const; @@ -66,8 +69,12 @@ class SwapchainImplVK final size_t current_frame_ = 0u; bool is_valid_ = false; + bool was_rotated_ = false; + bool is_rotated_ = false; + SwapchainImplVK(const std::shared_ptr& context, vk::UniqueSurfaceKHR surface, + bool was_rotated, vk::SwapchainKHR old_swapchain); bool Present(const std::shared_ptr& image, uint32_t index); diff --git a/impeller/renderer/backend/vulkan/swapchain_vk.cc b/impeller/renderer/backend/vulkan/swapchain_vk.cc index 0bc6f9aca2ed3..ee958a44003c8 100644 --- a/impeller/renderer/backend/vulkan/swapchain_vk.cc +++ b/impeller/renderer/backend/vulkan/swapchain_vk.cc @@ -12,7 +12,8 @@ namespace impeller { std::shared_ptr SwapchainVK::Create( const std::shared_ptr& context, vk::UniqueSurfaceKHR surface) { - auto impl = SwapchainImplVK::Create(context, std::move(surface)); + auto impl = SwapchainImplVK::Create(context, std::move(surface), + /*was_rotated=*/false); if (!impl || !impl->IsValid()) { return nullptr; } @@ -45,10 +46,12 @@ std::unique_ptr SwapchainVK::AcquireNextDrawable() { // This swapchain implementation indicates that it is out of date. Tear it // down and make a new one. auto context = impl_->GetContext(); + auto was_rotated = impl_->GetIsRotated(); auto [surface, old_swapchain] = impl_->DestroySwapchain(); auto new_impl = SwapchainImplVK::Create(context, // std::move(surface), // + was_rotated, // *old_swapchain // ); if (!new_impl || !new_impl->IsValid()) { From a0df46add166202fe68a853391d379e69ddc7c18 Mon Sep 17 00:00:00 2001 From: jonahwilliams Date: Mon, 26 Jun 2023 13:36:20 -0700 Subject: [PATCH 2/2] mark rotated in AcquireNextDrawable too. --- impeller/renderer/backend/vulkan/swapchain_impl_vk.cc | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/impeller/renderer/backend/vulkan/swapchain_impl_vk.cc b/impeller/renderer/backend/vulkan/swapchain_impl_vk.cc index abfdae5836ba3..85b39a756699e 100644 --- a/impeller/renderer/backend/vulkan/swapchain_impl_vk.cc +++ b/impeller/renderer/backend/vulkan/swapchain_impl_vk.cc @@ -346,8 +346,12 @@ SwapchainImplVK::AcquireResult SwapchainImplVK::AcquireNextDrawable() { nullptr // fence ); - if (acq_result == vk::Result::eSuboptimalKHR || - acq_result == vk::Result::eErrorOutOfDateKHR) { + if (acq_result == vk::Result::eSuboptimalKHR) { + is_rotated_ = true; + return AcquireResult{true /* out of date */}; + } + + if (acq_result == vk::Result::eErrorOutOfDateKHR) { return AcquireResult{true /* out of date */}; }