radv: Implement sparse buffer creation.

Signed-off-by: Bas Nieuwenhuizen <basni@google.com>
Reviewed-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
Bas Nieuwenhuizen 2017-02-04 11:15:59 +01:00
parent 715df30a4e
commit ef0e505d02
2 changed files with 21 additions and 2 deletions

View file

@ -1881,8 +1881,12 @@ void radv_GetBufferMemoryRequirements(
pMemoryRequirements->memoryTypeBits = (1u << RADV_MEM_TYPE_COUNT) - 1;
pMemoryRequirements->size = buffer->size;
pMemoryRequirements->alignment = 16;
if (buffer->flags & VK_BUFFER_CREATE_SPARSE_BINDING_BIT)
pMemoryRequirements->alignment = 4096;
else
pMemoryRequirements->alignment = 16;
pMemoryRequirements->size = align64(buffer->size, pMemoryRequirements->alignment);
}
void radv_GetImageMemoryRequirements(
@ -2208,6 +2212,17 @@ VkResult radv_CreateBuffer(
buffer->usage = pCreateInfo->usage;
buffer->bo = NULL;
buffer->offset = 0;
buffer->flags = pCreateInfo->flags;
if (pCreateInfo->flags & VK_BUFFER_CREATE_SPARSE_BINDING_BIT) {
buffer->bo = device->ws->buffer_create(device->ws,
align64(buffer->size, 4096),
4096, 0, RADEON_FLAG_VIRTUAL);
if (!buffer->bo) {
vk_free2(&device->alloc, pAllocator, buffer);
return vk_error(VK_ERROR_OUT_OF_DEVICE_MEMORY);
}
}
*pBuffer = radv_buffer_to_handle(buffer);
@ -2225,6 +2240,9 @@ void radv_DestroyBuffer(
if (!buffer)
return;
if (buffer->flags & VK_BUFFER_CREATE_SPARSE_BINDING_BIT)
device->ws->buffer_destroy(buffer->bo);
vk_free2(&device->alloc, pAllocator, buffer);
}

View file

@ -557,6 +557,7 @@ struct radv_buffer {
VkDeviceSize size;
VkBufferUsageFlags usage;
VkBufferCreateFlags flags;
/* Set when bound */
struct radeon_winsys_bo * bo;