mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-02-19 19:00:33 +01:00
anv/cmd_buffer: Restrict fast clears in the GENERAL layout
v2: Remove ::first_subpass_layout assertion (Jason Ekstrand). v3: Allow some fast clears in the GENERAL layout. v4: Remove extra '||' and adjust line break (Jason Ekstrand). Signed-off-by: Nanley Chery <nanley.g.chery@intel.com> Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
This commit is contained in:
parent
9ffe87122b
commit
dcff5ab9f1
3 changed files with 40 additions and 0 deletions
|
|
@ -34,6 +34,16 @@ num_subpass_attachments(const VkSubpassDescription *desc)
|
|||
(desc->pDepthStencilAttachment != NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
init_first_subpass_layout(struct anv_render_pass_attachment * const att,
|
||||
const VkAttachmentReference att_ref)
|
||||
{
|
||||
if (att->first_subpass_layout == VK_IMAGE_LAYOUT_UNDEFINED) {
|
||||
att->first_subpass_layout = att_ref.layout;
|
||||
assert(att->first_subpass_layout != VK_IMAGE_LAYOUT_UNDEFINED);
|
||||
}
|
||||
}
|
||||
|
||||
VkResult anv_CreateRenderPass(
|
||||
VkDevice _device,
|
||||
const VkRenderPassCreateInfo* pCreateInfo,
|
||||
|
|
@ -91,6 +101,7 @@ VkResult anv_CreateRenderPass(
|
|||
att->stencil_load_op = pCreateInfo->pAttachments[i].stencilLoadOp;
|
||||
att->initial_layout = pCreateInfo->pAttachments[i].initialLayout;
|
||||
att->final_layout = pCreateInfo->pAttachments[i].finalLayout;
|
||||
att->first_subpass_layout = VK_IMAGE_LAYOUT_UNDEFINED;
|
||||
att->subpass_usage = subpass_usages;
|
||||
subpass_usages += pass->subpass_count;
|
||||
}
|
||||
|
|
@ -119,6 +130,8 @@ VkResult anv_CreateRenderPass(
|
|||
pass->attachments[a].subpass_usage[i] |= ANV_SUBPASS_USAGE_INPUT;
|
||||
pass->attachments[a].last_subpass_idx = i;
|
||||
|
||||
init_first_subpass_layout(&pass->attachments[a],
|
||||
desc->pInputAttachments[j]);
|
||||
if (desc->pDepthStencilAttachment &&
|
||||
a == desc->pDepthStencilAttachment->attachment)
|
||||
subpass->has_ds_self_dep = true;
|
||||
|
|
@ -138,6 +151,9 @@ VkResult anv_CreateRenderPass(
|
|||
pass->attachments[a].usage |= VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
|
||||
pass->attachments[a].subpass_usage[i] |= ANV_SUBPASS_USAGE_DRAW;
|
||||
pass->attachments[a].last_subpass_idx = i;
|
||||
|
||||
init_first_subpass_layout(&pass->attachments[a],
|
||||
desc->pColorAttachments[j]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -162,6 +178,9 @@ VkResult anv_CreateRenderPass(
|
|||
pass->attachments[a].subpass_usage[i] |=
|
||||
ANV_SUBPASS_USAGE_RESOLVE_DST;
|
||||
pass->attachments[a].last_subpass_idx = i;
|
||||
|
||||
init_first_subpass_layout(&pass->attachments[a],
|
||||
desc->pResolveAttachments[j]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -176,6 +195,9 @@ VkResult anv_CreateRenderPass(
|
|||
VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
|
||||
pass->attachments[a].subpass_usage[i] |= ANV_SUBPASS_USAGE_DRAW;
|
||||
pass->attachments[a].last_subpass_idx = i;
|
||||
|
||||
init_first_subpass_layout(&pass->attachments[a],
|
||||
*desc->pDepthStencilAttachment);
|
||||
}
|
||||
} else {
|
||||
subpass->depth_stencil_attachment.attachment = VK_ATTACHMENT_UNUSED;
|
||||
|
|
|
|||
|
|
@ -1490,6 +1490,7 @@ struct anv_attachment_state {
|
|||
bool fast_clear;
|
||||
VkClearValue clear_value;
|
||||
bool clear_color_is_zero_one;
|
||||
bool clear_color_is_zero;
|
||||
};
|
||||
|
||||
/** State required while building cmd buffer */
|
||||
|
|
@ -2308,6 +2309,7 @@ struct anv_render_pass_attachment {
|
|||
VkAttachmentLoadOp stencil_load_op;
|
||||
VkImageLayout initial_layout;
|
||||
VkImageLayout final_layout;
|
||||
VkImageLayout first_subpass_layout;
|
||||
|
||||
/* An array, indexed by subpass id, of how the attachment will be used. */
|
||||
enum anv_subpass_usage * subpass_usage;
|
||||
|
|
|
|||
|
|
@ -255,6 +255,11 @@ color_attachment_compute_aux_usage(struct anv_device * device,
|
|||
|
||||
att_state->clear_color_is_zero_one =
|
||||
color_is_zero_one(att_state->clear_value.color, iview->isl.format);
|
||||
att_state->clear_color_is_zero =
|
||||
att_state->clear_value.color.uint32[0] == 0 &&
|
||||
att_state->clear_value.color.uint32[1] == 0 &&
|
||||
att_state->clear_value.color.uint32[2] == 0 &&
|
||||
att_state->clear_value.color.uint32[3] == 0;
|
||||
|
||||
if (att_state->pending_clear_aspects == VK_IMAGE_ASPECT_COLOR_BIT) {
|
||||
/* Start off assuming fast clears are possible */
|
||||
|
|
@ -299,6 +304,17 @@ color_attachment_compute_aux_usage(struct anv_device * device,
|
|||
}
|
||||
}
|
||||
|
||||
/* We only allow fast clears in the GENERAL layout if the auxiliary
|
||||
* buffer is always enabled and the fast-clear value is all 0's. See
|
||||
* add_fast_clear_state_buffer() for more information.
|
||||
*/
|
||||
if (cmd_state->pass->attachments[att].first_subpass_layout ==
|
||||
VK_IMAGE_LAYOUT_GENERAL &&
|
||||
(!att_state->clear_color_is_zero ||
|
||||
iview->image->aux_usage == ISL_AUX_USAGE_NONE)) {
|
||||
att_state->fast_clear = false;
|
||||
}
|
||||
|
||||
if (att_state->fast_clear) {
|
||||
memcpy(fast_clear_color->u32, att_state->clear_value.color.uint32,
|
||||
sizeof(fast_clear_color->u32));
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue