Mesa (main): panvk: Support returning BOs allocated by panvk_pool to a 'free BO' pool
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Mon Jul 5 05:56:29 UTC 2021
Module: Mesa
Branch: main
Commit: d629debaca8955aecf7b4c8d62edb6f8de273ab3
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=d629debaca8955aecf7b4c8d62edb6f8de273ab3
Author: Boris Brezillon <boris.brezillon at collabora.com>
Date: Fri Jul 2 11:30:48 2021 +0200
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 at collabora.com>
Reviewed-by: Tomeu Vizoso <tomeu.vizoso at collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11695>
---
src/panfrost/vulkan/panvk_cmd_buffer.c | 20 ++++++++++++--------
src/panfrost/vulkan/panvk_mempool.c | 30 ++++++++++++++++++++++++++----
src/panfrost/vulkan/panvk_mempool.h | 29 ++++++++++++++++++++++++++---
src/panfrost/vulkan/panvk_meta.c | 8 ++++----
4 files changed, 68 insertions(+), 19 deletions(-)
diff --git a/src/panfrost/vulkan/panvk_cmd_buffer.c b/src/panfrost/vulkan/panvk_cmd_buffer.c
index b738054dad4..baf85007386 100644
--- a/src/panfrost/vulkan/panvk_cmd_buffer.c
+++ b/src/panfrost/vulkan/panvk_cmd_buffer.c
@@ -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;
diff --git a/src/panfrost/vulkan/panvk_mempool.c b/src/panfrost/vulkan/panvk_mempool.c
index f5513ff5aa5..0121c14cd2d 100644
--- a/src/panfrost/vulkan/panvk_mempool.c
+++ b/src/panfrost/vulkan/panvk_mempool.c
@@ -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);
@@ -103,11 +110,26 @@ panvk_pool_init(struct panvk_pool *pool, struct panfrost_device *dev,
}
void
-panvk_pool_cleanup(struct panvk_pool *pool)
+panvk_pool_reset(struct panvk_pool *pool)
{
- util_dynarray_foreach(&pool->bos, struct panfrost_bo *, bo)
- panfrost_bo_unreference(*bo);
+ 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)
+{
+ panvk_pool_reset(pool);
util_dynarray_fini(&pool->bos);
}
diff --git a/src/panfrost/vulkan/panvk_mempool.h b/src/panfrost/vulkan/panvk_mempool.h
index 37940725cb8..b56c240ca57 100644
--- a/src/panfrost/vulkan/panvk_mempool.h
+++ b/src/panfrost/vulkan/panvk_mempool.h
@@ -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);
diff --git a/src/panfrost/vulkan/panvk_meta.c b/src/panfrost/vulkan/panvk_meta.c
index 6e6b8ee36d2..7c123d10b2b 100644
--- a/src/panfrost/vulkan/panvk_meta.c
+++ b/src/panfrost/vulkan/panvk_meta.c
@@ -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,
More information about the mesa-commit
mailing list