mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-04-24 11:30:44 +02:00
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:
parent
09f5033232
commit
21a0608395
3 changed files with 65 additions and 94 deletions
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue