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