aboutsummaryrefslogtreecommitdiffstats
path: root/src/intel/vulkan
diff options
context:
space:
mode:
authorTapani Pälli <[email protected]>2019-08-01 13:49:34 +0300
committerTapani Pälli <[email protected]>2019-08-08 05:08:01 +0000
commitaba57b11ee8c6d4be225f6e22ae00d96b1833d73 (patch)
tree2e32b5f4066fed7008783fffd9e6dcb69833dc58 /src/intel/vulkan
parent51c3ab618be90d59da23d7e3765a45aff50bf398 (diff)
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 <[email protected]> Reviewed-by: Jason Ekstrand <[email protected]>
Diffstat (limited to 'src/intel/vulkan')
-rw-r--r--src/intel/vulkan/anv_android.c104
-rw-r--r--src/intel/vulkan/anv_extensions.py2
2 files changed, 84 insertions, 22 deletions
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 <hardware/gralloc.h>
+
+#if ANDROID_API_LEVEL >= 26
+#include <hardware/gralloc1.h>
+#include <grallocusage/GrallocUsageConversion.h>
+#endif
+
#include <hardware/hardware.h>
#include <hardware/hwvulkan.h>
#include <vulkan/vk_android_native_buffer.h>
@@ -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),