vulkan,anv,hasvk,radv: Unify Android hardware buffer creation
authorFaith Ekstrand <faith.ekstrand@collabora.com>
Mon, 20 Mar 2023 23:41:31 +0000 (18:41 -0500)
committerMarge Bot <emma+marge@anholt.net>
Fri, 31 Mar 2023 14:57:03 +0000 (14:57 +0000)
Reviewed-by: Lina Versace <lina@kiwitree.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22038>

src/amd/vulkan/radv_android.c
src/intel/vulkan/anv_android.c
src/intel/vulkan_hasvk/anv_android.c
src/vulkan/runtime/vk_android.c
src/vulkan/runtime/vk_android.h

index a537cbb..5d050cf 100644 (file)
@@ -736,48 +736,10 @@ radv_create_ahb_memory(struct radv_device *device, struct radv_device_memory *me
                        unsigned priority, const VkMemoryAllocateInfo *pAllocateInfo)
 {
 #if RADV_SUPPORT_ANDROID_HARDWARE_BUFFER
-   const VkMemoryDedicatedAllocateInfo *dedicated_info =
-      vk_find_struct_const(pAllocateInfo->pNext, MEMORY_DEDICATED_ALLOCATE_INFO);
-
-   uint32_t w = 0;
-   uint32_t h = 1;
-   uint32_t layers = 1;
-   uint32_t format = 0;
-   uint64_t usage = 0;
-
-   /* If caller passed dedicated information. */
-   if (dedicated_info && dedicated_info->image) {
-      RADV_FROM_HANDLE(radv_image, image, dedicated_info->image);
-      w = image->info.width;
-      h = image->info.height;
-      layers = image->info.array_size;
-      format = radv_ahb_format_for_vk_format(image->vk.format);
-      usage = vk_image_usage_to_ahb_usage(image->vk.create_flags, image->vk.usage);
-   } else if (dedicated_info && dedicated_info->buffer) {
-      RADV_FROM_HANDLE(radv_buffer, buffer, dedicated_info->buffer);
-      w = buffer->vk.size;
-      format = AHARDWAREBUFFER_FORMAT_BLOB;
-      usage = AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN | AHARDWAREBUFFER_USAGE_CPU_WRITE_OFTEN;
-   } else {
-      w = pAllocateInfo->allocationSize;
-      format = AHARDWAREBUFFER_FORMAT_BLOB;
-      usage = AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN | AHARDWAREBUFFER_USAGE_CPU_WRITE_OFTEN;
-   }
-
-   struct AHardwareBuffer *android_hardware_buffer = NULL;
-   struct AHardwareBuffer_Desc desc = {
-      .width = w,
-      .height = h,
-      .layers = layers,
-      .format = format,
-      .usage = usage,
-   };
-
-   if (AHardwareBuffer_allocate(&desc, &android_hardware_buffer) != 0)
+   mem->android_hardware_buffer = vk_alloc_ahardware_buffer(pAllocateInfo);
+   if (mem->android_hardware_buffer == NULL)
       return VK_ERROR_OUT_OF_HOST_MEMORY;
 
-   mem->android_hardware_buffer = android_hardware_buffer;
-
    const struct VkImportAndroidHardwareBufferInfoANDROID import_info = {
       .buffer = mem->android_hardware_buffer,
    };
index b93b215..a0260aa 100644 (file)
@@ -385,48 +385,8 @@ anv_create_ahw_memory(VkDevice device_h,
                       const VkMemoryAllocateInfo *pAllocateInfo)
 {
 #if ANDROID_API_LEVEL >= 26
-   const VkMemoryDedicatedAllocateInfo *dedicated_info =
-      vk_find_struct_const(pAllocateInfo->pNext,
-                           MEMORY_DEDICATED_ALLOCATE_INFO);
-
-   uint32_t w = 0;
-   uint32_t h = 1;
-   uint32_t layers = 1;
-   uint32_t format = 0;
-   uint64_t usage = 0;
-
-   /* If caller passed dedicated information. */
-   if (dedicated_info && dedicated_info->image) {
-      ANV_FROM_HANDLE(anv_image, image, dedicated_info->image);
-      w = image->vk.extent.width;
-      h = image->vk.extent.height;
-      layers = image->vk.array_layers;
-      format = anv_ahw_format_for_vk_format(image->vk.format);
-      usage = vk_image_usage_to_ahb_usage(image->vk.create_flags,
-                                          image->vk.usage);
-   } else if (dedicated_info && dedicated_info->buffer) {
-      ANV_FROM_HANDLE(anv_buffer, buffer, dedicated_info->buffer);
-      w = buffer->vk.size;
-      format = AHARDWAREBUFFER_FORMAT_BLOB;
-      usage = AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN |
-              AHARDWAREBUFFER_USAGE_CPU_WRITE_OFTEN;
-   } else {
-      w = pAllocateInfo->allocationSize;
-      format = AHARDWAREBUFFER_FORMAT_BLOB;
-      usage = AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN |
-              AHARDWAREBUFFER_USAGE_CPU_WRITE_OFTEN;
-   }
-
-   struct AHardwareBuffer *ahw = NULL;
-   struct AHardwareBuffer_Desc desc = {
-      .width = w,
-      .height = h,
-      .layers = layers,
-      .format = format,
-      .usage = usage,
-    };
-
-   if (AHardwareBuffer_allocate(&desc, &ahw) != 0)
+   struct AHardwareBuffer *ahw = vk_alloc_ahardware_buffer(pAllocateInfo);
+   if (ahw == NULL)
       return VK_ERROR_OUT_OF_HOST_MEMORY;
 
    const VkImportAndroidHardwareBufferInfoANDROID import_info = {
index a964a72..50a9a27 100644 (file)
@@ -384,48 +384,8 @@ anv_create_ahw_memory(VkDevice device_h,
                       const VkMemoryAllocateInfo *pAllocateInfo)
 {
 #if ANDROID_API_LEVEL >= 26
-   const VkMemoryDedicatedAllocateInfo *dedicated_info =
-      vk_find_struct_const(pAllocateInfo->pNext,
-                           MEMORY_DEDICATED_ALLOCATE_INFO);
-
-   uint32_t w = 0;
-   uint32_t h = 1;
-   uint32_t layers = 1;
-   uint32_t format = 0;
-   uint64_t usage = 0;
-
-   /* If caller passed dedicated information. */
-   if (dedicated_info && dedicated_info->image) {
-      ANV_FROM_HANDLE(anv_image, image, dedicated_info->image);
-      w = image->vk.extent.width;
-      h = image->vk.extent.height;
-      layers = image->vk.array_layers;
-      format = anv_ahw_format_for_vk_format(image->vk.format);
-      usage = vk_image_usage_to_ahb_usage(image->vk.create_flags,
-                                          image->vk.usage);
-   } else if (dedicated_info && dedicated_info->buffer) {
-      ANV_FROM_HANDLE(anv_buffer, buffer, dedicated_info->buffer);
-      w = buffer->vk.size;
-      format = AHARDWAREBUFFER_FORMAT_BLOB;
-      usage = AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN |
-              AHARDWAREBUFFER_USAGE_CPU_WRITE_OFTEN;
-   } else {
-      w = pAllocateInfo->allocationSize;
-      format = AHARDWAREBUFFER_FORMAT_BLOB;
-      usage = AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN |
-              AHARDWAREBUFFER_USAGE_CPU_WRITE_OFTEN;
-   }
-
-   struct AHardwareBuffer *ahw = NULL;
-   struct AHardwareBuffer_Desc desc = {
-      .width = w,
-      .height = h,
-      .layers = layers,
-      .format = format,
-      .usage = usage,
-    };
-
-   if (AHardwareBuffer_allocate(&desc, &ahw) != 0)
+   struct AHardwareBuffer *ahw = vk_alloc_ahardware_buffer(pAllocateInfo);
+   if (ahw == NULL)
       return VK_ERROR_OUT_OF_HOST_MEMORY;
 
    const VkImportAndroidHardwareBufferInfoANDROID import_info = {
index 862a937..eb54b1d 100644 (file)
 
 #include "vk_android.h"
 
+#include "vk_buffer.h"
 #include "vk_common_entrypoints.h"
 #include "vk_device.h"
+#include "vk_image.h"
 #include "vk_log.h"
 #include "vk_queue.h"
+#include "vk_util.h"
 
 #include "util/libsync.h"
 
+#include <hardware/gralloc.h>
+
+#if ANDROID_API_LEVEL >= 26
+#include <hardware/gralloc1.h>
+#endif
+
 #include <unistd.h>
 
 #if ANDROID_API_LEVEL >= 26
@@ -84,7 +93,61 @@ vk_image_usage_to_ahb_usage(const VkImageCreateFlags vk_create,
    if (ahb_usage == 0)
       ahb_usage = AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE;
 
-   return ahb_usage
+   return ahb_usage;
+}
+
+struct AHardwareBuffer *
+vk_alloc_ahardware_buffer(const VkMemoryAllocateInfo *pAllocateInfo)
+{
+   const VkMemoryDedicatedAllocateInfo *dedicated_info =
+      vk_find_struct_const(pAllocateInfo->pNext,
+                           MEMORY_DEDICATED_ALLOCATE_INFO);
+
+   uint32_t w = 0;
+   uint32_t h = 1;
+   uint32_t layers = 1;
+   uint32_t format = 0;
+   uint64_t usage = 0;
+
+   /* If caller passed dedicated information. */
+   if (dedicated_info && dedicated_info->image) {
+      VK_FROM_HANDLE(vk_image, image, dedicated_info->image);
+      w = image->extent.width;
+      h = image->extent.height;
+      layers = image->array_layers;
+      assert(image->ahardware_buffer_format != 0);
+      /* TODO: This feels a bit sketchy.  We should probably be taking the
+       * external format into account somehow.
+       */
+      format = image->ahardware_buffer_format;
+      usage = vk_image_usage_to_ahb_usage(image->create_flags,
+                                          image->usage);
+   } else if (dedicated_info && dedicated_info->buffer) {
+      VK_FROM_HANDLE(vk_buffer, buffer, dedicated_info->buffer);
+      w = buffer->size;
+      format = AHARDWAREBUFFER_FORMAT_BLOB;
+      usage = AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN |
+              AHARDWAREBUFFER_USAGE_CPU_WRITE_OFTEN;
+   } else {
+      w = pAllocateInfo->allocationSize;
+      format = AHARDWAREBUFFER_FORMAT_BLOB;
+      usage = AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN |
+              AHARDWAREBUFFER_USAGE_CPU_WRITE_OFTEN;
+   }
+
+   struct AHardwareBuffer_Desc desc = {
+      .width = w,
+      .height = h,
+      .layers = layers,
+      .format = format,
+      .usage = usage,
+    };
+
+   struct AHardwareBuffer *ahb;
+   if (AHardwareBuffer_allocate(&desc, &ahb) != 0)
+      return NULL;
+
+   return ahb;
 }
 #endif /* ANDROID_API_LEVEL >= 26 */
 
index 668b01f..25b346c 100644 (file)
@@ -32,6 +32,9 @@ extern "C" {
 #if ANDROID_API_LEVEL >= 26
 uint64_t vk_image_usage_to_ahb_usage(const VkImageCreateFlags vk_create,
                                      const VkImageUsageFlags vk_usage);
+
+struct AHardwareBuffer *
+vk_alloc_ahardware_buffer(const VkMemoryAllocateInfo *pAllocateInfo);
 #endif
 
 #ifdef __cplusplus