From 56fcc085fb0b782385332e4b28cb6bbb540720c7 Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga Date: Mon, 29 Jun 2020 12:39:53 +0200 Subject: [PATCH] v3dv: handle draw after barrier Currently, we end the current job whenever the user emits a pipeline barrier, but we then expect to have a valid job when we emit a draw call. If by the time we have to emit a draw call we don't have a valid job, we need to create one by resuming execution of the current subpass. Fixes some tests in: dEQP-VK.renderpass.suballocation.attachment_allocation.input_output.* Part-of: --- src/broadcom/vulkan/v3dv_cmd_buffer.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/broadcom/vulkan/v3dv_cmd_buffer.c b/src/broadcom/vulkan/v3dv_cmd_buffer.c index 3eb1bbf5a95..95d17d5d12a 100644 --- a/src/broadcom/vulkan/v3dv_cmd_buffer.c +++ b/src/broadcom/vulkan/v3dv_cmd_buffer.c @@ -3747,8 +3747,16 @@ cmd_buffer_emit_draw(struct v3dv_cmd_buffer *cmd_buffer, static struct v3dv_job * cmd_buffer_pre_draw_split_job(struct v3dv_cmd_buffer *cmd_buffer) { + /* If we emitted a pipeline barrier right before this draw we won't have + * an active job. In that case, create a new job continuing the current + * subpass. + */ struct v3dv_job *job = cmd_buffer->state.job; - assert(job); + if (!job) { + job = v3dv_cmd_buffer_subpass_resume(cmd_buffer, + cmd_buffer->state.subpass_idx); + return job; + } /* If the job has been flagged with 'always_flush' and it has already * recorded any draw calls then we need to start a new job for it.