[Mesa-dev] [PATCH 16/22] anv/cmd_buffer: Add transition_color_buffer()
Jason Ekstrand
jason at jlekstrand.net
Wed May 3 21:24:19 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/genX_cmd_buffer.c | 93 ++++++++++++++++++++++++++++++
> ++++++++
> 1 file changed, 93 insertions(+)
>
> diff --git a/src/intel/vulkan/genX_cmd_buffer.c
> b/src/intel/vulkan/genX_cmd_buffer.c
> index d5cc358aec..1ae0c3256e 100644
> --- a/src/intel/vulkan/genX_cmd_buffer.c
> +++ b/src/intel/vulkan/genX_cmd_buffer.c
> @@ -454,6 +454,99 @@ genX(transfer_clear_value)(struct anv_cmd_buffer *
> const cmd_buffer,
> }
> }
>
> +/* Transitions a color buffer from one layout to another. */
> +static void
> +transition_color_buffer(struct anv_cmd_buffer * const cmd_buffer,
> + const struct anv_image * const image,
> + const uint32_t base_level, uint32_t level_count,
> + const uint32_t base_layer, uint32_t layer_count,
> + const VkImageLayout initial_layout,
> + const VkImageLayout final_layout)
> +{
> + assert(cmd_buffer && image);
> +
> + /* This must be a color image. */
> + assert(image->aspects == VK_IMAGE_ASPECT_COLOR_BIT);
> +
> + /* Only color buffers with CCS need resolving. */
> + if (image->aux_surface.isl.size == 0 || image->samples > 1)
> + return;
> +
> + /* Don't transition this subresource range if it lacks auxiliary data.
> */
> + if (base_level >= anv_color_aux_levels(image) ||
> + base_layer >= anv_color_aux_layers(image, base_level))
> + return;
> +
> + /* The undefined layout indicates that the user doesn't care about the
> + * data that's currently in the buffer. The pre-initialized layout is
> + * equivalent to the undefined layout for optimally-tiled images.
> + *
> + * We can only skip the resolve for CCS_E images in this layout
> because it
> + * is enabled outside of render passes. This allows previously
> fast-cleared
> + * and undefined buffers to be defined with transfer operations.
> + */
> + const bool is_ccs_e = image->aux_usage == ISL_AUX_USAGE_CCS_E;
> + const bool undef_layout = initial_layout == VK_IMAGE_LAYOUT_UNDEFINED
> ||
> + initial_layout == VK_IMAGE_LAYOUT_
> PREINITIALIZED;
> + if (is_ccs_e && undef_layout)
> + return;
> +
> + /* A resolve isn't necessary when transitioning from a layout that
> doesn't
> + * have fast-clear data or to a layout that will be aware of the
> fast-clear
> + * value.
> + */
> + const bool maybe_fast_cleared = undef_layout || initial_layout ==
> + VK_IMAGE_LAYOUT_COLOR_
> ATTACHMENT_OPTIMAL;
> + if (!maybe_fast_cleared || final_layout ==
> + VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)
> + return;
> +
> + /* Determine the optimal resolve operation. For now we only need to
> resolve
> + * the clear color.
> + */
> + const enum blorp_fast_clear_op op = is_ccs_e ?
> + BLORP_FAST_CLEAR_OP_RESOLVE_PARTIAL
> :
> + BLORP_FAST_CLEAR_OP_RESOLVE_FULL;
> +
> + /* The actual range that will be transitioned is limited by the number
> of
> + * subresources that have auxiliary data.
> + */
> + level_count = MIN2(level_count, anv_color_aux_levels(image));
> +
> + /* A write cache flush with an end-of-pipe sync is required between
> + * rendering, clearing, and resolving operations. Perform a flush of
> the
> + * write cache before and after the resolve operation to meet this
> + * requirement.
> + */
>
anv_blorp.c has a more detailed comment about this. I think I'd rather we
copy it here so that it doesn't get lost when we delete
ccs_resolve_attachments.
Also, I have no idea whether we need to do it per-fast-clear-op or once
before we do fast-clear ops and once afterwards. I think this is probably
fine.
> + cmd_buffer->state.pending_pipe_bits |=
> + ANV_PIPE_RENDER_TARGET_CACHE_FLUSH_BIT | ANV_PIPE_CS_STALL_BIT;
> +
> + for (uint32_t level = base_level; level < base_level + level_count;
> level++) {
> +
> + layer_count = MIN2(layer_count, anv_color_aux_layers(image, level));
> + for (uint32_t layer = base_layer; layer < base_layer + layer_count;
> layer++) {
> +
> + /* Create a surface state with the right clear color and perform
> the
> + * resolve.
> + */
> + struct anv_state surface_state =
> + anv_cmd_buffer_alloc_surface_state(cmd_buffer);
> + anv_fill_ccs_resolve_ss(cmd_buffer->device, surface_state.map,
> image,
> + level, layer);
> + add_image_relocs(cmd_buffer, image, VK_IMAGE_ASPECT_COLOR_BIT,
> + is_ccs_e ? ISL_AUX_USAGE_CCS_E :
> ISL_AUX_USAGE_CCS_D,
> + surface_state);
> + anv_state_flush(cmd_buffer->device, surface_state);
> + genX(transfer_clear_value)(cmd_buffer, surface_state, image,
> level,
> + false);
> + anv_ccs_resolve(cmd_buffer, surface_state, image, level, layer,
> op);
> + }
> + }
> +
> + cmd_buffer->state.pending_pipe_bits |=
> + ANV_PIPE_RENDER_TARGET_CACHE_FLUSH_BIT | ANV_PIPE_CS_STALL_BIT;
> +}
> +
> /**
> * Setup anv_cmd_state::attachments for vkCmdBeginRenderPass.
> */
> --
> 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/20170503/a1631b65/attachment-0001.html>
More information about the mesa-dev
mailing list