v3dv: create a v3dv_cmd_buffer_subpass_resume helper
This is the same as the subpass start version, only that it won't
emit subpass clears. This is necessary when resuming a subpass
from a partial clear to make sure we don't try to clear subpass
attachments again.
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6766>
diff --git a/src/broadcom/vulkan/v3dv_cmd_buffer.c b/src/broadcom/vulkan/v3dv_cmd_buffer.c
index 520253d..2ef264c 100644
--- a/src/broadcom/vulkan/v3dv_cmd_buffer.c
+++ b/src/broadcom/vulkan/v3dv_cmd_buffer.c
@@ -1671,8 +1671,8 @@
v3dv_CmdClearAttachments(_cmd_buffer, att_count, atts, 1, &rect);
}
-struct v3dv_job *
-v3dv_cmd_buffer_subpass_start(struct v3dv_cmd_buffer *cmd_buffer,
+static struct v3dv_job *
+cmd_buffer_subpass_create_job(struct v3dv_cmd_buffer *cmd_buffer,
uint32_t subpass_idx)
{
struct v3dv_cmd_buffer_state *state = &cmd_buffer->state;
@@ -1710,6 +1710,21 @@
assert(subpass->resolve_attachments == NULL);
}
+ return job;
+}
+
+struct v3dv_job *
+v3dv_cmd_buffer_subpass_start(struct v3dv_cmd_buffer *cmd_buffer,
+ uint32_t subpass_idx)
+{
+ struct v3dv_cmd_buffer_state *state = &cmd_buffer->state;
+ assert(subpass_idx < state->pass->subpass_count);
+
+ struct v3dv_job *job =
+ cmd_buffer_subpass_create_job(cmd_buffer, subpass_idx);
+ if (!job)
+ return NULL;
+
/* If we can't use TLB clears then we need to emit draw clears for any
* LOAD_OP_CLEAR attachments in this subpass now.
*/
@@ -1719,6 +1734,23 @@
return job;
}
+struct v3dv_job *
+v3dv_cmd_buffer_subpass_resume(struct v3dv_cmd_buffer *cmd_buffer,
+ uint32_t subpass_idx)
+{
+ struct v3dv_cmd_buffer_state *state = &cmd_buffer->state;
+ assert(subpass_idx < state->pass->subpass_count);
+
+ struct v3dv_job *job =
+ cmd_buffer_subpass_create_job(cmd_buffer, subpass_idx);
+ if (!job)
+ return NULL;
+
+ job->is_subpass_continue = true;
+
+ return job;
+}
+
void
v3dv_cmd_buffer_subpass_finish(struct v3dv_cmd_buffer *cmd_buffer)
{
@@ -2731,9 +2763,8 @@
memcpy(&state->render_area, &state->meta.render_area, sizeof(VkRect2D));
struct v3dv_job *job =
- v3dv_cmd_buffer_subpass_start(cmd_buffer, state->meta.subpass_idx);
+ v3dv_cmd_buffer_subpass_resume(cmd_buffer, state->meta.subpass_idx);
if (job) {
- job->is_subpass_continue = true;
if (state->meta.pipeline != VK_NULL_HANDLE) {
v3dv_CmdBindPipeline(v3dv_cmd_buffer_to_handle(cmd_buffer),
VK_PIPELINE_BIND_POINT_GRAPHICS,
@@ -2830,10 +2861,9 @@
/* Now start a new job in the same subpass and flag it as continuing
* the current subpass.
*/
- job = v3dv_cmd_buffer_subpass_start(cmd_buffer,
- cmd_buffer->state.subpass_idx);
+ job = v3dv_cmd_buffer_subpass_resume(cmd_buffer,
+ cmd_buffer->state.subpass_idx);
assert(job->draw_count == 0);
- job->is_subpass_continue = true;
/* Inherit the 'always flush' behavior */
job->always_flush = true;
diff --git a/src/broadcom/vulkan/v3dv_private.h b/src/broadcom/vulkan/v3dv_private.h
index 481d957..6e511cc 100644
--- a/src/broadcom/vulkan/v3dv_private.h
+++ b/src/broadcom/vulkan/v3dv_private.h
@@ -791,6 +791,8 @@
struct v3dv_job *v3dv_cmd_buffer_subpass_start(struct v3dv_cmd_buffer *cmd_buffer,
uint32_t subpass_idx);
+struct v3dv_job *v3dv_cmd_buffer_subpass_resume(struct v3dv_cmd_buffer *cmd_buffer,
+ uint32_t subpass_idx);
void v3dv_cmd_buffer_subpass_finish(struct v3dv_cmd_buffer *cmd_buffer);