diff --git a/src/panfrost/vulkan/panvk_mempool.c b/src/panfrost/vulkan/panvk_mempool.c index 146693d7ff0..a6b00e0e0fc 100644 --- a/src/panfrost/vulkan/panvk_mempool.c +++ b/src/panfrost/vulkan/panvk_mempool.c @@ -32,7 +32,7 @@ void panvk_bo_pool_cleanup(struct panvk_bo_pool *bo_pool) { util_dynarray_foreach(&bo_pool->free_bos, struct panvk_priv_bo *, bo) - panvk_priv_bo_destroy(*bo, NULL); + panvk_priv_bo_unref(*bo); util_dynarray_fini(&bo_pool->free_bos); } @@ -68,7 +68,7 @@ panvk_pool_alloc_backing(struct panvk_pool *pool, size_t bo_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->create_flags, NULL, + bo = panvk_priv_bo_create(pool->dev, bo_sz, pool->create_flags, VK_SYSTEM_ALLOCATION_SCOPE_DEVICE); } @@ -139,11 +139,11 @@ panvk_pool_reset(struct panvk_pool *pool) num_bos * sizeof(struct panvk_priv_bo *)); } else { util_dynarray_foreach(&pool->bos, struct panvk_priv_bo *, bo) - panvk_priv_bo_destroy(*bo, NULL); + panvk_priv_bo_unref(*bo); } util_dynarray_foreach(&pool->big_bos, struct panvk_priv_bo *, bo) - panvk_priv_bo_destroy(*bo, NULL); + panvk_priv_bo_unref(*bo); util_dynarray_clear(&pool->bos); util_dynarray_clear(&pool->big_bos); diff --git a/src/panfrost/vulkan/panvk_priv_bo.c b/src/panfrost/vulkan/panvk_priv_bo.c index efcc04e1e41..b4981d7291f 100644 --- a/src/panfrost/vulkan/panvk_priv_bo.c +++ b/src/panfrost/vulkan/panvk_priv_bo.c @@ -16,12 +16,11 @@ struct panvk_priv_bo * panvk_priv_bo_create(struct panvk_device *dev, size_t size, uint32_t flags, - const struct VkAllocationCallbacks *alloc, VkSystemAllocationScope scope) { int ret; struct panvk_priv_bo *priv_bo = - vk_zalloc2(&dev->vk.alloc, alloc, sizeof(*priv_bo), 8, scope); + vk_zalloc(&dev->vk.alloc, sizeof(*priv_bo), 8, scope); if (!priv_bo) return NULL; @@ -65,6 +64,8 @@ panvk_priv_bo_create(struct panvk_device *dev, size_t size, uint32_t flags, NULL); } + p_atomic_set(&priv_bo->refcnt, 1); + return priv_bo; err_munmap_bo: @@ -77,17 +78,13 @@ err_put_bo: pan_kmod_bo_put(bo); err_free_priv_bo: - vk_free2(&dev->vk.alloc, alloc, priv_bo); + vk_free(&dev->vk.alloc, priv_bo); return NULL; } -void -panvk_priv_bo_destroy(struct panvk_priv_bo *priv_bo, - const VkAllocationCallbacks *alloc) +static void +panvk_priv_bo_destroy(struct panvk_priv_bo *priv_bo) { - if (!priv_bo) - return; - struct panvk_device *dev = priv_bo->dev; if (dev->debug.decode_ctx) { @@ -112,5 +109,14 @@ panvk_priv_bo_destroy(struct panvk_priv_bo *priv_bo, } pan_kmod_bo_put(priv_bo->bo); - vk_free2(&dev->vk.alloc, alloc, priv_bo); + vk_free(&dev->vk.alloc, priv_bo); +} + +void +panvk_priv_bo_unref(struct panvk_priv_bo *priv_bo) +{ + if (!priv_bo || p_atomic_dec_return(&priv_bo->refcnt)) + return; + + panvk_priv_bo_destroy(priv_bo); } diff --git a/src/panfrost/vulkan/panvk_priv_bo.h b/src/panfrost/vulkan/panvk_priv_bo.h index 381027c795a..e9b93dde454 100644 --- a/src/panfrost/vulkan/panvk_priv_bo.h +++ b/src/panfrost/vulkan/panvk_priv_bo.h @@ -8,12 +8,15 @@ #include +#include "util/u_atomic.h" + #include "panfrost-job.h" struct panvk_kmod_bo; /* Used for internal object allocation. */ struct panvk_priv_bo { + uint64_t refcnt; struct panvk_device *dev; struct pan_kmod_bo *bo; struct { @@ -24,10 +27,16 @@ struct panvk_priv_bo { struct panvk_priv_bo *panvk_priv_bo_create(struct panvk_device *dev, size_t size, uint32_t flags, - const VkAllocationCallbacks *alloc, VkSystemAllocationScope scope); -void panvk_priv_bo_destroy(struct panvk_priv_bo *bo, - const VkAllocationCallbacks *alloc); +static inline struct panvk_priv_bo * +panvk_priv_bo_ref(struct panvk_priv_bo *bo) +{ + assert(p_atomic_read(&bo->refcnt) > 0); + p_atomic_inc(&bo->refcnt); + return bo; +} + +void panvk_priv_bo_unref(struct panvk_priv_bo *bo); #endif diff --git a/src/panfrost/vulkan/panvk_vX_buffer_view.c b/src/panfrost/vulkan/panvk_vX_buffer_view.c index 9d45a671d6b..694322f9572 100644 --- a/src/panfrost/vulkan/panvk_vX_buffer_view.c +++ b/src/panfrost/vulkan/panvk_vX_buffer_view.c @@ -94,7 +94,7 @@ panvk_per_arch(CreateBufferView)(VkDevice _device, unsigned bo_size = GENX(panfrost_estimate_texture_payload_size)(&pview); - view->bo = panvk_priv_bo_create(device, bo_size, 0, pAllocator, + view->bo = panvk_priv_bo_create(device, bo_size, 0, VK_SYSTEM_ALLOCATION_SCOPE_OBJECT); struct panfrost_ptr ptr = { @@ -151,6 +151,6 @@ panvk_per_arch(DestroyBufferView)(VkDevice _device, VkBufferView bufferView, if (!view) return; - panvk_priv_bo_destroy(view->bo, pAllocator); + panvk_priv_bo_unref(view->bo); vk_buffer_view_destroy(&device->vk, pAllocator, &view->vk); } diff --git a/src/panfrost/vulkan/panvk_vX_descriptor_set.c b/src/panfrost/vulkan/panvk_vX_descriptor_set.c index a5dff33688c..cbff0b198f6 100644 --- a/src/panfrost/vulkan/panvk_vX_descriptor_set.c +++ b/src/panfrost/vulkan/panvk_vX_descriptor_set.c @@ -220,7 +220,7 @@ panvk_destroy_descriptor_pool(struct panvk_device *device, if (pool->desc_bo) { util_vma_heap_finish(&pool->desc_heap); - panvk_priv_bo_destroy(pool->desc_bo, NULL); + panvk_priv_bo_unref(pool->desc_bo); } vk_object_free(&device->vk, pAllocator, pool); @@ -262,7 +262,7 @@ 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, NULL, + pool->desc_bo = panvk_priv_bo_create(device, pool_size, 0, VK_SYSTEM_ALLOCATION_SCOPE_OBJECT); if (!pool->desc_bo) { panvk_destroy_descriptor_pool(device, pAllocator, pool); diff --git a/src/panfrost/vulkan/panvk_vX_device.c b/src/panfrost/vulkan/panvk_vX_device.c index 744dd045173..377dd4fba17 100644 --- a/src/panfrost/vulkan/panvk_vX_device.c +++ b/src/panfrost/vulkan/panvk_vX_device.c @@ -131,11 +131,11 @@ panvk_per_arch(create_device)(struct panvk_physical_device *physical_device, device->tiler_heap = panvk_priv_bo_create( device, 128 * 1024 * 1024, PAN_KMOD_BO_FLAG_NO_MMAP | PAN_KMOD_BO_FLAG_ALLOC_ON_FAULT, - &device->vk.alloc, VK_SYSTEM_ALLOCATION_SCOPE_DEVICE); - - device->sample_positions = panvk_priv_bo_create( - device, panfrost_sample_positions_buffer_size(), 0, &device->vk.alloc, VK_SYSTEM_ALLOCATION_SCOPE_DEVICE); + + device->sample_positions = + panvk_priv_bo_create(device, panfrost_sample_positions_buffer_size(), 0, + VK_SYSTEM_ALLOCATION_SCOPE_DEVICE); panfrost_upload_sample_positions(device->sample_positions->addr.host); vk_device_set_drm_fd(&device->vk, device->kmod.dev->fd); @@ -182,8 +182,8 @@ fail: panvk_per_arch(meta_cleanup)(device); panvk_per_arch(blend_shader_cache_cleanup)(device); - panvk_priv_bo_destroy(device->tiler_heap, &device->vk.alloc); - panvk_priv_bo_destroy(device->sample_positions, &device->vk.alloc); + panvk_priv_bo_unref(device->tiler_heap); + panvk_priv_bo_unref(device->sample_positions); pan_kmod_vm_destroy(device->kmod.vm); pan_kmod_dev_destroy(device->kmod.dev); @@ -207,8 +207,8 @@ panvk_per_arch(destroy_device)(struct panvk_device *device, panvk_per_arch(meta_cleanup)(device); panvk_per_arch(blend_shader_cache_cleanup)(device); - panvk_priv_bo_destroy(device->tiler_heap, &device->vk.alloc); - panvk_priv_bo_destroy(device->sample_positions, &device->vk.alloc); + panvk_priv_bo_unref(device->tiler_heap); + panvk_priv_bo_unref(device->sample_positions); pan_kmod_vm_destroy(device->kmod.vm); if (device->debug.decode_ctx) diff --git a/src/panfrost/vulkan/panvk_vX_image_view.c b/src/panfrost/vulkan/panvk_vX_image_view.c index 077bb39e9c2..8a8296bb785 100644 --- a/src/panfrost/vulkan/panvk_vX_image_view.c +++ b/src/panfrost/vulkan/panvk_vX_image_view.c @@ -146,7 +146,7 @@ panvk_per_arch(CreateImageView)(VkDevice _device, unsigned bo_size = GENX(panfrost_estimate_texture_payload_size)(&pview); - view->bo = panvk_priv_bo_create(device, bo_size, 0, pAllocator, + view->bo = panvk_priv_bo_create(device, bo_size, 0, VK_SYSTEM_ALLOCATION_SCOPE_OBJECT); struct panfrost_ptr ptr = { @@ -221,6 +221,6 @@ panvk_per_arch(DestroyImageView)(VkDevice _device, VkImageView _view, if (!view) return; - panvk_priv_bo_destroy(view->bo, NULL); + panvk_priv_bo_unref(view->bo); vk_image_view_destroy(&device->vk, pAllocator, &view->vk); }