diff options
Diffstat (limited to 'vulkan/libvulkan/swapchain.cpp')
| -rw-r--r-- | vulkan/libvulkan/swapchain.cpp | 32 |
1 files changed, 28 insertions, 4 deletions
diff --git a/vulkan/libvulkan/swapchain.cpp b/vulkan/libvulkan/swapchain.cpp index 1815c46f8a..9c6d19f5ec 100644 --- a/vulkan/libvulkan/swapchain.cpp +++ b/vulkan/libvulkan/swapchain.cpp @@ -19,6 +19,8 @@ #include <android/hardware/graphics/common/1.0/types.h> #include <grallocusage/GrallocUsageConversion.h> #include <graphicsenv/GraphicsEnv.h> +#include <hardware/gralloc.h> +#include <hardware/gralloc1.h> #include <log/log.h> #include <sync/sync.h> #include <system/window.h> @@ -42,6 +44,26 @@ namespace driver { namespace { +static uint64_t convertGralloc1ToBufferUsage(uint64_t producerUsage, + uint64_t consumerUsage) { + static_assert(uint64_t(GRALLOC1_CONSUMER_USAGE_CPU_READ_OFTEN) == + uint64_t(GRALLOC1_PRODUCER_USAGE_CPU_READ_OFTEN), + "expected ConsumerUsage and ProducerUsage CPU_READ_OFTEN " + "bits to match"); + uint64_t merged = producerUsage | consumerUsage; + if ((merged & (GRALLOC1_CONSUMER_USAGE_CPU_READ_OFTEN)) == + GRALLOC1_CONSUMER_USAGE_CPU_READ_OFTEN) { + merged &= ~uint64_t(GRALLOC1_CONSUMER_USAGE_CPU_READ_OFTEN); + merged |= BufferUsage::CPU_READ_OFTEN; + } + if ((merged & (GRALLOC1_PRODUCER_USAGE_CPU_WRITE_OFTEN)) == + GRALLOC1_PRODUCER_USAGE_CPU_WRITE_OFTEN) { + merged &= ~uint64_t(GRALLOC1_PRODUCER_USAGE_CPU_WRITE_OFTEN); + merged |= BufferUsage::CPU_WRITE_OFTEN; + } + return merged; +} + const VkSurfaceTransformFlagsKHR kSupportedTransforms = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR | VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR | @@ -1337,7 +1359,7 @@ VkResult CreateSwapchainKHR(VkDevice device, num_images = 1; } - int32_t legacy_usage = 0; + uint64_t native_usage = 0; if (dispatch.GetSwapchainGrallocUsage2ANDROID) { uint64_t consumer_usage, producer_usage; ATRACE_BEGIN("GetSwapchainGrallocUsage2ANDROID"); @@ -1349,10 +1371,11 @@ VkResult CreateSwapchainKHR(VkDevice device, ALOGE("vkGetSwapchainGrallocUsage2ANDROID failed: %d", result); return VK_ERROR_SURFACE_LOST_KHR; } - legacy_usage = - android_convertGralloc1To0Usage(producer_usage, consumer_usage); + native_usage = + convertGralloc1ToBufferUsage(consumer_usage, producer_usage); } else if (dispatch.GetSwapchainGrallocUsageANDROID) { ATRACE_BEGIN("GetSwapchainGrallocUsageANDROID"); + int32_t legacy_usage = 0; result = dispatch.GetSwapchainGrallocUsageANDROID( device, create_info->imageFormat, create_info->imageUsage, &legacy_usage); @@ -1361,8 +1384,9 @@ VkResult CreateSwapchainKHR(VkDevice device, ALOGE("vkGetSwapchainGrallocUsageANDROID failed: %d", result); return VK_ERROR_SURFACE_LOST_KHR; } + native_usage = static_cast<uint64_t>(legacy_usage); } - uint64_t native_usage = static_cast<uint64_t>(legacy_usage); + native_usage |= surface.consumer_usage; bool createProtectedSwapchain = false; if (create_info->flags & VK_SWAPCHAIN_CREATE_PROTECTED_BIT_KHR) { |