vk/cmd_buffer: Factor the guts of CmdBufferEnd into two helpers
This commit is contained in:
@@ -650,26 +650,25 @@ anv_cmd_buffer_process_relocs(struct anv_cmd_buffer *cmd_buffer,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
VkResult anv_EndCommandBuffer(
|
void
|
||||||
VkCmdBuffer cmdBuffer)
|
anv_cmd_buffer_emit_batch_buffer_end(struct anv_cmd_buffer *cmd_buffer)
|
||||||
{
|
{
|
||||||
ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, cmdBuffer);
|
anv_batch_emit(&cmd_buffer->batch, GEN8_MI_BATCH_BUFFER_END);
|
||||||
struct anv_device *device = cmd_buffer->device;
|
|
||||||
struct anv_batch *batch = &cmd_buffer->batch;
|
|
||||||
|
|
||||||
anv_batch_emit(batch, GEN8_MI_BATCH_BUFFER_END);
|
|
||||||
|
|
||||||
anv_batch_bo_finish(cmd_buffer->last_batch_bo, &cmd_buffer->batch);
|
anv_batch_bo_finish(cmd_buffer->last_batch_bo, &cmd_buffer->batch);
|
||||||
cmd_buffer->surface_batch_bo->num_relocs =
|
cmd_buffer->surface_batch_bo->num_relocs =
|
||||||
cmd_buffer->surface_relocs.num_relocs - cmd_buffer->surface_batch_bo->first_reloc;
|
cmd_buffer->surface_relocs.num_relocs - cmd_buffer->surface_batch_bo->first_reloc;
|
||||||
cmd_buffer->surface_batch_bo->length = cmd_buffer->surface_next;
|
cmd_buffer->surface_batch_bo->length = cmd_buffer->surface_next;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
anv_cmd_buffer_compute_validate_list(struct anv_cmd_buffer *cmd_buffer)
|
||||||
|
{
|
||||||
|
struct anv_batch *batch = &cmd_buffer->batch;
|
||||||
|
|
||||||
cmd_buffer->exec2_bo_count = 0;
|
cmd_buffer->exec2_bo_count = 0;
|
||||||
cmd_buffer->need_reloc = false;
|
cmd_buffer->need_reloc = false;
|
||||||
|
|
||||||
/* Lock for access to bo->index. */
|
|
||||||
pthread_mutex_lock(&device->mutex);
|
|
||||||
|
|
||||||
/* Add surface state bos first so we can add them with their relocs. */
|
/* Add surface state bos first so we can add them with their relocs. */
|
||||||
for (struct anv_batch_bo *bbo = cmd_buffer->surface_batch_bo;
|
for (struct anv_batch_bo *bbo = cmd_buffer->surface_batch_bo;
|
||||||
bbo != NULL; bbo = bbo->prev_batch_bo) {
|
bbo != NULL; bbo = bbo->prev_batch_bo) {
|
||||||
@@ -716,9 +715,24 @@ VkResult anv_EndCommandBuffer(
|
|||||||
if (!cmd_buffer->need_reloc)
|
if (!cmd_buffer->need_reloc)
|
||||||
cmd_buffer->execbuf.flags |= I915_EXEC_NO_RELOC;
|
cmd_buffer->execbuf.flags |= I915_EXEC_NO_RELOC;
|
||||||
cmd_buffer->execbuf.flags |= I915_EXEC_RENDER;
|
cmd_buffer->execbuf.flags |= I915_EXEC_RENDER;
|
||||||
cmd_buffer->execbuf.rsvd1 = device->context_id;
|
cmd_buffer->execbuf.rsvd1 = cmd_buffer->device->context_id;
|
||||||
cmd_buffer->execbuf.rsvd2 = 0;
|
cmd_buffer->execbuf.rsvd2 = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
VkResult anv_EndCommandBuffer(
|
||||||
|
VkCmdBuffer cmdBuffer)
|
||||||
|
{
|
||||||
|
ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, cmdBuffer);
|
||||||
|
struct anv_device *device = cmd_buffer->device;
|
||||||
|
|
||||||
|
anv_cmd_buffer_emit_batch_buffer_end(cmd_buffer);
|
||||||
|
|
||||||
|
/* The algorithm used to compute the validate list is not threadsafe as
|
||||||
|
* it uses the bo->index field. We have to lock the device around it.
|
||||||
|
* Fortunately, the chances for contention here are probably very low.
|
||||||
|
*/
|
||||||
|
pthread_mutex_lock(&device->mutex);
|
||||||
|
anv_cmd_buffer_compute_validate_list(cmd_buffer);
|
||||||
pthread_mutex_unlock(&device->mutex);
|
pthread_mutex_unlock(&device->mutex);
|
||||||
|
|
||||||
return VK_SUCCESS;
|
return VK_SUCCESS;
|
||||||
|
@@ -727,6 +727,8 @@ struct anv_cmd_buffer {
|
|||||||
VkResult anv_cmd_buffer_init_batch_bo_chain(struct anv_cmd_buffer *cmd_buffer);
|
VkResult anv_cmd_buffer_init_batch_bo_chain(struct anv_cmd_buffer *cmd_buffer);
|
||||||
void anv_cmd_buffer_fini_batch_bo_chain(struct anv_cmd_buffer *cmd_buffer);
|
void anv_cmd_buffer_fini_batch_bo_chain(struct anv_cmd_buffer *cmd_buffer);
|
||||||
void anv_cmd_buffer_reset_batch_bo_chain(struct anv_cmd_buffer *cmd_buffer);
|
void anv_cmd_buffer_reset_batch_bo_chain(struct anv_cmd_buffer *cmd_buffer);
|
||||||
|
void anv_cmd_buffer_emit_batch_buffer_end(struct anv_cmd_buffer *cmd_buffer);
|
||||||
|
void anv_cmd_buffer_compute_validate_list(struct anv_cmd_buffer *cmd_buffer);
|
||||||
|
|
||||||
struct anv_state
|
struct anv_state
|
||||||
anv_cmd_buffer_alloc_surface_state(struct anv_cmd_buffer *cmd_buffer,
|
anv_cmd_buffer_alloc_surface_state(struct anv_cmd_buffer *cmd_buffer,
|
||||||
|
Reference in New Issue
Block a user