panvk: Let panvk_priv_bo_create() return a VkResult
Knowing that a private BO couldn't be allocated is not enough, in some situations we need to know why. Rework the panvk_priv_bo_create() to return a VkResult. Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com> Reviewed-by: Mary Guillemard <mary.guillemard@collabora.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/31382>
This commit is contained in:
committed by
Marge Bot
parent
18068517a9
commit
b2ef147f33
@@ -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)
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
#include <assert.h>
|
||||
|
||||
#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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user