[Mesa-dev] [PATCH 4/6] anv/blorp: Refactor MSAA resolves into an exportable helper function
Iago Toral
itoral at igalia.com
Fri Jan 11 08:19:34 UTC 2019
On Mon, 2019-01-07 at 09:39 -0600, Jason Ekstrand wrote:
> This function is modeled after the aux_op functions except that it
> has a
> lot more parameters because it deals with two images as well as
> source
> and destination regions.
> ---
> src/intel/vulkan/anv_blorp.c | 225 ++++++++++++++-----------------
> --
> src/intel/vulkan/anv_private.h | 14 ++
> 2 files changed, 107 insertions(+), 132 deletions(-)
>
> diff --git a/src/intel/vulkan/anv_blorp.c
> b/src/intel/vulkan/anv_blorp.c
> index eee7a8c3b3c..2f8d502e289 100644
> --- a/src/intel/vulkan/anv_blorp.c
> +++ b/src/intel/vulkan/anv_blorp.c
> @@ -1169,63 +1169,52 @@ enum subpass_stage {
> SUBPASS_STAGE_RESOLVE,
> };
>
> -static void
> -resolve_surface(struct blorp_batch *batch,
> - struct blorp_surf *src_surf,
> - uint32_t src_level, uint32_t src_layer,
> - struct blorp_surf *dst_surf,
> - uint32_t dst_level, uint32_t dst_layer,
> - uint32_t src_x, uint32_t src_y, uint32_t dst_x,
> uint32_t dst_y,
> - uint32_t width, uint32_t height,
> - enum blorp_filter filter)
> -{
> - blorp_blit(batch,
> - src_surf, src_level, src_layer,
> - ISL_FORMAT_UNSUPPORTED, ISL_SWIZZLE_IDENTITY,
> - dst_surf, dst_level, dst_layer,
> - ISL_FORMAT_UNSUPPORTED, ISL_SWIZZLE_IDENTITY,
> - src_x, src_y, src_x + width, src_y + height,
> - dst_x, dst_y, dst_x + width, dst_y + height,
> - filter, false, false);
> -}
> -
> -static void
> -resolve_image(struct anv_device *device,
> - struct blorp_batch *batch,
> - const struct anv_image *src_image,
> - VkImageLayout src_image_layout,
> - uint32_t src_level, uint32_t src_layer,
> - const struct anv_image *dst_image,
> - VkImageLayout dst_image_layout,
> - uint32_t dst_level, uint32_t dst_layer,
> - VkImageAspectFlags aspect_mask,
> - uint32_t src_x, uint32_t src_y, uint32_t dst_x,
> uint32_t dst_y,
> - uint32_t width, uint32_t height)
> +void
> +anv_image_msaa_resolve(struct anv_cmd_buffer *cmd_buffer,
> + const struct anv_image *src_image,
> + enum isl_aux_usage src_aux_usage,
> + uint32_t src_level, uint32_t src_base_layer,
> + const struct anv_image *dst_image,
> + enum isl_aux_usage dst_aux_usage,
> + uint32_t dst_level, uint32_t dst_base_layer,
> + VkImageAspectFlagBits aspect,
> + uint32_t src_x, uint32_t src_y,
> + uint32_t dst_x, uint32_t dst_y,
> + uint32_t width, uint32_t height,
> + uint32_t layer_count,
> + enum blorp_filter filter)
> {
> - struct anv_cmd_buffer *cmd_buffer = batch->driver_batch;
> + struct blorp_batch batch;
> + blorp_batch_init(&cmd_buffer->device->blorp, &batch, cmd_buffer,
> 0);
>
> assert(src_image->type == VK_IMAGE_TYPE_2D);
> assert(src_image->samples > 1);
> assert(dst_image->type == VK_IMAGE_TYPE_2D);
> assert(dst_image->samples == 1);
> assert(src_image->n_planes == dst_image->n_planes);
> + assert(!src_image->format->can_ycbcr);
> + assert(!dst_image->format->can_ycbcr);
>
> - uint32_t aspect_bit;
> -
> - anv_foreach_image_aspect_bit(aspect_bit, src_image, aspect_mask)
> {
> - struct blorp_surf src_surf, dst_surf;
> - get_blorp_surf_for_anv_image(device, src_image, 1UL <<
> aspect_bit,
> - src_image_layout,
> ISL_AUX_USAGE_NONE,
> - &src_surf);
> - get_blorp_surf_for_anv_image(device, dst_image, 1UL <<
> aspect_bit,
> - dst_image_layout,
> ISL_AUX_USAGE_NONE,
> - &dst_surf);
> - anv_cmd_buffer_mark_image_written(cmd_buffer, dst_image,
> - 1UL << aspect_bit,
> - dst_surf.aux_usage,
> - dst_level, dst_layer, 1);
> -
> - enum blorp_filter filter;
> + struct blorp_surf src_surf, dst_surf;
> + get_blorp_surf_for_anv_image(cmd_buffer->device, src_image,
> aspect,
> + ANV_IMAGE_LAYOUT_EXPLICIT_AUX,
> + src_aux_usage, &src_surf);
> + if (src_aux_usage == ISL_AUX_USAGE_MCS) {
> + src_surf.clear_color_addr = anv_to_blorp_address(
> + anv_image_get_clear_color_addr(cmd_buffer->device,
> src_image,
> + VK_IMAGE_ASPECT_COLOR_BIT));
> + }
> + get_blorp_surf_for_anv_image(cmd_buffer->device, dst_image,
> aspect,
> + ANV_IMAGE_LAYOUT_EXPLICIT_AUX,
> + dst_aux_usage, &dst_surf);
> + anv_cmd_buffer_mark_image_written(cmd_buffer, dst_image,
> + aspect, dst_aux_usage,
> + dst_level, dst_base_layer,
> layer_count);
> +
> + if (filter == BLORP_FILTER_NONE) {
> + /* If no explicit filter is provided, then it's implied by the
> type of
> + * the source image.
> + */
> if ((src_surf.surf->usage & ISL_SURF_USAGE_DEPTH_BIT) ||
> (src_surf.surf->usage & ISL_SURF_USAGE_STENCIL_BIT) ||
> isl_format_has_int_channel(src_surf.surf->format)) {
> @@ -1233,15 +1222,20 @@ resolve_image(struct anv_device *device,
> } else {
> filter = BLORP_FILTER_AVERAGE;
> }
> + }
>
> - assert(!src_image->format->can_ycbcr);
> - assert(!dst_image->format->can_ycbcr);
> -
> - resolve_surface(batch,
> - &src_surf, src_level, src_layer,
> - &dst_surf, dst_level, dst_layer,
> - src_x, src_y, dst_x, dst_y, width, height,
> filter);
> + for (uint32_t l = 0; l < layer_count; l++) {
> + blorp_blit(&batch,
> + &src_surf, src_level, src_base_layer + l,
> + ISL_FORMAT_UNSUPPORTED, ISL_SWIZZLE_IDENTITY,
> + &dst_surf, dst_level, dst_base_layer + l,
> + ISL_FORMAT_UNSUPPORTED, ISL_SWIZZLE_IDENTITY,
> + src_x, src_y, src_x + width, src_y + height,
> + dst_x, dst_y, dst_x + width, dst_y + height,
> + filter, false, false);
> }
> +
> + blorp_batch_finish(&batch);
> }
>
> void anv_CmdResolveImage(
> @@ -1257,8 +1251,7 @@ void anv_CmdResolveImage(
> ANV_FROM_HANDLE(anv_image, src_image, srcImage);
> ANV_FROM_HANDLE(anv_image, dst_image, dstImage);
>
> - struct blorp_batch batch;
> - blorp_batch_init(&cmd_buffer->device->blorp, &batch, cmd_buffer,
> 0);
> + assert(!src_image->format->can_ycbcr);
>
> for (uint32_t r = 0; r < regionCount; r++) {
> assert(pRegions[r].srcSubresource.aspectMask ==
> @@ -1269,27 +1262,38 @@ void anv_CmdResolveImage(
> const uint32_t layer_count =
> anv_get_layerCount(dst_image, &pRegions[r].dstSubresource);
>
> - VkImageAspectFlags src_mask =
> pRegions[r].srcSubresource.aspectMask,
> - dst_mask = pRegions[r].dstSubresource.aspectMask;
> + VkImageAspectFlags src_mask =
> pRegions[r].srcSubresource.aspectMask;
> + VkImageAspectFlags dst_mask =
> pRegions[r].dstSubresource.aspectMask;
>
> assert(anv_image_aspects_compatible(src_mask, dst_mask));
>
> - for (uint32_t layer = 0; layer < layer_count; layer++) {
> - resolve_image(cmd_buffer->device, &batch,
> - src_image, srcImageLayout,
> - pRegions[r].srcSubresource.mipLevel,
> - pRegions[r].srcSubresource.baseArrayLayer +
> layer,
> - dst_image, dstImageLayout,
> - pRegions[r].dstSubresource.mipLevel,
> - pRegions[r].dstSubresource.baseArrayLayer +
> layer,
> - pRegions[r].dstSubresource.aspectMask,
> - pRegions[r].srcOffset.x,
> pRegions[r].srcOffset.y,
> - pRegions[r].dstOffset.x,
> pRegions[r].dstOffset.y,
> - pRegions[r].extent.width,
> pRegions[r].extent.height);
> + uint32_t aspect_bit;
> + anv_foreach_image_aspect_bit(aspect_bit, src_image,
> + pRegions[r].srcSubresource.aspect
> Mask) {
> + enum isl_aux_usage src_aux_usage =
> + anv_layout_to_aux_usage(&cmd_buffer->device->info,
> src_image,
> + (1 << aspect_bit),
> srcImageLayout);
> + enum isl_aux_usage dst_aux_usage =
> + anv_layout_to_aux_usage(&cmd_buffer->device->info,
> dst_image,
> + (1 << aspect_bit),
> dstImageLayout);
> +
> + anv_image_msaa_resolve(cmd_buffer,
> + src_image, src_aux_usage,
> + pRegions[r].srcSubresource.mipLevel,
> + pRegions[r].srcSubresource.baseArray
> Layer,
> + dst_image, dst_aux_usage,
> + pRegions[r].dstSubresource.mipLevel,
> + pRegions[r].dstSubresource.baseArray
> Layer,
> + (1 << aspect_bit),
> + pRegions[r].srcOffset.x,
> + pRegions[r].srcOffset.y,
> + pRegions[r].dstOffset.x,
> + pRegions[r].dstOffset.y,
> + pRegions[r].extent.width,
> + pRegions[r].extent.height,
> + layer_count, BLORP_FILTER_NONE);
> }
> }
> -
> - blorp_batch_finish(&batch);
> }
>
> static enum isl_aux_usage
> @@ -1310,9 +1314,6 @@ anv_cmd_buffer_resolve_subpass(struct
> anv_cmd_buffer *cmd_buffer)
> struct anv_subpass *subpass = cmd_buffer->state.subpass;
>
> if (subpass->has_color_resolve) {
> - struct blorp_batch batch;
> - blorp_batch_init(&cmd_buffer->device->blorp, &batch,
> cmd_buffer, 0);
> -
> /* We are about to do some MSAA resolves. We need to flush so
> that the
> * result of writes to the MSAA color attachments show up in
> the sampler
> * when we blit to the single-sampled resolve target.
> @@ -1345,70 +1346,30 @@ anv_cmd_buffer_resolve_subpass(struct
> anv_cmd_buffer *cmd_buffer)
> struct anv_image_view *src_iview = fb-
> >attachments[src_att];
> struct anv_image_view *dst_iview = fb-
> >attachments[dst_att];
>
> + const VkRect2D render_area = cmd_buffer->state.render_area;
> +
> enum isl_aux_usage src_aux_usage =
> cmd_buffer->state.attachments[src_att].aux_usage;
> enum isl_aux_usage dst_aux_usage =
> cmd_buffer->state.attachments[dst_att].aux_usage;
>
> - const VkRect2D render_area = cmd_buffer->state.render_area;
> -
> assert(src_iview->aspect_mask == VK_IMAGE_ASPECT_COLOR_BIT
> &&
> dst_iview->aspect_mask ==
> VK_IMAGE_ASPECT_COLOR_BIT);
>
> - enum blorp_filter filter;
> - if (isl_format_has_int_channel(src_iview-
> >planes[0].isl.format)) {
This is a bit different from what anv_image_msaa_resolve() does. In the
new helper function we check if the usage is depth or stencil, but this
was checking if the format has any integer channel, which I understand
would be true even for color attachments with integer formats, right?
Since the average filter seems to require a float type, maybe checking
for integer channels instead of usage in anv_image_msaa_resolve() would
be more correct?
> - filter = BLORP_FILTER_SAMPLE_0;
> - } else {
> - filter = BLORP_FILTER_AVERAGE;
> - }
> -
> - struct blorp_surf src_surf, dst_surf;
> - get_blorp_surf_for_anv_image(cmd_buffer->device, src_iview-
> >image,
> - VK_IMAGE_ASPECT_COLOR_BIT,
> - ANV_IMAGE_LAYOUT_EXPLICIT_AUX,
> - src_aux_usage, &src_surf);
> - if (src_aux_usage == ISL_AUX_USAGE_MCS) {
> - src_surf.clear_color_addr = anv_to_blorp_address(
> - anv_image_get_clear_color_addr(cmd_buffer->device,
> - src_iview->image,
> - VK_IMAGE_ASPECT_COLOR_
> BIT));
> - }
> - get_blorp_surf_for_anv_image(cmd_buffer->device, dst_iview-
> >image,
> - VK_IMAGE_ASPECT_COLOR_BIT,
> - ANV_IMAGE_LAYOUT_EXPLICIT_AUX,
> - dst_aux_usage, &dst_surf);
> -
> - uint32_t base_src_layer = src_iview-
> >planes[0].isl.base_array_layer;
> - uint32_t base_dst_layer = dst_iview-
> >planes[0].isl.base_array_layer;
> -
> - assert(src_iview->planes[0].isl.array_len >= fb->layers);
> - assert(dst_iview->planes[0].isl.array_len >= fb->layers);
> -
> - anv_cmd_buffer_mark_image_written(cmd_buffer, dst_iview-
> >image,
> - VK_IMAGE_ASPECT_COLOR_BIT
> ,
> - dst_surf.aux_usage,
> - dst_iview-
> >planes[0].isl.base_level,
> - base_dst_layer, fb-
> >layers);
> -
> - assert(!src_iview->image->format->can_ycbcr);
> - assert(!dst_iview->image->format->can_ycbcr);
> -
> - for (uint32_t i = 0; i < fb->layers; i++) {
> - resolve_surface(&batch,
> - &src_surf,
> - src_iview->planes[0].isl.base_level,
> - base_src_layer + i,
> - &dst_surf,
> - dst_iview->planes[0].isl.base_level,
> - base_dst_layer + i,
> - render_area.offset.x,
> render_area.offset.y,
> - render_area.offset.x,
> render_area.offset.y,
> - render_area.extent.width,
> render_area.extent.height,
> - filter);
> - }
> + anv_image_msaa_resolve(cmd_buffer,
> + src_iview->image, src_aux_usage,
> + src_iview->planes[0].isl.base_level,
> + src_iview-
> >planes[0].isl.base_array_layer,
> + dst_iview->image, dst_aux_usage,
> + dst_iview->planes[0].isl.base_level,
> + dst_iview-
> >planes[0].isl.base_array_layer,
> + VK_IMAGE_ASPECT_COLOR_BIT,
> + render_area.offset.x,
> render_area.offset.y,
> + render_area.offset.x,
> render_area.offset.y,
> + render_area.extent.width,
> + render_area.extent.height,
> + fb->layers, BLORP_FILTER_NONE);
> }
> -
> - blorp_batch_finish(&batch);
> }
> }
>
> diff --git a/src/intel/vulkan/anv_private.h
> b/src/intel/vulkan/anv_private.h
> index 0b67e7598b4..a064a058822 100644
> --- a/src/intel/vulkan/anv_private.h
> +++ b/src/intel/vulkan/anv_private.h
> @@ -2923,6 +2923,20 @@ anv_image_clear_depth_stencil(struct
> anv_cmd_buffer *cmd_buffer,
> VkRect2D area,
> float depth_value, uint8_t
> stencil_value);
> void
> +anv_image_msaa_resolve(struct anv_cmd_buffer *cmd_buffer,
> + const struct anv_image *src_image,
> + enum isl_aux_usage src_aux_usage,
> + uint32_t src_level, uint32_t src_base_layer,
> + const struct anv_image *dst_image,
> + enum isl_aux_usage dst_aux_usage,
> + uint32_t dst_level, uint32_t dst_base_layer,
> + VkImageAspectFlagBits aspect,
> + uint32_t src_x, uint32_t src_y,
> + uint32_t dst_x, uint32_t dst_y,
> + uint32_t width, uint32_t height,
> + uint32_t layer_count,
> + enum blorp_filter filter);
> +void
> anv_image_hiz_op(struct anv_cmd_buffer *cmd_buffer,
> const struct anv_image *image,
> VkImageAspectFlagBits aspect, uint32_t level,
More information about the mesa-dev
mailing list