diff --git a/src/panfrost/vulkan/panvk_mempool.c b/src/panfrost/vulkan/panvk_mempool.c index fdde9354e02..5dedd0ef72c 100644 --- a/src/panfrost/vulkan/panvk_mempool.c +++ b/src/panfrost/vulkan/panvk_mempool.c @@ -56,7 +56,7 @@ static struct panvk_priv_bo * panvk_pool_alloc_backing(struct panvk_pool *pool, size_t sz) { size_t bo_sz = ALIGN_POT(MAX2(pool->base.slab_size, sz), 4096); - struct panvk_priv_bo *bo; + struct panvk_priv_bo *bo = NULL; /* If there's a free BO in our BO pool, let's pick it. */ if (pool->bo_pool && bo_sz == pool->base.slab_size && @@ -71,8 +71,8 @@ panvk_pool_alloc_backing(struct panvk_pool *pool, size_t sz) * flags to this function and keep the read/write, * fragment/vertex+tiler pools separate. */ - bo = panvk_priv_bo_create(pool->dev, bo_sz, pool->props.create_flags, - VK_SYSTEM_ALLOCATION_SCOPE_DEVICE); + panvk_priv_bo_create(pool->dev, bo_sz, pool->props.create_flags, + VK_SYSTEM_ALLOCATION_SCOPE_DEVICE, &bo); } if (bo == NULL) diff --git a/src/panfrost/vulkan/panvk_priv_bo.c b/src/panfrost/vulkan/panvk_priv_bo.c index 1738aa43f08..9c638cf2f7f 100644 --- a/src/panfrost/vulkan/panvk_priv_bo.c +++ b/src/panfrost/vulkan/panvk_priv_bo.c @@ -6,6 +6,7 @@ #include #include "vk_alloc.h" +#include "vk_log.h" #include "panvk_device.h" #include "panvk_priv_bo.h" @@ -14,21 +15,24 @@ #include "genxml/decode.h" -struct panvk_priv_bo * +VkResult panvk_priv_bo_create(struct panvk_device *dev, size_t size, uint32_t flags, - VkSystemAllocationScope scope) + VkSystemAllocationScope scope, struct panvk_priv_bo **out) { + VkResult result; int ret; struct panvk_priv_bo *priv_bo = vk_zalloc(&dev->vk.alloc, sizeof(*priv_bo), 8, scope); if (!priv_bo) - return NULL; + return vk_error(dev, VK_ERROR_OUT_OF_HOST_MEMORY); struct pan_kmod_bo *bo = pan_kmod_bo_alloc(dev->kmod.dev, dev->kmod.vm, size, flags); - if (!bo) + if (!bo) { + result = vk_error(dev, VK_ERROR_OUT_OF_DEVICE_MEMORY); goto err_free_priv_bo; + } priv_bo->bo = bo; priv_bo->dev = dev; @@ -36,8 +40,10 @@ panvk_priv_bo_create(struct panvk_device *dev, size_t size, uint32_t flags, if (!(flags & PAN_KMOD_BO_FLAG_NO_MMAP)) { priv_bo->addr.host = pan_kmod_bo_mmap( bo, 0, pan_kmod_bo_size(bo), PROT_READ | PROT_WRITE, MAP_SHARED, NULL); - if (priv_bo->addr.host == MAP_FAILED) + if (priv_bo->addr.host == MAP_FAILED) { + result = vk_error(dev, VK_ERROR_OUT_OF_HOST_MEMORY); goto err_put_bo; + } } struct pan_kmod_vm_op op = { @@ -57,13 +63,17 @@ panvk_priv_bo_create(struct panvk_device *dev, size_t size, uint32_t flags, op.va.start = util_vma_heap_alloc( &dev->as.heap, op.va.size, op.va.size > 0x200000 ? 0x200000 : 0x1000); simple_mtx_unlock(&dev->as.lock); - if (!op.va.start) + if (!op.va.start) { + result = vk_error(dev, VK_ERROR_OUT_OF_DEVICE_MEMORY); goto err_munmap_bo; + } } ret = pan_kmod_vm_bind(dev->kmod.vm, PAN_KMOD_VM_OP_MODE_IMMEDIATE, &op, 1); - if (ret) + if (ret) { + result = vk_error(dev, VK_ERROR_OUT_OF_DEVICE_MEMORY); goto err_return_va; + } priv_bo->addr.dev = op.va.start; @@ -75,7 +85,8 @@ panvk_priv_bo_create(struct panvk_device *dev, size_t size, uint32_t flags, p_atomic_set(&priv_bo->refcnt, 1); - return priv_bo; + *out = priv_bo; + return VK_SUCCESS; err_return_va: if (!(dev->kmod.vm->flags & PAN_KMOD_VM_FLAG_AUTO_VA)) { @@ -95,7 +106,7 @@ err_put_bo: err_free_priv_bo: vk_free(&dev->vk.alloc, priv_bo); - return NULL; + return result; } static void diff --git a/src/panfrost/vulkan/panvk_priv_bo.h b/src/panfrost/vulkan/panvk_priv_bo.h index 566debb5572..37a98d4b55d 100644 --- a/src/panfrost/vulkan/panvk_priv_bo.h +++ b/src/panfrost/vulkan/panvk_priv_bo.h @@ -27,9 +27,9 @@ struct panvk_priv_bo { } addr; }; -struct panvk_priv_bo *panvk_priv_bo_create(struct panvk_device *dev, - size_t size, uint32_t flags, - VkSystemAllocationScope scope); +VkResult panvk_priv_bo_create(struct panvk_device *dev, size_t size, + uint32_t flags, VkSystemAllocationScope scope, + struct panvk_priv_bo **out); static inline struct panvk_priv_bo * panvk_priv_bo_ref(struct panvk_priv_bo *bo) diff --git a/src/panfrost/vulkan/panvk_vX_descriptor_set.c b/src/panfrost/vulkan/panvk_vX_descriptor_set.c index cbff0b198f6..38e57142ce5 100644 --- a/src/panfrost/vulkan/panvk_vX_descriptor_set.c +++ b/src/panfrost/vulkan/panvk_vX_descriptor_set.c @@ -262,11 +262,12 @@ panvk_per_arch(CreateDescriptorPool)( desc_count += pool->max_sets; uint64_t pool_size = desc_count * PANVK_DESCRIPTOR_SIZE; - pool->desc_bo = panvk_priv_bo_create(device, pool_size, 0, - VK_SYSTEM_ALLOCATION_SCOPE_OBJECT); - if (!pool->desc_bo) { + VkResult result = panvk_priv_bo_create(device, pool_size, 0, + VK_SYSTEM_ALLOCATION_SCOPE_OBJECT, + &pool->desc_bo); + if (result != VK_SUCCESS) { panvk_destroy_descriptor_pool(device, pAllocator, pool); - return vk_error(device, VK_ERROR_OUT_OF_DEVICE_MEMORY); + return result; } uint64_t bo_size = pool->desc_bo->bo->size; assert(pool_size <= bo_size); diff --git a/src/panfrost/vulkan/panvk_vX_device.c b/src/panfrost/vulkan/panvk_vX_device.c index b20360dd09a..f8d65921150 100644 --- a/src/panfrost/vulkan/panvk_vX_device.c +++ b/src/panfrost/vulkan/panvk_vX_device.c @@ -300,25 +300,19 @@ panvk_per_arch(create_device)(struct panvk_physical_device *physical_device, panvk_device_init_mempools(device); #if PAN_ARCH <= 9 - device->tiler_heap = panvk_priv_bo_create( + result = panvk_priv_bo_create( device, 128 * 1024 * 1024, PAN_KMOD_BO_FLAG_NO_MMAP | PAN_KMOD_BO_FLAG_ALLOC_ON_FAULT, - VK_SYSTEM_ALLOCATION_SCOPE_DEVICE); - - if (!device->tiler_heap) { - result = vk_error(physical_device, VK_ERROR_OUT_OF_HOST_MEMORY); + VK_SYSTEM_ALLOCATION_SCOPE_DEVICE, &device->tiler_heap); + if (result != VK_SUCCESS) goto err_free_priv_bos; - } #endif - device->sample_positions = - panvk_priv_bo_create(device, panfrost_sample_positions_buffer_size(), 0, - VK_SYSTEM_ALLOCATION_SCOPE_DEVICE); - - if (!device->sample_positions) { - result = vk_error(physical_device, VK_ERROR_OUT_OF_HOST_MEMORY); + result = panvk_priv_bo_create( + device, panfrost_sample_positions_buffer_size(), 0, + VK_SYSTEM_ALLOCATION_SCOPE_DEVICE, &device->sample_positions); + if (result != VK_SUCCESS) goto err_free_priv_bos; - } panfrost_upload_sample_positions(device->sample_positions->addr.host);