From: Tapani Pälli Date: Thu, 1 Aug 2019 10:49:34 +0000 (+0300) Subject: anv: support GetSwapchainGrallocUsage2ANDROID for Android X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;ds=sidebyside;h=aba57b11ee8c6d4be225f6e22ae00d96b1833d73;p=mesa.git anv: support GetSwapchainGrallocUsage2ANDROID for Android New function supports gralloc1 usage flags that get set separately for producer and consumer. As we still need to support old method too, let's share common code and use android_convertGralloc0To1Usage helper. Bump the VK_ANDROID_native_buffer version to indicate support for the new call. Changes were tested on Android Celadon P with Basemark GPU and various Sascha Willems Vulkan demos. Signed-off-by: Tapani Pälli Reviewed-by: Jason Ekstrand --- diff --git a/src/intel/Android.vulkan.mk b/src/intel/Android.vulkan.mk index 5d2ec4f76c7..f66ab5bdfa4 100644 --- a/src/intel/Android.vulkan.mk +++ b/src/intel/Android.vulkan.mk @@ -304,5 +304,9 @@ else libexpat endif +ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 27; echo $$?), 0) +LOCAL_STATIC_LIBRARIES += libgrallocusage +endif + include $(MESA_COMMON_MK) include $(BUILD_SHARED_LIBRARY) diff --git a/src/intel/vulkan/anv_android.c b/src/intel/vulkan/anv_android.c index 8c785323d36..a8c1d480bfa 100644 --- a/src/intel/vulkan/anv_android.c +++ b/src/intel/vulkan/anv_android.c @@ -22,6 +22,12 @@ */ #include + +#if ANDROID_API_LEVEL >= 26 +#include +#include +#endif + #include #include #include @@ -549,33 +555,15 @@ anv_image_from_gralloc(VkDevice device_h, return result; } -VkResult anv_GetSwapchainGrallocUsageANDROID( - VkDevice device_h, - VkFormat format, - VkImageUsageFlags imageUsage, - int* grallocUsage) +VkResult +format_supported_with_usage(VkDevice device_h, VkFormat format, + VkImageUsageFlags imageUsage) { ANV_FROM_HANDLE(anv_device, device, device_h); struct anv_physical_device *phys_dev = &device->instance->physicalDevice; VkPhysicalDevice phys_dev_h = anv_physical_device_to_handle(phys_dev); VkResult result; - *grallocUsage = 0; - intel_logd("%s: format=%d, usage=0x%x", __func__, format, imageUsage); - - /* WARNING: Android's libvulkan.so hardcodes the VkImageUsageFlags - * returned to applications via VkSurfaceCapabilitiesKHR::supportedUsageFlags. - * The relevant code in libvulkan/swapchain.cpp contains this fun comment: - * - * TODO(jessehall): I think these are right, but haven't thought hard - * about it. Do we need to query the driver for support of any of - * these? - * - * Any disagreement between this function and the hardcoded - * VkSurfaceCapabilitiesKHR:supportedUsageFlags causes tests - * dEQP-VK.wsi.android.swapchain.*.image_usage to fail. - */ - const VkPhysicalDeviceImageFormatInfo2 image_format_info = { .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_FORMAT_INFO_2, .format = format, @@ -596,6 +584,26 @@ VkResult anv_GetSwapchainGrallocUsageANDROID( "anv_GetPhysicalDeviceImageFormatProperties2 failed " "inside %s", __func__); } + return VK_SUCCESS; +} + + +static VkResult +setup_gralloc0_usage(VkFormat format, VkImageUsageFlags imageUsage, + int *grallocUsage) +{ + /* WARNING: Android's libvulkan.so hardcodes the VkImageUsageFlags + * returned to applications via VkSurfaceCapabilitiesKHR::supportedUsageFlags. + * The relevant code in libvulkan/swapchain.cpp contains this fun comment: + * + * TODO(jessehall): I think these are right, but haven't thought hard + * about it. Do we need to query the driver for support of any of + * these? + * + * Any disagreement between this function and the hardcoded + * VkSurfaceCapabilitiesKHR:supportedUsageFlags causes tests + * dEQP-VK.wsi.android.swapchain.*.image_usage to fail. + */ if (unmask32(&imageUsage, VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT)) @@ -642,6 +650,60 @@ VkResult anv_GetSwapchainGrallocUsageANDROID( return VK_SUCCESS; } + +#if ANDROID_API_LEVEL >= 26 +VkResult anv_GetSwapchainGrallocUsage2ANDROID( + VkDevice device_h, + VkFormat format, + VkImageUsageFlags imageUsage, + VkSwapchainImageUsageFlagsANDROID swapchainImageUsage, + uint64_t* grallocConsumerUsage, + uint64_t* grallocProducerUsage) +{ + ANV_FROM_HANDLE(anv_device, device, device_h); + VkResult result; + + *grallocConsumerUsage = 0; + *grallocProducerUsage = 0; + intel_logd("%s: format=%d, usage=0x%x", __func__, format, imageUsage); + + result = format_supported_with_usage(device_h, format, imageUsage); + if (result != VK_SUCCESS) + return result; + + int32_t grallocUsage = 0; + result = setup_gralloc0_usage(format, imageUsage, &grallocUsage); + if (result != VK_SUCCESS) + return result; + + android_convertGralloc0To1Usage(grallocUsage, grallocProducerUsage, + grallocConsumerUsage); + + return VK_SUCCESS; +} +#endif + +VkResult anv_GetSwapchainGrallocUsageANDROID( + VkDevice device_h, + VkFormat format, + VkImageUsageFlags imageUsage, + int* grallocUsage) +{ + ANV_FROM_HANDLE(anv_device, device, device_h); + struct anv_physical_device *phys_dev = &device->instance->physicalDevice; + VkPhysicalDevice phys_dev_h = anv_physical_device_to_handle(phys_dev); + VkResult result; + + *grallocUsage = 0; + intel_logd("%s: format=%d, usage=0x%x", __func__, format, imageUsage); + + result = format_supported_with_usage(device_h, format, imageUsage); + if (result != VK_SUCCESS) + return result; + + return setup_gralloc0_usage(format, imageUsage, grallocUsage); +} + VkResult anv_AcquireImageANDROID( VkDevice device_h, diff --git a/src/intel/vulkan/anv_extensions.py b/src/intel/vulkan/anv_extensions.py index f90e6f31a65..a284fb81f4b 100644 --- a/src/intel/vulkan/anv_extensions.py +++ b/src/intel/vulkan/anv_extensions.py @@ -155,7 +155,7 @@ EXTENSIONS = [ Extension('VK_EXT_vertex_attribute_divisor', 3, True), Extension('VK_EXT_ycbcr_image_arrays', 1, True), Extension('VK_ANDROID_external_memory_android_hardware_buffer', 3, 'ANDROID'), - Extension('VK_ANDROID_native_buffer', 5, 'ANDROID'), + Extension('VK_ANDROID_native_buffer', 7, 'ANDROID'), Extension('VK_GOOGLE_decorate_string', 1, True), Extension('VK_GOOGLE_hlsl_functionality1', 1, True), Extension('VK_NV_compute_shader_derivatives', 1, True),