Skip to content

Instantly share code, notes, and snippets.

@jonahwilliams
Created June 26, 2023 18:39
Show Gist options
  • Save jonahwilliams/77d1f10faf3c9443715c02e6842adac1 to your computer and use it in GitHub Desktop.
Save jonahwilliams/77d1f10faf3c9443715c02e6842adac1 to your computer and use it in GitHub Desktop.
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