panvk: Refcount private BOs
Will be needed if we want device memory pools. 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/29161>
This commit is contained in:

committed by
Marge Bot

parent
8fcfadf28e
commit
0e5140f88c
@@ -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);
|
||||
|
@@ -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);
|
||||
}
|
||||
|
@@ -8,12 +8,15 @@
|
||||
|
||||
#include <vulkan/vulkan_core.h>
|
||||
|
||||
#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
|
||||
|
@@ -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);
|
||||
}
|
||||
|
@@ -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);
|
||||
|
@@ -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)
|
||||
|
@@ -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);
|
||||
}
|
||||
|
Reference in New Issue
Block a user