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

Author: Yiwei Zhang <[email protected]>
Date:   Sun Feb 12 16:08:45 2023 -0800

venus: fix external buffer creation

Move buffer create info scrub into core venus.

Signed-off-by: Yiwei Zhang <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21379>

---

 src/virtio/vulkan/vn_android.c | 68 -------------------------------------
 src/virtio/vulkan/vn_android.h | 15 ---------
 src/virtio/vulkan/vn_buffer.c  | 76 ++++++++++++++++++++++++++++++++++++------
 3 files changed, 65 insertions(+), 94 deletions(-)

diff --git a/src/virtio/vulkan/vn_android.c b/src/virtio/vulkan/vn_android.c
index 25954f41ab1..40ff06f8b00 100644
--- a/src/virtio/vulkan/vn_android.c
+++ b/src/virtio/vulkan/vn_android.c
@@ -1345,48 +1345,6 @@ vn_GetMemoryAndroidHardwareBufferANDROID(
    return VK_SUCCESS;
 }
 
-struct vn_android_buffer_create_info {
-   VkBufferCreateInfo create;
-   VkExternalMemoryBufferCreateInfo external;
-   VkBufferOpaqueCaptureAddressCreateInfo address;
-};
-
-static const VkBufferCreateInfo *
-vn_android_fix_buffer_create_info(
-   const VkBufferCreateInfo *create_info,
-   struct vn_android_buffer_create_info *local_info)
-{
-   local_info->create = *create_info;
-   VkBaseOutStructure *dst = (void *)&local_info->create;
-
-   vk_foreach_struct_const(src, create_info->pNext) {
-      void *pnext = NULL;
-      switch (src->sType) {
-      case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO:
-         memcpy(&local_info->external, src, sizeof(local_info->external));
-         local_info->external.handleTypes =
-            VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT;
-         pnext = &local_info->external;
-         break;
-      case VK_STRUCTURE_TYPE_BUFFER_OPAQUE_CAPTURE_ADDRESS_CREATE_INFO:
-         memcpy(&local_info->address, src, sizeof(local_info->address));
-         pnext = &local_info->address;
-         break;
-      default:
-         break;
-      }
-
-      if (pnext) {
-         dst->pNext = pnext;
-         dst = pnext;
-      }
-   }
-
-   dst->pNext = NULL;
-
-   return &local_info->create;
-}
-
 VkResult
 vn_android_get_ahb_buffer_memory_type_bits(struct vn_device *dev,
                                            uint32_t *out_mem_type_bits)
@@ -1425,29 +1383,3 @@ vn_android_get_ahb_buffer_memory_type_bits(struct 
vn_device *dev,
 
    return VK_SUCCESS;
 }
-
-VkResult
-vn_android_buffer_from_ahb(struct vn_device *dev,
-                           const VkBufferCreateInfo *create_info,
-                           const VkAllocationCallbacks *alloc,
-                           struct vn_buffer **out_buf)
-{
-   struct vn_android_buffer_create_info local_info;
-   VkResult result;
-
-   create_info = vn_android_fix_buffer_create_info(create_info, &local_info);
-   result = vn_buffer_create(dev, create_info, alloc, out_buf);
-   if (result != VK_SUCCESS)
-      return result;
-
-   /* AHB backed buffer layers on top of dma_buf, so here we must comine the
-    * queried type bits from both buffer memory requirement and dma_buf fd
-    * properties.
-    */
-   (*out_buf)->requirements.memory.memoryRequirements.memoryTypeBits &=
-      dev->buffer_cache.ahb_mem_type_bits;
-
-   assert((*out_buf)->requirements.memory.memoryRequirements.memoryTypeBits);
-
-   return VK_SUCCESS;
-}
diff --git a/src/virtio/vulkan/vn_android.h b/src/virtio/vulkan/vn_android.h
index b4882f83b78..458e9f1549d 100644
--- a/src/virtio/vulkan/vn_android.h
+++ b/src/virtio/vulkan/vn_android.h
@@ -73,12 +73,6 @@ vn_android_release_ahb(struct AHardwareBuffer *ahb);
 VkFormat
 vn_android_drm_format_to_vk_format(uint32_t format);
 
-VkResult
-vn_android_buffer_from_ahb(struct vn_device *dev,
-                           const VkBufferCreateInfo *create_info,
-                           const VkAllocationCallbacks *alloc,
-                           struct vn_buffer **out_buf);
-
 VkResult
 vn_android_get_ahb_buffer_memory_type_bits(struct vn_device *dev,
                                            uint32_t *out_mem_type_bits);
@@ -167,15 +161,6 @@ vn_android_drm_format_to_vk_format(UNUSED uint32_t format)
    return VK_FORMAT_UNDEFINED;
 }
 
-static inline VkResult
-vn_android_buffer_from_ahb(UNUSED struct vn_device *dev,
-                           UNUSED const VkBufferCreateInfo *create_info,
-                           UNUSED const VkAllocationCallbacks *alloc,
-                           UNUSED struct vn_buffer **out_buf)
-{
-   return VK_ERROR_OUT_OF_HOST_MEMORY;
-}
-
 static inline VkResult
 vn_android_get_ahb_buffer_memory_type_bits(UNUSED struct vn_device *dev,
                                            UNUSED uint32_t *out_mem_type_bits)
diff --git a/src/virtio/vulkan/vn_buffer.c b/src/virtio/vulkan/vn_buffer.c
index 2127ec74aa1..5c7e2a1eed1 100644
--- a/src/virtio/vulkan/vn_buffer.c
+++ b/src/virtio/vulkan/vn_buffer.c
@@ -271,6 +271,48 @@ vn_buffer_create(struct vn_device *dev,
    return VK_SUCCESS;
 }
 
+struct vn_buffer_create_info {
+   VkBufferCreateInfo create;
+   VkExternalMemoryBufferCreateInfo external;
+   VkBufferOpaqueCaptureAddressCreateInfo capture;
+};
+
+static const VkBufferCreateInfo *
+vn_buffer_fix_create_info(
+   const VkBufferCreateInfo *create_info,
+   const VkExternalMemoryHandleTypeFlagBits renderer_handle_type,
+   struct vn_buffer_create_info *local_info)
+{
+   local_info->create = *create_info;
+   VkBaseOutStructure *cur = (void *)&local_info->create;
+
+   vk_foreach_struct_const(src, create_info->pNext) {
+      void *next = NULL;
+      switch (src->sType) {
+      case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO:
+         memcpy(&local_info->external, src, sizeof(local_info->external));
+         local_info->external.handleTypes = renderer_handle_type;
+         next = &local_info->external;
+         break;
+      case VK_STRUCTURE_TYPE_BUFFER_OPAQUE_CAPTURE_ADDRESS_CREATE_INFO:
+         memcpy(&local_info->capture, src, sizeof(local_info->capture));
+         next = &local_info->capture;
+         break;
+      default:
+         break;
+      }
+
+      if (next) {
+         cur->pNext = next;
+         cur = next;
+      }
+   }
+
+   cur->pNext = NULL;
+
+   return &local_info->create;
+}
+
 VkResult
 vn_CreateBuffer(VkDevice device,
                 const VkBufferCreateInfo *pCreateInfo,
@@ -281,25 +323,37 @@ vn_CreateBuffer(VkDevice device,
    struct vn_device *dev = vn_device_from_handle(device);
    const VkAllocationCallbacks *alloc =
       pAllocator ? pAllocator : &dev->base.base.alloc;
-   struct vn_buffer *buf = NULL;
-   VkResult result;
+   const VkExternalMemoryHandleTypeFlagBits renderer_handle_type =
+      dev->physical_device->external_memory.renderer_handle_type;
 
+   struct vn_buffer_create_info local_info;
    const VkExternalMemoryBufferCreateInfo *external_info =
       vk_find_struct_const(pCreateInfo->pNext,
                            EXTERNAL_MEMORY_BUFFER_CREATE_INFO);
-   const bool ahb_info =
-      external_info &&
-      external_info->handleTypes ==
-         VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID;
-
-   if (ahb_info)
-      result = vn_android_buffer_from_ahb(dev, pCreateInfo, alloc, &buf);
-   else
-      result = vn_buffer_create(dev, pCreateInfo, alloc, &buf);
+   if (external_info && external_info->handleTypes &&
+       external_info->handleTypes != renderer_handle_type) {
+      pCreateInfo = vn_buffer_fix_create_info(
+         pCreateInfo, renderer_handle_type, &local_info);
+   }
 
+   struct vn_buffer *buf;
+   VkResult result = vn_buffer_create(dev, pCreateInfo, alloc, &buf);
    if (result != VK_SUCCESS)
       return vn_error(dev->instance, result);
 
+   if (external_info &&
+       external_info->handleTypes ==
+          VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID) {
+      /* AHB backed buffer layers on top of renderer external memory, so here
+       * we combine the queried type bits from both buffer memory requirement
+       * and renderer external memory properties.
+       */
+      buf->requirements.memory.memoryRequirements.memoryTypeBits &=
+         dev->buffer_cache.ahb_mem_type_bits;
+
+      assert(buf->requirements.memory.memoryRequirements.memoryTypeBits);
+   }
+
    *pBuffer = vn_buffer_to_handle(buf);
 
    return VK_SUCCESS;

Reply via email to