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:
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user