Merge "libvulkan: Un-revert and fix VK_PRESENT_MODE_MAILBOX_KHR" into nyc-dev
diff --git a/vulkan/libvulkan/swapchain.cpp b/vulkan/libvulkan/swapchain.cpp
index 3bd9db2..f9158a5 100644
--- a/vulkan/libvulkan/swapchain.cpp
+++ b/vulkan/libvulkan/swapchain.cpp
@@ -350,8 +350,10 @@
"swapchain re-creation not yet implemented");
ALOGE_IF(create_info->preTransform != VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR,
"swapchain preTransform not yet implemented");
- ALOGE_IF(create_info->presentMode != VK_PRESENT_MODE_FIFO_KHR,
- "present modes other than FIFO are not yet implemented");
+ ALOGW_IF(!(create_info->presentMode == VK_PRESENT_MODE_FIFO_KHR ||
+ create_info->presentMode == VK_PRESENT_MODE_MAILBOX_KHR),
+ "swapchain present mode %d not supported",
+ create_info->presentMode);
// -- Configure the native window --
@@ -390,6 +392,13 @@
ALOGE("window->query failed: %s (%d)", strerror(-err), err);
return VK_ERROR_INITIALIZATION_FAILED;
}
+ // The MIN_UNDEQUEUED_BUFFERS query doesn't know whether we'll be using
+ // async mode or not, and assumes not. But in async mode, the BufferQueue
+ // requires an extra undequeued buffer.
+ // See BufferQueueCore::getMinUndequeuedBufferCountLocked().
+ if (create_info->presentMode == VK_PRESENT_MODE_MAILBOX_KHR)
+ min_undequeued_buffers += 1;
+
uint32_t num_images =
(create_info->minImageCount - 1) + min_undequeued_buffers;
err = native_window_set_buffer_count(surface.window.get(), num_images);
@@ -422,6 +431,17 @@
return VK_ERROR_INITIALIZATION_FAILED;
}
+ err = surface.window->setSwapInterval(
+ surface.window.get(),
+ create_info->presentMode == VK_PRESENT_MODE_MAILBOX_KHR ? 0 : 1);
+ if (err != 0) {
+ // TODO(jessehall): Improve error reporting. Can we enumerate possible
+ // errors and translate them to valid Vulkan result codes?
+ ALOGE("native_window->setSwapInterval failed: %s (%d)", strerror(-err),
+ err);
+ return VK_ERROR_INITIALIZATION_FAILED;
+ }
+
// -- Allocate our Swapchain object --
// After this point, we must deallocate the swapchain on error.