Mesa (main): venus: implement AHB allocation and import (part 1/2)

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed May 26 20:34:41 UTC 2021


Module: Mesa
Branch: main
Commit: 1743892f24f9af45849a9087d2363923282b7023
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=1743892f24f9af45849a9087d2363923282b7023

Author: Yiwei Zhang <zzyiwei at chromium.org>
Date:   Tue May 18 22:37:50 2021 +0000

venus: implement AHB allocation and import (part 1/2)

This patch refactors the struct look up logic for memory allocation, and
it prepares the necessary info for ahb allocation and import.

Signed-off-by: Yiwei Zhang <zzyiwei at chromium.org>
Reviewed-by: Chia-I Wu <olvaffe at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10960>

---

 src/virtio/vulkan/vn_android.c       | 17 +++++++++++++++
 src/virtio/vulkan/vn_android.h       | 28 ++++++++++++++++++++++++
 src/virtio/vulkan/vn_device_memory.c | 42 ++++++++++++++++++++++++++++++------
 3 files changed, 80 insertions(+), 7 deletions(-)

diff --git a/src/virtio/vulkan/vn_android.c b/src/virtio/vulkan/vn_android.c
index 23774702380..e3a07fd43d2 100644
--- a/src/virtio/vulkan/vn_android.c
+++ b/src/virtio/vulkan/vn_android.c
@@ -972,3 +972,20 @@ vn_android_image_from_ahb(struct vn_device *dev,
 
    return vn_image_create_deferred(dev, create_info, alloc, out_img);
 }
+
+VkResult
+vn_android_device_import_ahb(struct vn_device *dev,
+                             struct vn_device_memory *mem,
+                             const VkMemoryAllocateInfo *alloc_info,
+                             struct AHardwareBuffer *ahb)
+{
+   return VK_ERROR_OUT_OF_HOST_MEMORY;
+}
+
+VkResult
+vn_android_device_allocate_ahb(struct vn_device *dev,
+                               struct vn_device_memory *mem,
+                               const VkMemoryAllocateInfo *alloc_info)
+{
+   return VK_ERROR_OUT_OF_HOST_MEMORY;
+}
diff --git a/src/virtio/vulkan/vn_android.h b/src/virtio/vulkan/vn_android.h
index 7dc9b78bb86..960708b013a 100644
--- a/src/virtio/vulkan/vn_android.h
+++ b/src/virtio/vulkan/vn_android.h
@@ -67,6 +67,17 @@ vn_android_image_from_ahb(struct vn_device *dev,
                           const VkAllocationCallbacks *alloc,
                           struct vn_image **out_img);
 
+VkResult
+vn_android_device_import_ahb(struct vn_device *dev,
+                             struct vn_device_memory *mem,
+                             const VkMemoryAllocateInfo *alloc_info,
+                             struct AHardwareBuffer *ahb);
+
+VkResult
+vn_android_device_allocate_ahb(struct vn_device *dev,
+                               struct vn_device_memory *mem,
+                               const VkMemoryAllocateInfo *alloc_info);
+
 #else
 
 static inline VkResult
@@ -123,6 +134,23 @@ vn_android_image_from_ahb(UNUSED struct vn_device *dev,
    return VK_ERROR_OUT_OF_HOST_MEMORY;
 }
 
+static inline VkResult
+vn_android_device_import_ahb(UNUSED struct vn_device *dev,
+                             UNUSED struct vn_device_memory *mem,
+                             UNUSED const VkMemoryAllocateInfo *alloc_info,
+                             UNUSED struct AHardwareBuffer *ahb)
+{
+   return VK_ERROR_OUT_OF_HOST_MEMORY;
+}
+
+static inline VkResult
+vn_android_device_allocate_ahb(UNUSED struct vn_device *dev,
+                               UNUSED struct vn_device_memory *mem,
+                               UNUSED const VkMemoryAllocateInfo *alloc_info)
+{
+   return VK_ERROR_OUT_OF_HOST_MEMORY;
+}
+
 #endif /* ANDROID */
 
 #endif /* VN_ANDROID_H */
diff --git a/src/virtio/vulkan/vn_device_memory.c b/src/virtio/vulkan/vn_device_memory.c
index 1f41b547c5c..8ab8415e94d 100644
--- a/src/virtio/vulkan/vn_device_memory.c
+++ b/src/virtio/vulkan/vn_device_memory.c
@@ -13,6 +13,7 @@
 #include "venus-protocol/vn_protocol_driver_device_memory.h"
 #include "venus-protocol/vn_protocol_driver_transport.h"
 
+#include "vn_android.h"
 #include "vn_device.h"
 
 /* device memory commands */
@@ -235,13 +236,33 @@ vn_AllocateMemory(VkDevice device,
       &dev->physical_device->memory_properties.memoryProperties;
    const VkMemoryType *mem_type =
       &mem_props->memoryTypes[pAllocateInfo->memoryTypeIndex];
-   const VkImportMemoryFdInfoKHR *import_fd_info =
-      vk_find_struct_const(pAllocateInfo->pNext, IMPORT_MEMORY_FD_INFO_KHR);
-   const VkExportMemoryAllocateInfo *export_info =
-      vk_find_struct_const(pAllocateInfo->pNext, EXPORT_MEMORY_ALLOCATE_INFO);
-   if (export_info && !export_info->handleTypes)
-      export_info = NULL;
 
+   const VkExportMemoryAllocateInfo *export_info = NULL;
+   const VkImportAndroidHardwareBufferInfoANDROID *import_ahb_info = NULL;
+   const VkImportMemoryFdInfoKHR *import_fd_info = NULL;
+
+   vk_foreach_struct_const(pnext, pAllocateInfo->pNext) {
+      switch (pnext->sType) {
+      case VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO:
+         export_info = (void *)pnext;
+         if (!export_info->handleTypes)
+            export_info = NULL;
+         break;
+      case VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID:
+         import_ahb_info = (void *)pnext;
+         break;
+      case VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR:
+         import_fd_info = (void *)pnext;
+         break;
+      default:
+         break;
+      }
+   }
+
+   const bool export_ahb =
+      export_info &&
+      (export_info->handleTypes &
+       VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID);
    const bool need_bo =
       (mem_type->propertyFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) ||
       export_info;
@@ -261,7 +282,14 @@ vn_AllocateMemory(VkDevice device,
 
    VkDeviceMemory mem_handle = vn_device_memory_to_handle(mem);
    VkResult result;
-   if (import_fd_info) {
+   if (import_ahb_info) {
+      result = vn_android_device_import_ahb(dev, mem, pAllocateInfo,
+                                            import_ahb_info->buffer);
+      assert(mem->base_bo);
+   } else if (export_ahb) {
+      result = vn_android_device_allocate_ahb(dev, mem, pAllocateInfo);
+      assert(mem->base_bo);
+   } else if (import_fd_info) {
       result = vn_device_memory_import_dmabuf(dev, mem, pAllocateInfo,
                                               import_fd_info->fd);
       assert(mem->base_bo);



More information about the mesa-commit mailing list