Mesa (main): vulkan: Implement of a bunch of VkCommandPool functions
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Fri Feb 11 08:46:49 UTC 2022
Module: Mesa
Branch: main
Commit: 37f3da90dd3d9817aca17d83ddffbf449f023013
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=37f3da90dd3d9817aca17d83ddffbf449f023013
Author: Jason Ekstrand <jason.ekstrand at collabora.com>
Date: Mon Feb 7 13:11:19 2022 -0600
vulkan: Implement of a bunch of VkCommandPool functions
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
Reviewed-by: Boris Brezillon <boris.brezillon at collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14917>
---
src/vulkan/runtime/vk_command_buffer.c | 3 +
src/vulkan/runtime/vk_command_buffer.h | 11 ++++
src/vulkan/runtime/vk_command_pool.c | 105 +++++++++++++++++++++++++++++++++
src/vulkan/runtime/vk_command_pool.h | 4 ++
4 files changed, 123 insertions(+)
diff --git a/src/vulkan/runtime/vk_command_buffer.c b/src/vulkan/runtime/vk_command_buffer.c
index 6195d0a7a0b..160d9440c27 100644
--- a/src/vulkan/runtime/vk_command_buffer.c
+++ b/src/vulkan/runtime/vk_command_buffer.c
@@ -39,6 +39,8 @@ vk_command_buffer_init(struct vk_command_buffer *command_buffer,
util_dynarray_init(&command_buffer->labels, NULL);
command_buffer->region_begin = true;
+ list_add(&command_buffer->pool_link, &pool->command_buffers);
+
return VK_SUCCESS;
}
@@ -52,6 +54,7 @@ vk_command_buffer_reset(struct vk_command_buffer *command_buffer)
void
vk_command_buffer_finish(struct vk_command_buffer *command_buffer)
{
+ list_del(&command_buffer->pool_link);
util_dynarray_fini(&command_buffer->labels);
vk_object_base_finish(&command_buffer->base);
}
diff --git a/src/vulkan/runtime/vk_command_buffer.h b/src/vulkan/runtime/vk_command_buffer.h
index 5d3dc5d850a..6ad5c71baa2 100644
--- a/src/vulkan/runtime/vk_command_buffer.h
+++ b/src/vulkan/runtime/vk_command_buffer.h
@@ -25,6 +25,7 @@
#define VK_COMMAND_BUFFER_H
#include "vk_object.h"
+#include "util/list.h"
#include "util/u_dynarray.h"
#ifdef __cplusplus
@@ -41,6 +42,16 @@ struct vk_command_buffer {
/** VkCommandBufferAllocateInfo::level */
VkCommandBufferLevel level;
+ /** Link in vk_command_pool::command_buffers if pool != NULL */
+ struct list_head pool_link;
+
+ /** Destroys the command buffer
+ *
+ * Used by the common command pool implementation. This function MUST
+ * call vk_command_buffer_finish().
+ */
+ void (*destroy)(struct vk_command_buffer *);
+
/**
* VK_EXT_debug_utils
*
diff --git a/src/vulkan/runtime/vk_command_pool.c b/src/vulkan/runtime/vk_command_pool.c
index cfb18bb8150..f4f5ff4decb 100644
--- a/src/vulkan/runtime/vk_command_pool.c
+++ b/src/vulkan/runtime/vk_command_pool.c
@@ -24,8 +24,11 @@
#include "vk_command_pool.h"
+#include "vk_alloc.h"
+#include "vk_command_buffer.h"
#include "vk_common_entrypoints.h"
#include "vk_device.h"
+#include "vk_log.h"
VkResult MUST_CHECK
vk_command_pool_init(struct vk_command_pool *pool,
@@ -40,6 +43,7 @@ vk_command_pool_init(struct vk_command_pool *pool,
pool->flags = pCreateInfo->flags;
pool->queue_family_index = pCreateInfo->queueFamilyIndex;
pool->alloc = pAllocator ? *pAllocator : device->alloc;
+ list_inithead(&pool->command_buffers);
return VK_SUCCESS;
}
@@ -47,5 +51,106 @@ vk_command_pool_init(struct vk_command_pool *pool,
void
vk_command_pool_finish(struct vk_command_pool *pool)
{
+ list_for_each_entry_safe(struct vk_command_buffer, cmd_buffer,
+ &pool->command_buffers, pool_link) {
+ cmd_buffer->destroy(cmd_buffer);
+ }
+ assert(list_is_empty(&pool->command_buffers));
+
vk_object_base_finish(&pool->base);
}
+
+VKAPI_ATTR VkResult VKAPI_CALL
+vk_common_CreateCommandPool(VkDevice _device,
+ const VkCommandPoolCreateInfo *pCreateInfo,
+ const VkAllocationCallbacks *pAllocator,
+ VkCommandPool *pCommandPool)
+{
+ VK_FROM_HANDLE(vk_device, device, _device);
+ struct vk_command_pool *pool;
+ VkResult result;
+
+ pool = vk_alloc2(&device->alloc, pAllocator, sizeof(*pool), 8,
+ VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
+ if (pool == NULL)
+ return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
+
+ result = vk_command_pool_init(pool, device, pCreateInfo, pAllocator);
+ if (unlikely(result != VK_SUCCESS)) {
+ vk_free2(&device->alloc, pAllocator, pool);
+ return result;
+ }
+
+ *pCommandPool = vk_command_pool_to_handle(pool);
+
+ return VK_SUCCESS;
+}
+
+VKAPI_ATTR void VKAPI_CALL
+vk_common_DestroyCommandPool(VkDevice _device,
+ VkCommandPool commandPool,
+ const VkAllocationCallbacks *pAllocator)
+{
+ VK_FROM_HANDLE(vk_device, device, _device);
+ VK_FROM_HANDLE(vk_command_pool, pool, commandPool);
+
+ if (pool == NULL)
+ return;
+
+ vk_command_pool_finish(pool);
+ vk_free2(&device->alloc, pAllocator, pool);
+}
+
+VKAPI_ATTR VkResult VKAPI_CALL
+vk_common_ResetCommandPool(VkDevice device,
+ VkCommandPool commandPool,
+ VkCommandPoolResetFlags flags)
+{
+ VK_FROM_HANDLE(vk_command_pool, pool, commandPool);
+ const struct vk_device_dispatch_table *disp =
+ &pool->base.device->dispatch_table;
+
+#define COPY_FLAG(flag) \
+ if (flags & VK_COMMAND_POOL_RESET_##flag) \
+ cb_flags |= VK_COMMAND_BUFFER_RESET_##flag
+
+ VkCommandBufferResetFlags cb_flags = 0;
+ COPY_FLAG(RELEASE_RESOURCES_BIT);
+
+#undef COPY_FLAG
+
+ list_for_each_entry_safe(struct vk_command_buffer, cmd_buffer,
+ &pool->command_buffers, pool_link) {
+ VkResult result =
+ disp->ResetCommandBuffer(vk_command_buffer_to_handle(cmd_buffer),
+ cb_flags);
+ if (result != VK_SUCCESS)
+ return result;
+ }
+
+ return VK_SUCCESS;
+}
+
+VKAPI_ATTR void VKAPI_CALL
+vk_common_FreeCommandBuffers(VkDevice device,
+ VkCommandPool commandPool,
+ uint32_t commandBufferCount,
+ const VkCommandBuffer *pCommandBuffers)
+{
+ for (uint32_t i = 0; i < commandBufferCount; i++) {
+ VK_FROM_HANDLE(vk_command_buffer, cmd_buffer, pCommandBuffers[i]);
+
+ if (cmd_buffer == NULL)
+ continue;
+
+ cmd_buffer->destroy(cmd_buffer);
+ }
+}
+
+VKAPI_ATTR void VKAPI_CALL
+vk_common_TrimCommandPool(VkDevice device,
+ VkCommandPool commandPool,
+ VkCommandPoolTrimFlags flags)
+{
+ /* No-op is a valid implementation but may not be optimal */
+}
diff --git a/src/vulkan/runtime/vk_command_pool.h b/src/vulkan/runtime/vk_command_pool.h
index 0eb43be45cd..9ee4154309b 100644
--- a/src/vulkan/runtime/vk_command_pool.h
+++ b/src/vulkan/runtime/vk_command_pool.h
@@ -25,6 +25,7 @@
#define VK_COMMAND_POOL_H
#include "vk_object.h"
+#include "util/list.h"
#ifdef __cplusplus
extern "C" {
@@ -41,6 +42,9 @@ struct vk_command_pool {
/** Allocator passed to vkCreateCommandPool() */
VkAllocationCallbacks alloc;
+
+ /** List of all command buffers */
+ struct list_head command_buffers;
};
VK_DEFINE_NONDISP_HANDLE_CASTS(vk_command_pool, base, VkCommandPool,
More information about the mesa-commit
mailing list