v3dv: refactor checks for subpass attachment stores
Reviewed-by: Alejandro Piñeiro <apinheiro@igalia.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8589>
This commit is contained in:
parent
f0ec3d9f6d
commit
3c19a518c9
|
@ -1566,6 +1566,35 @@ check_needs_clear(const struct v3dv_cmd_buffer_state *state,
|
||||||
return load_op == VK_ATTACHMENT_LOAD_OP_CLEAR;
|
return load_op == VK_ATTACHMENT_LOAD_OP_CLEAR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
check_needs_store(const struct v3dv_cmd_buffer_state *state,
|
||||||
|
VkImageAspectFlags aspect,
|
||||||
|
uint32_t att_last_subpass_idx,
|
||||||
|
VkAttachmentStoreOp store_op)
|
||||||
|
{
|
||||||
|
/* We call this with image->aspects & aspect, so 0 means the aspect we are
|
||||||
|
* testing does not exist in the image.
|
||||||
|
*/
|
||||||
|
if (!aspect)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
/* Attachment store operations only apply on the last subpass where the
|
||||||
|
* attachment is used, in other subpasses we always need to store.
|
||||||
|
*/
|
||||||
|
if (state->subpass_idx < att_last_subpass_idx)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
/* Attachment store operations only apply on the last job we emit on the the
|
||||||
|
* last subpass where the attachment is used, otherwise we always need to
|
||||||
|
* store.
|
||||||
|
*/
|
||||||
|
if (!state->job->is_subpass_finish)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
/* The attachment store operation must be STORE */
|
||||||
|
return store_op == VK_ATTACHMENT_STORE_OP_STORE;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
cmd_buffer_render_pass_emit_loads(struct v3dv_cmd_buffer *cmd_buffer,
|
cmd_buffer_render_pass_emit_loads(struct v3dv_cmd_buffer *cmd_buffer,
|
||||||
struct v3dv_cl *cl,
|
struct v3dv_cl *cl,
|
||||||
|
@ -1752,16 +1781,16 @@ cmd_buffer_render_pass_emit_stores(struct v3dv_cmd_buffer *cmd_buffer,
|
||||||
|
|
||||||
/* Skip the last store if it is not required */
|
/* Skip the last store if it is not required */
|
||||||
bool needs_depth_store =
|
bool needs_depth_store =
|
||||||
(aspects & VK_IMAGE_ASPECT_DEPTH_BIT) &&
|
check_needs_store(state,
|
||||||
(state->subpass_idx < ds_attachment->last_subpass ||
|
aspects & VK_IMAGE_ASPECT_DEPTH_BIT,
|
||||||
ds_attachment->desc.storeOp == VK_ATTACHMENT_STORE_OP_STORE ||
|
ds_attachment->last_subpass,
|
||||||
!state->job->is_subpass_finish);
|
ds_attachment->desc.storeOp);
|
||||||
|
|
||||||
bool needs_stencil_store =
|
bool needs_stencil_store =
|
||||||
(aspects & VK_IMAGE_ASPECT_STENCIL_BIT) &&
|
check_needs_store(state,
|
||||||
(state->subpass_idx < ds_attachment->last_subpass ||
|
aspects & VK_IMAGE_ASPECT_STENCIL_BIT,
|
||||||
ds_attachment->desc.stencilStoreOp == VK_ATTACHMENT_STORE_OP_STORE ||
|
ds_attachment->last_subpass,
|
||||||
!state->job->is_subpass_finish);
|
ds_attachment->desc.stencilStoreOp);
|
||||||
|
|
||||||
/* GFXH-1689: The per-buffer store command's clear buffer bit is broken
|
/* GFXH-1689: The per-buffer store command's clear buffer bit is broken
|
||||||
* for depth/stencil. In addition, the clear packet's Z/S bit is broken,
|
* for depth/stencil. In addition, the clear packet's Z/S bit is broken,
|
||||||
|
@ -1810,9 +1839,10 @@ cmd_buffer_render_pass_emit_stores(struct v3dv_cmd_buffer *cmd_buffer,
|
||||||
|
|
||||||
/* Skip the last store if it is not required */
|
/* Skip the last store if it is not required */
|
||||||
bool needs_store =
|
bool needs_store =
|
||||||
state->subpass_idx < attachment->last_subpass ||
|
check_needs_store(state,
|
||||||
attachment->desc.storeOp == VK_ATTACHMENT_STORE_OP_STORE ||
|
VK_IMAGE_ASPECT_COLOR_BIT,
|
||||||
!state->job->is_subpass_finish;
|
attachment->last_subpass,
|
||||||
|
attachment->desc.storeOp);
|
||||||
|
|
||||||
/* If we need to resolve this attachment emit that store first. Notice
|
/* If we need to resolve this attachment emit that store first. Notice
|
||||||
* that we must not request a tile buffer clear here in that case, since
|
* that we must not request a tile buffer clear here in that case, since
|
||||||
|
|
Loading…
Reference in New Issue