Mesa (main): venus: handle ahb backed VkBuffer creation properly

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Jul 1 03:53:03 UTC 2021


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

Author: Yiwei Zhang <zzyiwei at chromium.org>
Date:   Wed Jun 30 17:28:47 2021 +0000

venus: handle ahb backed VkBuffer creation properly

Venus needs to override the external handle type from AHB to dma buf.

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/11661>

---

 src/virtio/vulkan/vn_android.c | 55 ++++++++++++++++++++++++++++++++++++++++++
 src/virtio/vulkan/vn_android.h | 15 ++++++++++++
 src/virtio/vulkan/vn_buffer.c  | 14 ++++++++++-
 3 files changed, 83 insertions(+), 1 deletion(-)

diff --git a/src/virtio/vulkan/vn_android.c b/src/virtio/vulkan/vn_android.c
index c410ab95a08..f483531ade1 100644
--- a/src/virtio/vulkan/vn_android.c
+++ b/src/virtio/vulkan/vn_android.c
@@ -20,6 +20,7 @@
 #include "util/libsync.h"
 #include "util/os_file.h"
 
+#include "vn_buffer.h"
 #include "vn_device.h"
 #include "vn_device_memory.h"
 #include "vn_image.h"
@@ -1083,3 +1084,57 @@ 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_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;
+
+   create_info = vn_android_fix_buffer_create_info(create_info, &local_info);
+   return vn_buffer_create(dev, create_info, alloc, out_buf);
+}
diff --git a/src/virtio/vulkan/vn_android.h b/src/virtio/vulkan/vn_android.h
index 587ad83e440..8389b6dd0fc 100644
--- a/src/virtio/vulkan/vn_android.h
+++ b/src/virtio/vulkan/vn_android.h
@@ -69,6 +69,12 @@ 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);
+
 #else
 
 static inline const VkNativeBufferANDROID *
@@ -142,6 +148,15 @@ 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;
+}
+
 #endif /* ANDROID */
 
 #endif /* VN_ANDROID_H */
diff --git a/src/virtio/vulkan/vn_buffer.c b/src/virtio/vulkan/vn_buffer.c
index 547ffb49bf7..cb65c2d29f1 100644
--- a/src/virtio/vulkan/vn_buffer.c
+++ b/src/virtio/vulkan/vn_buffer.c
@@ -13,6 +13,7 @@
 #include "venus-protocol/vn_protocol_driver_buffer.h"
 #include "venus-protocol/vn_protocol_driver_buffer_view.h"
 
+#include "vn_android.h"
 #include "vn_device.h"
 #include "vn_device_memory.h"
 
@@ -77,7 +78,18 @@ vn_CreateBuffer(VkDevice device,
    struct vn_buffer *buf = NULL;
    VkResult result;
 
-   result = vn_buffer_create(dev, pCreateInfo, alloc, &buf);
+   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 (result != VK_SUCCESS)
       return vn_error(dev->instance, result);



More information about the mesa-commit mailing list