[Mesa-dev] [PATCH v3] radv: Use host memory pool for non-freeable descriptors.
Edward O'Callaghan
funfunctor at folklore1984.net
Thu Apr 20 00:49:20 UTC 2017
Acked-by: Edward O'Callaghan <funfunctor at folklore1984.net>
On 04/19/2017 09:53 AM, Bas Nieuwenhuizen wrote:
> v2: Handle out of pool memory error.
> v3: Actually use VK_ERROR_OUT_OF_POOL_MEMORY_KHR for the error condition.
>
> Signed-off-by: Bas Nieuwenhuizen <basni at google.com>
> ---
> src/amd/vulkan/radv_descriptor_set.c | 69 +++++++++++++++++++++++++++---------
> src/amd/vulkan/radv_private.h | 4 +++
> 2 files changed, 57 insertions(+), 16 deletions(-)
>
> diff --git a/src/amd/vulkan/radv_descriptor_set.c b/src/amd/vulkan/radv_descriptor_set.c
> index 26f89152d52..89945f17736 100644
> --- a/src/amd/vulkan/radv_descriptor_set.c
> +++ b/src/amd/vulkan/radv_descriptor_set.c
> @@ -265,11 +265,20 @@ radv_descriptor_set_create(struct radv_device *device,
> sizeof(struct radeon_winsys_bo *) * layout->buffer_count;
> unsigned mem_size = range_offset +
> sizeof(struct radv_descriptor_range) * layout->dynamic_offset_count;
> - set = vk_alloc2(&device->alloc, NULL, mem_size, 8,
> - VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
>
> - if (!set)
> - return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY);
> + if (pool->host_memory_base) {
> + if (pool->host_memory_end - pool->host_memory_ptr < mem_size)
> + return vk_error(VK_ERROR_OUT_OF_POOL_MEMORY_KHR);
> +
> + set = (struct radv_descriptor_set*)pool->host_memory_ptr;
> + pool->host_memory_ptr += mem_size;
> + } else {
> + set = vk_alloc2(&device->alloc, NULL, mem_size, 8,
> + VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
> +
> + if (!set)
> + return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY);
> + }
>
> memset(set, 0, mem_size);
>
> @@ -295,6 +304,8 @@ radv_descriptor_set_create(struct radv_device *device,
> uint64_t offset = 0;
> struct list_head *prev = &pool->vram_list;
> struct radv_descriptor_set *cur;
> +
> + assert(!pool->host_memory_base);
> LIST_FOR_EACH_ENTRY(cur, &pool->vram_list, vram_list) {
> uint64_t start = (uint8_t*)cur->mapped_ptr - pool->mapped_ptr;
> if (start - offset >= layout_size)
> @@ -342,6 +353,8 @@ radv_descriptor_set_destroy(struct radv_device *device,
> struct radv_descriptor_set *set,
> bool free_bo)
> {
> + assert(!pool->host_memory_base);
> +
> if (free_bo && set->size)
> list_del(&set->vram_list);
> vk_free2(&device->alloc, NULL, set);
> @@ -356,18 +369,17 @@ VkResult radv_CreateDescriptorPool(
> RADV_FROM_HANDLE(radv_device, device, _device);
> struct radv_descriptor_pool *pool;
> int size = sizeof(struct radv_descriptor_pool);
> - uint64_t bo_size = 0;
> - pool = vk_alloc2(&device->alloc, pAllocator, size, 8,
> - VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
> - if (!pool)
> - return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY);
> + uint64_t bo_size = 0, bo_count = 0, range_count = 0;
>
> - memset(pool, 0, sizeof(*pool));
>
> for (unsigned i = 0; i < pCreateInfo->poolSizeCount; ++i) {
> + if (pCreateInfo->pPoolSizes[i].type != VK_DESCRIPTOR_TYPE_SAMPLER)
> + bo_count += pCreateInfo->pPoolSizes[i].descriptorCount;
> +
> switch(pCreateInfo->pPoolSizes[i].type) {
> case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:
> case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:
> + range_count += pCreateInfo->pPoolSizes[i].descriptorCount;
> break;
> case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
> case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
> @@ -391,6 +403,26 @@ VkResult radv_CreateDescriptorPool(
> }
> }
>
> + if (!(pCreateInfo->flags & VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT)) {
> + uint64_t host_size = pCreateInfo->maxSets * sizeof(struct radv_descriptor_set);
> + host_size += sizeof(struct radeon_winsys_bo*) * bo_count;
> + host_size += sizeof(struct radv_descriptor_range) * range_count;
> + size += host_size;
> + }
> +
> + pool = vk_alloc2(&device->alloc, pAllocator, size, 8,
> + VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
> + if (!pool)
> + return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY);
> +
> + memset(pool, 0, sizeof(*pool));
> +
> + if (!(pCreateInfo->flags & VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT)) {
> + pool->host_memory_base = (uint8_t*)pool + sizeof(struct radv_descriptor_pool);
> + pool->host_memory_ptr = pool->host_memory_base;
> + pool->host_memory_end = (uint8_t*)pool + size;
> + }
> +
> if (bo_size) {
> pool->bo = device->ws->buffer_create(device->ws, bo_size,
> 32, RADEON_DOMAIN_VRAM, 0);
> @@ -414,9 +446,11 @@ void radv_DestroyDescriptorPool(
> if (!pool)
> return;
>
> - list_for_each_entry_safe(struct radv_descriptor_set, set,
> - &pool->vram_list, vram_list) {
> - radv_descriptor_set_destroy(device, pool, set, false);
> + if (!pool->host_memory_base) {
> + list_for_each_entry_safe(struct radv_descriptor_set, set,
> + &pool->vram_list, vram_list) {
> + radv_descriptor_set_destroy(device, pool, set, false);
> + }
> }
>
> if (pool->bo)
> @@ -432,14 +466,17 @@ VkResult radv_ResetDescriptorPool(
> RADV_FROM_HANDLE(radv_device, device, _device);
> RADV_FROM_HANDLE(radv_descriptor_pool, pool, descriptorPool);
>
> - list_for_each_entry_safe(struct radv_descriptor_set, set,
> - &pool->vram_list, vram_list) {
> - radv_descriptor_set_destroy(device, pool, set, false);
> + if (!pool->host_memory_base) {
> + list_for_each_entry_safe(struct radv_descriptor_set, set,
> + &pool->vram_list, vram_list) {
> + radv_descriptor_set_destroy(device, pool, set, false);
> + }
> }
>
> list_inithead(&pool->vram_list);
>
> pool->current_offset = 0;
> + pool->host_memory_ptr = pool->host_memory_base;
>
> return VK_SUCCESS;
> }
> diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h
> index 4ace068742d..3d51dbd2c59 100644
> --- a/src/amd/vulkan/radv_private.h
> +++ b/src/amd/vulkan/radv_private.h
> @@ -570,6 +570,10 @@ struct radv_descriptor_pool {
> uint64_t size;
>
> struct list_head vram_list;
> +
> + uint8_t *host_memory_base;
> + uint8_t *host_memory_ptr;
> + uint8_t *host_memory_end;
> };
>
> struct radv_descriptor_update_template_entry {
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: OpenPGP digital signature
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20170420/cf73df06/attachment.sig>
More information about the mesa-dev
mailing list