[Mesa-dev] [PATCH 10/22] anv/cmd_buffer: Disable fast clears in the GENERAL layout
Jason Ekstrand
jason at jlekstrand.net
Tue May 2 23:44:49 UTC 2017
On Thu, Apr 27, 2017 at 11:32 AM, Nanley Chery <nanleychery at gmail.com>
wrote:
> Signed-off-by: Nanley Chery <nanley.g.chery at intel.com>
> ---
> src/intel/vulkan/anv_pass.c | 22 ++++++++++++++++++++++
> src/intel/vulkan/anv_private.h | 1 +
> src/intel/vulkan/genX_cmd_buffer.c | 20 ++++++++++++++------
> 3 files changed, 37 insertions(+), 6 deletions(-)
>
> diff --git a/src/intel/vulkan/anv_pass.c b/src/intel/vulkan/anv_pass.c
> index dcd9aafc64..02b8f03fa5 100644
> --- a/src/intel/vulkan/anv_pass.c
> +++ b/src/intel/vulkan/anv_pass.c
> @@ -32,6 +32,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,
> @@ -90,6 +100,7 @@ VkResult anv_CreateRenderPass(
> att->initial_layout = pCreateInfo->pAttachments[i].initialLayout;
> att->final_layout = pCreateInfo->pAttachments[i].finalLayout;
> att->subpass_usage = subpass_usages;
> + assert(att->first_subpass_layout == VK_IMAGE_LAYOUT_UNDEFINED);
>
Would you mind just setting it rather than asserting? Yes, it's zero and
we memset to 0 but it's much clearer to just initialize it.
> subpass_usages += pass->subpass_count;
> }
>
> @@ -116,6 +127,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;
> @@ -135,6 +148,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]);
> }
> }
> }
> @@ -159,6 +175,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]);
> }
> }
> }
> @@ -173,6 +192,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;
> diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_
> private.h
> index 12531264d5..b49a5a0009 100644
> --- a/src/intel/vulkan/anv_private.h
> +++ b/src/intel/vulkan/anv_private.h
> @@ -2216,6 +2216,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;
> diff --git a/src/intel/vulkan/genX_cmd_buffer.c
> b/src/intel/vulkan/genX_cmd_buffer.c
> index a981b00f67..e3b1687121 100644
> --- a/src/intel/vulkan/genX_cmd_buffer.c
> +++ b/src/intel/vulkan/genX_cmd_buffer.c
> @@ -217,11 +217,13 @@ color_is_zero_one(VkClearColorValue value, enum
> isl_format format)
>
> static void
> color_attachment_compute_aux_usage(struct anv_cmd_buffer * const
> cmd_buffer,
> - struct anv_attachment_state *att_state,
> - struct anv_image_view *iview,
> - VkRect2D render_area,
> + const uint32_t att, VkRect2D
> render_area,
> union isl_color_value
> *fast_clear_color)
> {
> + struct anv_attachment_state *att_state = &cmd_buffer->state.
> attachments[att];
> + struct anv_image_view *iview =
> + cmd_buffer->state.framebuffer->attachments[att];
> +
> if (iview->image->aux_surface.isl.size == 0) {
> att_state->aux_usage = ISL_AUX_USAGE_NONE;
> att_state->input_aux_usage = ISL_AUX_USAGE_NONE;
> @@ -317,6 +319,13 @@ color_attachment_compute_aux_usage(struct
> anv_cmd_buffer * const cmd_buffer,
> att_state->fast_clear = false;
> }
>
> + /* We only allow fast clears for the COLOR_ATTACHMENT_OPTIMAL
> layout.
> + * See add_clear_values() for more information.
> + */
> + if (cmd_buffer->state.pass->attachments[att].first_subpass_layout
> !=
> + VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)
> + 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));
> @@ -510,9 +519,8 @@ genX(cmd_buffer_setup_attachments)(struct
> anv_cmd_buffer *cmd_buffer,
>
> union isl_color_value clear_color = { .u32 = { 0, } };
> if (att_aspects == VK_IMAGE_ASPECT_COLOR_BIT) {
> - color_attachment_compute_aux_usage(cmd_buffer,
> - &state->attachments[i],
> - iview, begin->renderArea,
> + color_attachment_compute_aux_usage(cmd_buffer, i,
> + begin->renderArea,
> &clear_color);
>
> struct isl_view view = iview->isl;
> --
> 2.12.2
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20170502/c96127c7/attachment.html>
More information about the mesa-dev
mailing list