summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author silence_dogood <adsrini@google.com> 2019-05-24 16:14:54 -0700
committer android-build-merger <android-build-merger@google.com> 2019-05-24 16:14:54 -0700
commit3da592178bf331b0a9212e2f6d6f713fabb4cf5a (patch)
tree900156eaa1fe72910c91572eb785d5885c5c5ef0
parentde9b9501e104153f0450b0fcef7ea539a5613d0f (diff)
parent5cada23f2182901c5eb63455581f829910a0e448 (diff)
Merge "Vulkan: Fixing return code for vkQueuePresentKHR" into qt-dev
am: 5cada23f21 Change-Id: I8e8c8e33a6b1ed348a8726cbec1ce51a69abbf8d
-rw-r--r--vulkan/libvulkan/swapchain.cpp40
1 files changed, 36 insertions, 4 deletions
diff --git a/vulkan/libvulkan/swapchain.cpp b/vulkan/libvulkan/swapchain.cpp
index e5f40aa84a..a8949d36f4 100644
--- a/vulkan/libvulkan/swapchain.cpp
+++ b/vulkan/libvulkan/swapchain.cpp
@@ -55,6 +55,22 @@ const VkSurfaceTransformFlagsKHR kSupportedTransforms =
// VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_270_BIT_KHR |
VK_SURFACE_TRANSFORM_INHERIT_BIT_KHR;
+int TranslateVulkanToNativeTransform(VkSurfaceTransformFlagBitsKHR transform) {
+ switch (transform) {
+ // TODO: See TODO in TranslateNativeToVulkanTransform
+ case VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR:
+ return NATIVE_WINDOW_TRANSFORM_ROT_90;
+ case VK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHR:
+ return NATIVE_WINDOW_TRANSFORM_ROT_180;
+ case VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR:
+ return NATIVE_WINDOW_TRANSFORM_ROT_270;
+ case VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR:
+ case VK_SURFACE_TRANSFORM_INHERIT_BIT_KHR:
+ default:
+ return 0;
+ }
+}
+
VkSurfaceTransformFlagBitsKHR TranslateNativeToVulkanTransform(int native) {
// Native and Vulkan transforms are isomorphic, but are represented
// differently. Vulkan transforms are built up of an optional horizontal
@@ -210,10 +226,12 @@ enum { MIN_NUM_FRAMES_AGO = 5 };
struct Swapchain {
Swapchain(Surface& surface_,
uint32_t num_images_,
- VkPresentModeKHR present_mode)
+ VkPresentModeKHR present_mode,
+ int pre_transform_)
: surface(surface_),
num_images(num_images_),
mailbox_mode(present_mode == VK_PRESENT_MODE_MAILBOX_KHR),
+ pre_transform(pre_transform_),
frame_timestamps_enabled(false),
shared(present_mode == VK_PRESENT_MODE_SHARED_DEMAND_REFRESH_KHR ||
present_mode == VK_PRESENT_MODE_SHARED_CONTINUOUS_REFRESH_KHR) {
@@ -235,6 +253,7 @@ struct Swapchain {
Surface& surface;
uint32_t num_images;
bool mailbox_mode;
+ int pre_transform;
bool frame_timestamps_enabled;
int64_t refresh_duration;
bool shared;
@@ -1237,9 +1256,9 @@ VkResult CreateSwapchainKHR(VkDevice device,
VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
if (!mem)
return VK_ERROR_OUT_OF_HOST_MEMORY;
- Swapchain* swapchain =
- new (mem) Swapchain(surface, num_images, create_info->presentMode);
-
+ Swapchain* swapchain = new (mem)
+ Swapchain(surface, num_images, create_info->presentMode,
+ TranslateVulkanToNativeTransform(create_info->preTransform));
// -- Dequeue all buffers and create a VkImage for each --
// Any failures during or after this must cancel the dequeued buffers.
@@ -1713,6 +1732,19 @@ VkResult QueuePresentKHR(VkQueue queue, const VkPresentInfoKHR* present_info) {
ReleaseSwapchainImage(device, window, fence, img);
OrphanSwapchain(device, &swapchain);
}
+ int window_transform_hint;
+ err = window->query(window, NATIVE_WINDOW_TRANSFORM_HINT,
+ &window_transform_hint);
+ if (err != 0) {
+ ALOGE("NATIVE_WINDOW_TRANSFORM_HINT query failed: %s (%d)",
+ strerror(-err), err);
+ swapchain_result = WorstPresentResult(
+ swapchain_result, VK_ERROR_SURFACE_LOST_KHR);
+ }
+ if (swapchain.pre_transform != window_transform_hint) {
+ swapchain_result =
+ WorstPresentResult(swapchain_result, VK_SUBOPTIMAL_KHR);
+ }
} else {
ReleaseSwapchainImage(device, nullptr, fence, img);
swapchain_result = VK_ERROR_OUT_OF_DATE_KHR;