Mesa (main): venus: fix AHB VkBuffer memory requirement
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Thu Jul 1 03:53:03 UTC 2021
Module: Mesa
Branch: main
Commit: 73c71a37f4362b4f16d72253f71ea8399d3713aa
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=73c71a37f4362b4f16d72253f71ea8399d3713aa
Author: Yiwei Zhang <zzyiwei at chromium.org>
Date: Wed Jun 30 18:39:00 2021 +0000
venus: fix AHB VkBuffer memory requirement
Layering AHB on top of dma_buf_fd requires venus to combine the memory
type bits internally for VkBuffer.
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 | 44 +++++++++++++++++++++++++++++++++++++++++-
1 file changed, 43 insertions(+), 1 deletion(-)
diff --git a/src/virtio/vulkan/vn_android.c b/src/virtio/vulkan/vn_android.c
index f483531ade1..2b0c0056a34 100644
--- a/src/virtio/vulkan/vn_android.c
+++ b/src/virtio/vulkan/vn_android.c
@@ -1133,8 +1133,50 @@ vn_android_buffer_from_ahb(struct vn_device *dev,
const VkAllocationCallbacks *alloc,
struct vn_buffer **out_buf)
{
+ const uint32_t format = AHARDWAREBUFFER_FORMAT_BLOB;
+ /* ensure dma_buf_memory_type_bits covers host visible usage */
+ const uint64_t usage = AHARDWAREBUFFER_USAGE_GPU_DATA_BUFFER |
+ AHARDWAREBUFFER_USAGE_CPU_READ_RARELY |
+ AHARDWAREBUFFER_USAGE_CPU_WRITE_RARELY;
+ AHardwareBuffer *ahb = NULL;
+ int dma_buf_fd = -1;
+ uint64_t alloc_size = 0;
+ uint32_t mem_type_bits = 0;
struct vn_android_buffer_create_info local_info;
+ VkResult result;
+
+ ahb = vn_android_ahb_allocate(4096, 1, 1, format, usage);
+ if (!ahb)
+ return VK_ERROR_OUT_OF_HOST_MEMORY;
+
+ result = vn_android_get_dma_buf_from_native_handle(
+ AHardwareBuffer_getNativeHandle(ahb), &dma_buf_fd);
+ if (result != VK_SUCCESS) {
+ AHardwareBuffer_release(ahb);
+ return result;
+ }
+
+ result = vn_get_memory_dma_buf_properties(dev, dma_buf_fd, &alloc_size,
+ &mem_type_bits);
+
+ AHardwareBuffer_release(ahb);
+
+ if (result != VK_SUCCESS)
+ return result;
create_info = vn_android_fix_buffer_create_info(create_info, &local_info);
- return vn_buffer_create(dev, create_info, alloc, out_buf);
+ 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)->memory_requirements.memoryRequirements.memoryTypeBits &=
+ mem_type_bits;
+
+ assert((*out_buf)->memory_requirements.memoryRequirements.memoryTypeBits);
+
+ return VK_SUCCESS;
}
More information about the mesa-commit
mailing list