Mesa (main): panvk: Add VkCommandPool support
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Mon Jul 5 05:56:29 UTC 2021
Module: Mesa
Branch: main
Commit: 9a0e0af4970a829aff1ce577cc0902107073cf79
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=9a0e0af4970a829aff1ce577cc0902107073cf79
Author: Tomeu Vizoso <tomeu.vizoso at collabora.com>
Date: Thu Jun 3 15:03:21 2021 +0200
panvk: Add VkCommandPool support
Mostly just copied from turnip.
Signed-off-by: Tomeu Vizoso <tomeu.vizoso at collabora.com>
Reviewed-by: Boris Brezillon <boris.brezillon at collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11695>
---
src/panfrost/vulkan/panvk_cmd_buffer.c | 105 +++++++++++++++++++++++++--------
src/panfrost/vulkan/panvk_private.h | 7 +++
2 files changed, 89 insertions(+), 23 deletions(-)
diff --git a/src/panfrost/vulkan/panvk_cmd_buffer.c b/src/panfrost/vulkan/panvk_cmd_buffer.c
index baf85007386..654a06f10e3 100644
--- a/src/panfrost/vulkan/panvk_cmd_buffer.c
+++ b/src/panfrost/vulkan/panvk_cmd_buffer.c
@@ -40,7 +40,6 @@
static VkResult
panvk_reset_cmdbuf(struct panvk_cmd_buffer *cmdbuf)
{
- struct panvk_device *device = cmdbuf->device;
struct panfrost_device *pdev = &cmdbuf->device->physical_device->pdev;
cmdbuf->record_result = VK_SUCCESS;
@@ -53,18 +52,9 @@ panvk_reset_cmdbuf(struct panvk_cmd_buffer *cmdbuf)
vk_free(&cmdbuf->pool->alloc, batch);
}
- panvk_pool_cleanup(&cmdbuf->desc_pool);
- panvk_pool_cleanup(&cmdbuf->tls_pool);
- panvk_pool_cleanup(&cmdbuf->varying_pool);
- panvk_pool_init(&cmdbuf->desc_pool, &device->physical_device->pdev,
- NULL, 0, 64 * 1024,
- "Command buffer descriptor pool", true);
- panvk_pool_init(&cmdbuf->tls_pool, &device->physical_device->pdev,
- NULL, PAN_BO_INVISIBLE, 64 * 1024,
- "TLS pool", false);
- panvk_pool_init(&cmdbuf->varying_pool, &device->physical_device->pdev,
- NULL, PAN_BO_INVISIBLE, 64 * 1024,
- "Varyings pool", false);
+ panvk_pool_reset(&cmdbuf->desc_pool);
+ panvk_pool_reset(&cmdbuf->tls_pool);
+ panvk_pool_reset(&cmdbuf->varying_pool);
cmdbuf->status = PANVK_CMD_BUFFER_STATUS_INITIAL;
for (unsigned i = 0; i < MAX_BIND_POINTS; i++)
@@ -89,15 +79,27 @@ panvk_create_cmdbuf(struct panvk_device *device,
cmdbuf->device = device;
cmdbuf->level = level;
cmdbuf->pool = pool;
+
+ if (pool) {
+ list_addtail(&cmdbuf->pool_link, &pool->active_cmd_buffers);
+ cmdbuf->queue_family_index = pool->queue_family_index;
+ } else {
+ /* Init the pool_link so we can safely call list_del when we destroy
+ * the command buffer
+ */
+ list_inithead(&cmdbuf->pool_link);
+ cmdbuf->queue_family_index = PANVK_QUEUE_GENERAL;
+ }
+
panvk_pool_init(&cmdbuf->desc_pool, &device->physical_device->pdev,
- NULL, 0, 64 * 1024,
+ pool ? &pool->desc_bo_pool : NULL, 0, 64 * 1024,
"Command buffer descriptor pool", true);
panvk_pool_init(&cmdbuf->tls_pool, &device->physical_device->pdev,
- NULL, PAN_BO_INVISIBLE, 64 * 1024,
- "TLS pool", false);
+ pool ? &pool->tls_bo_pool : NULL,
+ PAN_BO_INVISIBLE, 64 * 1024, "TLS pool", false);
panvk_pool_init(&cmdbuf->varying_pool, &device->physical_device->pdev,
- NULL, PAN_BO_INVISIBLE, 64 * 1024,
- "Varyings pool", false);
+ pool ? &pool->varying_bo_pool : NULL,
+ PAN_BO_INVISIBLE, 64 * 1024, "Varyings pool", false);
list_inithead(&cmdbuf->batches);
cmdbuf->status = PANVK_CMD_BUFFER_STATUS_INITIAL;
*cmdbuf_out = cmdbuf;
@@ -110,6 +112,8 @@ panvk_destroy_cmdbuf(struct panvk_cmd_buffer *cmdbuf)
struct panfrost_device *pdev = &cmdbuf->device->physical_device->pdev;
struct panvk_device *device = cmdbuf->device;
+ list_del(&cmdbuf->pool_link);
+
list_for_each_entry_safe(struct panvk_batch, batch, &cmdbuf->batches, node) {
list_del(&batch->node);
util_dynarray_fini(&batch->jobs);
@@ -138,7 +142,19 @@ panvk_AllocateCommandBuffers(VkDevice _device,
for (i = 0; i < pAllocateInfo->commandBufferCount; i++) {
struct panvk_cmd_buffer *cmdbuf = NULL;
- result = panvk_create_cmdbuf(device, pool, pAllocateInfo->level, &cmdbuf);
+ if (!list_is_empty(&pool->free_cmd_buffers)) {
+ cmdbuf = list_first_entry(
+ &pool->free_cmd_buffers, struct panvk_cmd_buffer, pool_link);
+
+ list_del(&cmdbuf->pool_link);
+ list_addtail(&cmdbuf->pool_link, &pool->active_cmd_buffers);
+
+ cmdbuf->level = pAllocateInfo->level;
+ vk_object_base_reset(&cmdbuf->base);
+ } else {
+ result = panvk_create_cmdbuf(device, pool, pAllocateInfo->level, &cmdbuf);
+ }
+
if (result != VK_SUCCESS)
goto err_free_cmd_bufs;
@@ -165,13 +181,21 @@ panvk_FreeCommandBuffers(VkDevice device,
for (uint32_t i = 0; i < commandBufferCount; i++) {
VK_FROM_HANDLE(panvk_cmd_buffer, cmdbuf, pCommandBuffers[i]);
- panvk_destroy_cmdbuf(cmdbuf);
+ if (cmdbuf) {
+ if (cmdbuf->pool) {
+ list_del(&cmdbuf->pool_link);
+ panvk_reset_cmdbuf(cmdbuf);
+ list_addtail(&cmdbuf->pool_link,
+ &cmdbuf->pool->free_cmd_buffers);
+ } else
+ panvk_destroy_cmdbuf(cmdbuf);
+ }
}
}
VkResult
panvk_ResetCommandBuffer(VkCommandBuffer commandBuffer,
- VkCommandBufferResetFlags flags)
+ VkCommandBufferResetFlags flags)
{
VK_FROM_HANDLE(panvk_cmd_buffer, cmdbuf, commandBuffer);
@@ -477,7 +501,13 @@ panvk_CreateCommandPool(VkDevice _device,
else
pool->alloc = device->vk.alloc;
+ list_inithead(&pool->active_cmd_buffers);
+ list_inithead(&pool->free_cmd_buffers);
+
pool->queue_family_index = pCreateInfo->queueFamilyIndex;
+ panvk_bo_pool_init(&pool->desc_bo_pool);
+ panvk_bo_pool_init(&pool->varying_bo_pool);
+ panvk_bo_pool_init(&pool->tls_bo_pool);
*pCmdPool = panvk_cmd_pool_to_handle(pool);
return VK_SUCCESS;
}
@@ -489,6 +519,18 @@ panvk_DestroyCommandPool(VkDevice _device,
{
VK_FROM_HANDLE(panvk_device, device, _device);
VK_FROM_HANDLE(panvk_cmd_pool, pool, commandPool);
+
+ list_for_each_entry_safe(struct panvk_cmd_buffer, cmdbuf,
+ &pool->active_cmd_buffers, pool_link)
+ panvk_destroy_cmdbuf(cmdbuf);
+
+ list_for_each_entry_safe(struct panvk_cmd_buffer, cmdbuf,
+ &pool->free_cmd_buffers, pool_link)
+ panvk_destroy_cmdbuf(cmdbuf);
+
+ panvk_bo_pool_cleanup(&pool->desc_bo_pool);
+ panvk_bo_pool_cleanup(&pool->varying_bo_pool);
+ panvk_bo_pool_cleanup(&pool->tls_bo_pool);
vk_object_free(&device->vk, pAllocator, pool);
}
@@ -497,7 +539,17 @@ panvk_ResetCommandPool(VkDevice device,
VkCommandPool commandPool,
VkCommandPoolResetFlags flags)
{
- panvk_stub();
+ VK_FROM_HANDLE(panvk_cmd_pool, pool, commandPool);
+ VkResult result;
+
+ list_for_each_entry(struct panvk_cmd_buffer, cmdbuf, &pool->active_cmd_buffers,
+ pool_link)
+ {
+ result = panvk_reset_cmdbuf(cmdbuf);
+ if (result != VK_SUCCESS)
+ return result;
+ }
+
return VK_SUCCESS;
}
@@ -506,7 +558,14 @@ panvk_TrimCommandPool(VkDevice device,
VkCommandPool commandPool,
VkCommandPoolTrimFlags flags)
{
- panvk_stub();
+ VK_FROM_HANDLE(panvk_cmd_pool, pool, commandPool);
+
+ if (!pool)
+ return;
+
+ list_for_each_entry_safe(struct panvk_cmd_buffer, cmdbuf,
+ &pool->free_cmd_buffers, pool_link)
+ panvk_destroy_cmdbuf(cmdbuf);
}
static void
diff --git a/src/panfrost/vulkan/panvk_private.h b/src/panfrost/vulkan/panvk_private.h
index 5d074533e50..e644c0e1ca0 100644
--- a/src/panfrost/vulkan/panvk_private.h
+++ b/src/panfrost/vulkan/panvk_private.h
@@ -67,6 +67,7 @@
#include "pan_texture.h"
#include "pan_scoreboard.h"
#include "pan_shader.h"
+#include "vk_extensions.h"
#include "panvk_varyings.h"
/* Pre-declarations needed for WSI entrypoints */
@@ -601,7 +602,12 @@ struct panvk_cmd_state {
struct panvk_cmd_pool {
struct vk_object_base base;
VkAllocationCallbacks alloc;
+ struct list_head active_cmd_buffers;
+ struct list_head free_cmd_buffers;
uint32_t queue_family_index;
+ struct panvk_bo_pool desc_bo_pool;
+ struct panvk_bo_pool varying_bo_pool;
+ struct panvk_bo_pool tls_bo_pool;
};
enum panvk_cmd_buffer_status {
@@ -618,6 +624,7 @@ struct panvk_cmd_buffer {
struct panvk_device *device;
struct panvk_cmd_pool *pool;
+ struct list_head pool_link;
struct panvk_pool desc_pool;
struct panvk_pool varying_pool;
struct panvk_pool tls_pool;
More information about the mesa-commit
mailing list