venus: fix external buffer creation

Move buffer create info scrub into core venus.

Signed-off-by: Yiwei Zhang <zzyiwei@chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21379>
This commit is contained in:
Yiwei Zhang 2023-02-12 16:08:45 -08:00 committed by Marge Bot
parent 09f5033232
commit 21a0608395
3 changed files with 65 additions and 94 deletions

View file

@ -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;
}

View file

@ -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)

View file

@ -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;