Acked-by: Edward O'Callaghan <[email protected]>

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 <[email protected]>
> ---
>  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 {
> 

Attachment: signature.asc
Description: OpenPGP digital signature

_______________________________________________
mesa-dev mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to