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;
