v3dv: switch to common code for command buffer lifecycles

This gives us the capacity to recycle command buffers in the pool.
Based on a similar change done by Jason to Anvil.

Reviewed-by: Alejandro Piñeiro <apinheiro@igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/18388>
This commit is contained in:
Iago Toral Quiroga
2022-09-02 11:32:59 +02:00
parent b830091cb6
commit 70ea65490c
3 changed files with 28 additions and 57 deletions
+24 -57
View File
@@ -74,18 +74,13 @@ cmd_buffer_init(struct v3dv_cmd_buffer *cmd_buffer,
cmd_buffer->status = V3DV_CMD_BUFFER_STATUS_INITIALIZED;
}
static void cmd_buffer_destroy(struct vk_command_buffer *cmd_buffer);
static const struct vk_command_buffer_ops cmd_buffer_ops = {
.destroy = cmd_buffer_destroy,
};
static VkResult
cmd_buffer_create(struct v3dv_device *device,
struct vk_command_pool *pool,
VkCommandBufferLevel level,
VkCommandBuffer *pCommandBuffer)
cmd_buffer_create(struct vk_command_pool *pool,
struct vk_command_buffer **cmd_buffer_out)
{
struct v3dv_device *device =
container_of(pool->base.device, struct v3dv_device, vk);
struct v3dv_cmd_buffer *cmd_buffer;
cmd_buffer = vk_zalloc(&pool->alloc,
sizeof(*cmd_buffer),
@@ -94,9 +89,13 @@ cmd_buffer_create(struct v3dv_device *device,
if (cmd_buffer == NULL)
return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
/* Here we pass 0 as level because this callback hook doesn't have the level
* info, but that's fine, vk_common_AllocateCommandBuffers will fix it up
* after creation.
*/
VkResult result;
result = vk_command_buffer_init(pool, &cmd_buffer->vk,
&cmd_buffer_ops, level);
&v3dv_cmd_buffer_ops, 0 /* level */);
if (result != VK_SUCCESS) {
vk_free(&pool->alloc, cmd_buffer);
return result;
@@ -104,7 +103,7 @@ cmd_buffer_create(struct v3dv_device *device,
cmd_buffer_init(cmd_buffer, device);
*pCommandBuffer = v3dv_cmd_buffer_to_handle(cmd_buffer);
*cmd_buffer_out = &cmd_buffer->vk;
return VK_SUCCESS;
}
@@ -833,10 +832,13 @@ v3dv_cmd_buffer_start_job(struct v3dv_cmd_buffer *cmd_buffer,
return job;
}
static VkResult
cmd_buffer_reset(struct v3dv_cmd_buffer *cmd_buffer,
static void
cmd_buffer_reset(struct vk_command_buffer *vk_cmd_buffer,
VkCommandBufferResetFlags flags)
{
struct v3dv_cmd_buffer *cmd_buffer =
container_of(vk_cmd_buffer, struct v3dv_cmd_buffer, vk);
vk_command_buffer_reset(&cmd_buffer->vk);
if (cmd_buffer->status != V3DV_CMD_BUFFER_STATUS_INITIALIZED) {
struct v3dv_device *device = cmd_buffer->device;
@@ -851,37 +853,6 @@ cmd_buffer_reset(struct v3dv_cmd_buffer *cmd_buffer,
}
assert(cmd_buffer->status == V3DV_CMD_BUFFER_STATUS_INITIALIZED);
return VK_SUCCESS;
}
VKAPI_ATTR VkResult VKAPI_CALL
v3dv_AllocateCommandBuffers(VkDevice _device,
const VkCommandBufferAllocateInfo *pAllocateInfo,
VkCommandBuffer *pCommandBuffers)
{
V3DV_FROM_HANDLE(v3dv_device, device, _device);
VK_FROM_HANDLE(vk_command_pool, pool, pAllocateInfo->commandPool);
VkResult result = VK_SUCCESS;
uint32_t i;
for (i = 0; i < pAllocateInfo->commandBufferCount; i++) {
result = cmd_buffer_create(device, pool, pAllocateInfo->level,
&pCommandBuffers[i]);
if (result != VK_SUCCESS)
break;
}
if (result != VK_SUCCESS) {
while (i--) {
VK_FROM_HANDLE(vk_command_buffer, cmd_buffer, pCommandBuffers[i]);
cmd_buffer_destroy(cmd_buffer);
}
for (i = 0; i < pAllocateInfo->commandBufferCount; i++)
pCommandBuffers[i] = VK_NULL_HANDLE;
}
return result;
}
static void
@@ -1035,6 +1006,12 @@ cmd_buffer_begin_render_pass_secondary(
return VK_SUCCESS;
}
const struct vk_command_buffer_ops v3dv_cmd_buffer_ops = {
.create = cmd_buffer_create,
.reset = cmd_buffer_reset,
.destroy = cmd_buffer_destroy,
};
VKAPI_ATTR VkResult VKAPI_CALL
v3dv_BeginCommandBuffer(VkCommandBuffer commandBuffer,
const VkCommandBufferBeginInfo *pBeginInfo)
@@ -1045,9 +1022,7 @@ v3dv_BeginCommandBuffer(VkCommandBuffer commandBuffer,
* command buffer's state. Otherwise, we must reset its state. In both
* cases we reset it.
*/
VkResult result = cmd_buffer_reset(cmd_buffer, 0);
if (result != VK_SUCCESS)
return result;
cmd_buffer_reset(&cmd_buffer->vk, 0);
assert(cmd_buffer->status == V3DV_CMD_BUFFER_STATUS_INITIALIZED);
@@ -1055,7 +1030,7 @@ v3dv_BeginCommandBuffer(VkCommandBuffer commandBuffer,
if (cmd_buffer->vk.level == VK_COMMAND_BUFFER_LEVEL_SECONDARY) {
if (pBeginInfo->flags & VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT) {
result =
VkResult result =
cmd_buffer_begin_render_pass_secondary(cmd_buffer,
pBeginInfo->pInheritanceInfo);
if (result != VK_SUCCESS)
@@ -1068,14 +1043,6 @@ v3dv_BeginCommandBuffer(VkCommandBuffer commandBuffer,
return VK_SUCCESS;
}
VKAPI_ATTR VkResult VKAPI_CALL
v3dv_ResetCommandBuffer(VkCommandBuffer commandBuffer,
VkCommandBufferResetFlags flags)
{
V3DV_FROM_HANDLE(v3dv_cmd_buffer, cmd_buffer, commandBuffer);
return cmd_buffer_reset(cmd_buffer, flags);
}
static void
cmd_buffer_update_tile_alignment(struct v3dv_cmd_buffer *cmd_buffer)
{
+2
View File
@@ -1945,6 +1945,8 @@ v3dv_CreateDevice(VkPhysicalDevice physicalDevice,
mtx_init(&device->query_mutex, mtx_plain);
cnd_init(&device->query_ended);
device->vk.command_buffer_ops = &v3dv_cmd_buffer_ops;
vk_device_set_drm_fd(&device->vk, physical_device->render_fd);
vk_device_enable_threaded_submit(&device->vk);
+2
View File
@@ -1521,6 +1521,8 @@ struct v3dv_cmd_buffer_private_obj {
v3dv_cmd_buffer_private_obj_destroy_cb destroy_cb;
};
extern const struct vk_command_buffer_ops v3dv_cmd_buffer_ops;
struct v3dv_cmd_buffer {
struct vk_command_buffer vk;