Created
June 26, 2023 18:39
-
-
Save jonahwilliams/77d1f10faf3c9443715c02e6842adac1 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/impeller/renderer/backend/vulkan/swapchain_impl_vk.cc b/impeller/renderer/backend/vulkan/swapchain_impl_vk.cc | |
index af52870ba9..fcea92a521 100644 | |
--- a/impeller/renderer/backend/vulkan/swapchain_impl_vk.cc | |
+++ b/impeller/renderer/backend/vulkan/swapchain_impl_vk.cc | |
@@ -197,7 +197,7 @@ SwapchainImplVK::SwapchainImplVK(const std::shared_ptr<Context>& context, | |
); | |
swapchain_info.imageArrayLayers = 1u; | |
swapchain_info.imageUsage = vk::ImageUsageFlagBits::eColorAttachment; | |
- swapchain_info.preTransform = caps.currentTransform; | |
+ swapchain_info.preTransform = vk::SurfaceTransformFlagBitsKHR::eIdentity; // caps.currentTransform; | |
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 | |
@@ -448,6 +448,10 @@ bool SwapchainImplVK::Present(const std::shared_ptr<SwapchainImageVK>& image, | |
// successfully. | |
[[fallthrough]]; | |
case vk::Result::eSuccess: | |
+ did_rotate_ = false; | |
+ return true; | |
+ case vk::Result::eSuboptimalKHR: | |
+ did_rotate_ = 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 0df1a2f7a2..b6660cc7ed 100644 | |
--- a/impeller/renderer/backend/vulkan/swapchain_impl_vk.h | |
+++ b/impeller/renderer/backend/vulkan/swapchain_impl_vk.h | |
@@ -53,6 +53,10 @@ class SwapchainImplVK final | |
std::shared_ptr<Context> GetContext() const; | |
+ bool GetDidRotate() const { | |
+ return did_rotate_; | |
+ } | |
+ | |
std::pair<vk::UniqueSurfaceKHR, vk::UniqueSwapchainKHR> DestroySwapchain(); | |
private: | |
@@ -65,6 +69,7 @@ class SwapchainImplVK final | |
std::vector<std::unique_ptr<FrameSynchronizer>> synchronizers_; | |
size_t current_frame_ = 0u; | |
bool is_valid_ = false; | |
+ bool did_rotate_ = false; | |
SwapchainImplVK(const std::shared_ptr<Context>& context, | |
vk::UniqueSurfaceKHR surface, | |
diff --git a/impeller/renderer/backend/vulkan/swapchain_vk.cc b/impeller/renderer/backend/vulkan/swapchain_vk.cc | |
index 0bc6f9aca2..2e2daddc47 100644 | |
--- a/impeller/renderer/backend/vulkan/swapchain_vk.cc | |
+++ b/impeller/renderer/backend/vulkan/swapchain_vk.cc | |
@@ -35,9 +35,11 @@ std::unique_ptr<Surface> SwapchainVK::AcquireNextDrawable() { | |
TRACE_EVENT0("impeller", __FUNCTION__); | |
- auto result = impl_->AcquireNextDrawable(); | |
- if (!result.out_of_date) { | |
- return std::move(result.surface); | |
+ if (!impl_->GetDidRotate()) { | |
+ auto result = impl_->AcquireNextDrawable(); | |
+ if (!result.out_of_date) { | |
+ return std::move(result.surface); | |
+ } | |
} | |
TRACE_EVENT0("impeller", "RecreateSwapchain"); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment