v3dv: implement vkResetCommandBuffer

Also, implement implicit reset via vkCmdBeginCommandBuffer.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6766>
This commit is contained in:
Iago Toral Quiroga
2020-02-20 09:53:32 +01:00
committed by Marge Bot
parent ea09600fe6
commit 79569fb796
+50 -29
View File
@@ -109,6 +109,27 @@ v3dv_CreateCommandPool(VkDevice _device,
return VK_SUCCESS;
}
static void
cmd_buffer_init(struct v3dv_cmd_buffer *cmd_buffer,
struct v3dv_device *device,
struct v3dv_cmd_pool *pool,
VkCommandBufferLevel level)
{
memset(cmd_buffer, 0, sizeof(*cmd_buffer));
cmd_buffer->_loader_data.loaderMagic = ICD_LOADER_MAGIC;
cmd_buffer->device = device;
cmd_buffer->pool = pool;
cmd_buffer->level = level;
list_inithead(&cmd_buffer->submit_jobs);
assert(pool);
list_addtail(&cmd_buffer->pool_link, &pool->cmd_buffers);
cmd_buffer->status = V3DV_CMD_BUFFER_STATUS_INITIALIZED;
}
static VkResult
cmd_buffer_create(struct v3dv_device *device,
struct v3dv_cmd_pool *pool,
@@ -121,21 +142,7 @@ cmd_buffer_create(struct v3dv_device *device,
if (cmd_buffer == NULL)
return vk_error(device->instance, VK_ERROR_OUT_OF_HOST_MEMORY);
cmd_buffer->_loader_data.loaderMagic = ICD_LOADER_MAGIC;
cmd_buffer->device = device;
cmd_buffer->pool = pool;
cmd_buffer->level = level;
cmd_buffer->usage_flags = 0;
cmd_buffer->push_constants_descriptor.offset = 0;
cmd_buffer->push_constants_descriptor.bo = NULL;
list_inithead(&cmd_buffer->submit_jobs);
cmd_buffer->status = V3DV_CMD_BUFFER_STATUS_NEW;
assert(pool);
list_addtail(&cmd_buffer->pool_link, &pool->cmd_buffers);
cmd_buffer_init(cmd_buffer, device, pool, level);
*pCommandBuffer = v3dv_cmd_buffer_to_handle(cmd_buffer);
@@ -175,7 +182,7 @@ job_destroy(struct v3dv_job *job)
}
static void
cmd_buffer_destroy(struct v3dv_cmd_buffer *cmd_buffer)
cmd_buffer_free_resources(struct v3dv_cmd_buffer *cmd_buffer)
{
list_del(&cmd_buffer->pool_link);
@@ -194,7 +201,12 @@ cmd_buffer_destroy(struct v3dv_cmd_buffer *cmd_buffer)
if (cmd_buffer->push_constants_descriptor.bo)
v3dv_bo_free(cmd_buffer->device, cmd_buffer->push_constants_descriptor.bo);
}
static void
cmd_buffer_destroy(struct v3dv_cmd_buffer *cmd_buffer)
{
cmd_buffer_free_resources(cmd_buffer);
vk_free(&cmd_buffer->pool->alloc, cmd_buffer);
}
@@ -437,23 +449,24 @@ v3dv_cmd_buffer_start_job(struct v3dv_cmd_buffer *cmd_buffer,
}
static VkResult
cmd_buffer_reset(struct v3dv_cmd_buffer *cmd_buffer)
cmd_buffer_reset(struct v3dv_cmd_buffer *cmd_buffer,
VkCommandBufferResetFlags flags)
{
if (cmd_buffer->status != V3DV_CMD_BUFFER_STATUS_INITIALIZED) {
/* FIXME */
assert(cmd_buffer->status == V3DV_CMD_BUFFER_STATUS_NEW);
struct v3dv_device *device = cmd_buffer->device;
struct v3dv_cmd_pool *pool = cmd_buffer->pool;
VkCommandBufferLevel level = cmd_buffer->level;
cmd_buffer->usage_flags = 0;
/* FIXME: For now we always free all resources as if
* VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT was set.
*/
if (cmd_buffer->status != V3DV_CMD_BUFFER_STATUS_NEW)
cmd_buffer_free_resources(cmd_buffer);
struct v3dv_cmd_buffer_state *state = &cmd_buffer->state;
state->pass = NULL;
state->framebuffer = NULL;
state->subpass_idx = 0;
state->job = NULL;
state->descriptor_state.valid = 0;
cmd_buffer->status = V3DV_CMD_BUFFER_STATUS_INITIALIZED;
cmd_buffer_init(cmd_buffer, device, pool, level);
}
assert(cmd_buffer->status == V3DV_CMD_BUFFER_STATUS_INITIALIZED);
return VK_SUCCESS;
}
@@ -536,7 +549,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);
VkResult result = cmd_buffer_reset(cmd_buffer, 0);
if (result != VK_SUCCESS)
return result;
@@ -549,6 +562,14 @@ v3dv_BeginCommandBuffer(VkCommandBuffer commandBuffer,
return VK_SUCCESS;
}
VkResult
v3dv_ResetCommandBuffer(VkCommandBuffer commandBuffer,
VkCommandBufferResetFlags flags)
{
V3DV_FROM_HANDLE(v3dv_cmd_buffer, cmd_buffer, commandBuffer);
return cmd_buffer_reset(cmd_buffer, flags);
}
static void
emit_clip_window(struct v3dv_job *job, const VkRect2D *rect)
{