mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-03-06 12:10:45 +01:00
panvk: Support returning BOs allocated by panvk_pool to a 'free BO' pool
So all CommandBuffers in a given CommandPool can reuse BOs for their memory pools. Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com> Reviewed-by: Tomeu Vizoso <tomeu.vizoso@collabora.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11695>
This commit is contained in:
parent
d33a3fad64
commit
d629debaca
4 changed files with 68 additions and 19 deletions
|
|
@ -57,12 +57,14 @@ panvk_reset_cmdbuf(struct panvk_cmd_buffer *cmdbuf)
|
|||
panvk_pool_cleanup(&cmdbuf->tls_pool);
|
||||
panvk_pool_cleanup(&cmdbuf->varying_pool);
|
||||
panvk_pool_init(&cmdbuf->desc_pool, &device->physical_device->pdev,
|
||||
0, 64 * 1024, "Command buffer descriptor pool",
|
||||
true);
|
||||
NULL, 0, 64 * 1024,
|
||||
"Command buffer descriptor pool", true);
|
||||
panvk_pool_init(&cmdbuf->tls_pool, &device->physical_device->pdev,
|
||||
PAN_BO_INVISIBLE, 64 * 1024, "TLS pool", false);
|
||||
NULL, PAN_BO_INVISIBLE, 64 * 1024,
|
||||
"TLS pool", false);
|
||||
panvk_pool_init(&cmdbuf->varying_pool, &device->physical_device->pdev,
|
||||
PAN_BO_INVISIBLE, 64 * 1024, "Varyings pool", false);
|
||||
NULL, PAN_BO_INVISIBLE, 64 * 1024,
|
||||
"Varyings pool", false);
|
||||
cmdbuf->status = PANVK_CMD_BUFFER_STATUS_INITIAL;
|
||||
|
||||
for (unsigned i = 0; i < MAX_BIND_POINTS; i++)
|
||||
|
|
@ -88,12 +90,14 @@ panvk_create_cmdbuf(struct panvk_device *device,
|
|||
cmdbuf->level = level;
|
||||
cmdbuf->pool = pool;
|
||||
panvk_pool_init(&cmdbuf->desc_pool, &device->physical_device->pdev,
|
||||
0, 64 * 1024, "Command buffer descriptor pool",
|
||||
true);
|
||||
NULL, 0, 64 * 1024,
|
||||
"Command buffer descriptor pool", true);
|
||||
panvk_pool_init(&cmdbuf->tls_pool, &device->physical_device->pdev,
|
||||
PAN_BO_INVISIBLE, 64 * 1024, "TLS pool", false);
|
||||
NULL, PAN_BO_INVISIBLE, 64 * 1024,
|
||||
"TLS pool", false);
|
||||
panvk_pool_init(&cmdbuf->varying_pool, &device->physical_device->pdev,
|
||||
PAN_BO_INVISIBLE, 64 * 1024, "Varyings pool", false);
|
||||
NULL, PAN_BO_INVISIBLE, 64 * 1024,
|
||||
"Varyings pool", false);
|
||||
list_inithead(&cmdbuf->batches);
|
||||
cmdbuf->status = PANVK_CMD_BUFFER_STATUS_INITIAL;
|
||||
*cmdbuf_out = cmdbuf;
|
||||
|
|
|
|||
|
|
@ -43,6 +43,11 @@
|
|||
static struct panfrost_bo *
|
||||
panvk_pool_alloc_backing(struct panvk_pool *pool, size_t bo_sz)
|
||||
{
|
||||
/* If there's a free BO in our BO pool, let's pick it. */
|
||||
if (pool->bo_pool &&
|
||||
util_dynarray_num_elements(&pool->bo_pool->free_bos, struct panfrost_bo *))
|
||||
return util_dynarray_pop(&pool->bo_pool->free_bos, struct panfrost_bo *);
|
||||
|
||||
/* We don't know what the BO will be used for, so let's flag it
|
||||
* RW and attach it to both the fragment and vertex/tiler jobs.
|
||||
* TODO: if we want fine grained BO assignment we should pass
|
||||
|
|
@ -89,12 +94,14 @@ panvk_pool_alloc_aligned(struct panvk_pool *pool, size_t sz, unsigned alignment)
|
|||
PAN_POOL_ALLOCATOR(struct panvk_pool, panvk_pool_alloc_aligned)
|
||||
|
||||
void
|
||||
panvk_pool_init(struct panvk_pool *pool, struct panfrost_device *dev,
|
||||
panvk_pool_init(struct panvk_pool *pool,
|
||||
struct panfrost_device *dev, struct panvk_bo_pool *bo_pool,
|
||||
unsigned create_flags, size_t slab_size, const char *label,
|
||||
bool prealloc)
|
||||
{
|
||||
memset(pool, 0, sizeof(*pool));
|
||||
pan_pool_init(&pool->base, dev, create_flags, slab_size, label);
|
||||
pool->bo_pool = bo_pool;
|
||||
|
||||
util_dynarray_init(&pool->bos, NULL);
|
||||
|
||||
|
|
@ -102,12 +109,27 @@ panvk_pool_init(struct panvk_pool *pool, struct panfrost_device *dev,
|
|||
panvk_pool_alloc_backing(pool, pool->base.slab_size);
|
||||
}
|
||||
|
||||
void
|
||||
panvk_pool_reset(struct panvk_pool *pool)
|
||||
{
|
||||
if (pool->bo_pool) {
|
||||
unsigned num_bos = panvk_pool_num_bos(pool);
|
||||
void *ptr = util_dynarray_grow(&pool->bo_pool->free_bos,
|
||||
struct panfrost_bo *, num_bos);
|
||||
memcpy(ptr, util_dynarray_begin(&pool->bos),
|
||||
num_bos * sizeof(struct panfrost_bo *));
|
||||
} else {
|
||||
util_dynarray_foreach(&pool->bos, struct panfrost_bo *, bo)
|
||||
panfrost_bo_unreference(*bo);
|
||||
}
|
||||
|
||||
util_dynarray_clear(&pool->bos);
|
||||
}
|
||||
|
||||
void
|
||||
panvk_pool_cleanup(struct panvk_pool *pool)
|
||||
{
|
||||
util_dynarray_foreach(&pool->bos, struct panfrost_bo *, bo)
|
||||
panfrost_bo_unreference(*bo);
|
||||
|
||||
panvk_pool_reset(pool);
|
||||
util_dynarray_fini(&pool->bos);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -27,6 +27,22 @@
|
|||
|
||||
#include "pan_pool.h"
|
||||
|
||||
struct panvk_bo_pool {
|
||||
struct util_dynarray free_bos;
|
||||
};
|
||||
|
||||
static inline void panvk_bo_pool_init(struct panvk_bo_pool *bo_pool)
|
||||
{
|
||||
util_dynarray_init(&bo_pool->free_bos, NULL);
|
||||
}
|
||||
|
||||
static inline void panvk_bo_pool_cleanup(struct panvk_bo_pool *bo_pool)
|
||||
{
|
||||
util_dynarray_foreach(&bo_pool->free_bos, struct panfrost_bo *, bo)
|
||||
panfrost_bo_unreference(*bo);
|
||||
util_dynarray_fini(&bo_pool->free_bos);
|
||||
}
|
||||
|
||||
/* Represents grow-only memory. It may be owned by the batch (OpenGL), or may
|
||||
be unowned for persistent uploads. */
|
||||
|
||||
|
|
@ -34,6 +50,11 @@ struct panvk_pool {
|
|||
/* Inherit from pan_pool */
|
||||
struct pan_pool base;
|
||||
|
||||
/* Before allocating a new BO, check if the BO pool has free BOs.
|
||||
* When returning BOs, if bo_pool != NULL, return them to this bo_pool.
|
||||
*/
|
||||
struct panvk_bo_pool *bo_pool;
|
||||
|
||||
/* BOs allocated by this pool */
|
||||
struct util_dynarray bos;
|
||||
|
||||
|
|
@ -42,7 +63,6 @@ struct panvk_pool {
|
|||
|
||||
/* Within the topmost transient BO, how much has been used? */
|
||||
unsigned transient_offset;
|
||||
|
||||
};
|
||||
|
||||
static inline struct panvk_pool *
|
||||
|
|
@ -53,8 +73,11 @@ to_panvk_pool(struct pan_pool *pool)
|
|||
|
||||
void
|
||||
panvk_pool_init(struct panvk_pool *pool, struct panfrost_device *dev,
|
||||
unsigned create_flags, size_t slab_size, const char *label,
|
||||
bool prealloc);
|
||||
struct panvk_bo_pool *bo_pool, unsigned create_flags,
|
||||
size_t slab_size, const char *label, bool prealloc);
|
||||
|
||||
void
|
||||
panvk_pool_reset(struct panvk_pool *pool);
|
||||
|
||||
void
|
||||
panvk_pool_cleanup(struct panvk_pool *pool);
|
||||
|
|
|
|||
|
|
@ -154,14 +154,14 @@ panvk_CmdClearAttachments(VkCommandBuffer commandBuffer,
|
|||
void
|
||||
panvk_meta_init(struct panvk_physical_device *dev)
|
||||
{
|
||||
panvk_pool_init(&dev->meta.bin_pool, &dev->pdev, PAN_BO_EXECUTE,
|
||||
panvk_pool_init(&dev->meta.bin_pool, &dev->pdev, NULL, PAN_BO_EXECUTE,
|
||||
16 * 1024, "panvk_meta binary pool", false);
|
||||
panvk_pool_init(&dev->meta.desc_pool, &dev->pdev, 0,
|
||||
panvk_pool_init(&dev->meta.desc_pool, &dev->pdev, NULL, 0,
|
||||
16 * 1024, "panvk_meta descriptor pool", false);
|
||||
panvk_pool_init(&dev->meta.blitter.bin_pool, &dev->pdev,
|
||||
panvk_pool_init(&dev->meta.blitter.bin_pool, &dev->pdev, NULL,
|
||||
PAN_BO_EXECUTE, 16 * 1024,
|
||||
"panvk_meta blitter binary pool", false);
|
||||
panvk_pool_init(&dev->meta.blitter.desc_pool, &dev->pdev,
|
||||
panvk_pool_init(&dev->meta.blitter.desc_pool, &dev->pdev, NULL,
|
||||
0, 16 * 1024, "panvk_meta blitter descriptor pool",
|
||||
false);
|
||||
pan_blitter_init(&dev->pdev, &dev->meta.blitter.bin_pool.base,
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue