[Mesa-dev] [PATCH] anv: Do color resolve tracking one slice at a time for 3D images

Jason Ekstrand jason at jlekstrand.net
Sat Feb 3 14:52:59 UTC 2018


I've pushed a new branch with just this series (not the GENERAL layout
stuff):

https://cgit.freedesktop.org/~jekstrand/mesa/log/?h=wip/anv-resolve-rework

On Fri, Feb 2, 2018 at 11:04 PM, Jason Ekstrand <jason at jlekstrand.net>
wrote:

> On Fri, Feb 2, 2018 at 6:55 PM, Nanley Chery <nanleychery at gmail.com>
> wrote:
>
>> On Thu, Feb 01, 2018 at 06:31:18PM -0800, Jason Ekstrand wrote:
>> > ---
>> >  src/intel/vulkan/anv_image.c       | 14 +++++++++-----
>>
>> We should also update the comment in anv_image that describes 3D as
>> having one slice per LOD.
>>
>
> Yup.  Fixed locally.  I found a couple more bugs with my branch to do aux
> in GENERAL layout.  That one suddenly forced more resolves and pointed out
> some 3D bugs the other didn't.
>
>
>> >  src/intel/vulkan/anv_private.h     |  9 ++++++++-
>> >  src/intel/vulkan/genX_cmd_buffer.c | 34 ++++++++++++++++--------------
>> ----
>> >  3 files changed, 33 insertions(+), 24 deletions(-)
>> >
>> > diff --git a/src/intel/vulkan/anv_image.c b/src/intel/vulkan/anv_image.c
>> > index 6008e3c..a3e857c 100644
>> > --- a/src/intel/vulkan/anv_image.c
>> > +++ b/src/intel/vulkan/anv_image.c
>> > @@ -262,11 +262,15 @@ add_aux_state_tracking_buffer(struct anv_image
>> *image,
>> >     /* Clear color and fast clear type */
>> >     unsigned state_size = device->isl_dev.ss.clear_value_size + 4;
>> >
>> > -   /* We only need to track compression on CCS_E surfaces.  We don't
>> consider
>> > -    * 3D images as actually having multiple array layers.
>> > -    */
>> > -   if (image->planes[plane].aux_usage == ISL_AUX_USAGE_CCS_E)
>> > -      state_size += image->levels * image->array_size * 4;
>> > +   /* We only need to track compression on CCS_E surfaces. */
>> > +   if (image->planes[plane].aux_usage == ISL_AUX_USAGE_CCS_E) {
>> > +      if (image->type == VK_IMAGE_TYPE_3D) {
>> > +         for (uint32_t l = 0; l < image->levels; l++)
>> > +            state_size += anv_minify(image->extent.depth, l) * 4;
>> > +      } else {
>> > +         state_size += image->levels * image->array_size * 4;
>> > +      }
>> > +   }
>> >
>> >     image->planes[plane].fast_clear_state_offset =
>> >        image->planes[plane].offset + image->planes[plane].size;
>> > diff --git a/src/intel/vulkan/anv_private.h
>> b/src/intel/vulkan/anv_private.h
>> > index 0cd94bf..f208618 100644
>> > --- a/src/intel/vulkan/anv_private.h
>> > +++ b/src/intel/vulkan/anv_private.h
>> > @@ -2573,8 +2573,15 @@ anv_image_get_compression_state_addr(const
>> struct anv_device *device,
>> >     struct anv_address addr =
>> >        anv_image_get_fast_clear_type_addr(device, image, aspect);
>> >     addr.offset += 4; /* Go past the fast clear type */
>> > -   addr.offset += level * image->array_size * 4;
>> > +
>> > +   if (image->type == VK_IMAGE_TYPE_3D) {
>> > +      for (uint32_t l = 0; l < image->levels; l++)
>> > +         addr.offset += anv_minify(image->extent.depth, l) * 4;
>> > +   } else {
>> > +      addr.offset += level * image->array_size * 4;
>> > +   }
>> >     addr.offset += array_layer * 4;
>> > +
>> >     return addr;
>> >  }
>> >
>> > diff --git a/src/intel/vulkan/genX_cmd_buffer.c
>> b/src/intel/vulkan/genX_cmd_buffer.c
>> > index e29228d..b4b6b7d 100644
>> > --- a/src/intel/vulkan/genX_cmd_buffer.c
>> > +++ b/src/intel/vulkan/genX_cmd_buffer.c
>> > @@ -632,14 +632,8 @@ anv_cmd_predicated_ccs_resolve(struct
>> anv_cmd_buffer *cmd_buffer,
>> >        mip.CompareOperation = COMPARE_SRCS_EQUAL;
>> >     }
>> >
>> > -   if (image->type == VK_IMAGE_TYPE_3D) {
>> > -      anv_image_ccs_op(cmd_buffer, image, aspect, level,
>> > -                       0, anv_minify(image->extent.depth, level),
>> > -                       resolve_op, true);
>> > -   } else {
>> > -      anv_image_ccs_op(cmd_buffer, image, aspect, level,
>> > -                       array_layer, 1, resolve_op, true);
>> > -   }
>> > +   anv_image_ccs_op(cmd_buffer, image, aspect, level,
>> > +                    array_layer, 1, resolve_op, true);
>> >  }
>> >
>> >  void
>> > @@ -836,9 +830,6 @@ transition_color_buffer(struct anv_cmd_buffer
>> *cmd_buffer,
>> >                                 base_layer, layer_count);
>> >     }
>> >
>> > -   if (image->type == VK_IMAGE_TYPE_3D)
>> > -      base_layer = 0;
>> > -
>> >     if (base_layer >= anv_image_aux_layers(image, aspect, base_level))
>> >        return;
>> >
>> > @@ -897,10 +888,6 @@ transition_color_buffer(struct anv_cmd_buffer
>> *cmd_buffer,
>> >              uint32_t level_layer_count =
>> >                 MIN2(layer_count, anv_image_aux_layers(image, aspect,
>> level));
>> >
>> > -            /* A transition of a 3D subresource works on all slices. */
>> > -            if (image->type == VK_IMAGE_TYPE_3D)
>> > -               level_layer_count = anv_minify(image->extent.depth,
>> level);
>> > -
>> >              anv_image_ccs_op(cmd_buffer, image, aspect, level,
>> >                               base_layer, level_layer_count,
>> >                               ISL_AUX_OP_AMBIGUATE, false);
>> > @@ -994,7 +981,10 @@ transition_color_buffer(struct anv_cmd_buffer
>> *cmd_buffer,
>> >
>> >     for (uint32_t l = 0; l < level_count; l++) {
>> >        uint32_t level = base_level + l;
>> > -      for (uint32_t a = 0; a < layer_count; a++) {
>> > +      uint32_t level_layer_count =
>> > +         MIN2(layer_count, anv_image_aux_layers(image, aspect, level));
>> > +
>> > +      for (uint32_t a = 0; a < level_layer_count; a++) {
>> >           uint32_t array_layer = base_layer + a;
>> >           anv_cmd_predicated_ccs_resolve(cmd_buffer, image, aspect,
>> >                                          level, array_layer, resolve_op,
>> > @@ -1663,12 +1653,20 @@ void genX(CmdPipelineBarrier)(
>> >              anv_image_expand_aspects(image, range->aspectMask);
>> >           uint32_t aspect_bit;
>> >
>> > +         uint32_t base_layer, layer_count;
>> > +         if (image->type == VK_IMAGE_TYPE_3D) {
>> > +            base_layer = 0;
>> > +            layer_count = anv_minify(image->extent.depth,
>> range->baseMipLevel);
>> > +         } else {
>> > +            base_layer = range->baseArrayLayer;
>> > +            layer_count = anv_get_layerCount(image, range);
>> > +         }
>> > +
>>
>> Do we also need to do this for subpass transitions?
>>
>
> No.  Subpass transitions pull from the image view and the layer range
> there is a range in 3D slices.
>
>
>> >           anv_foreach_image_aspect_bit(aspect_bit, image,
>> color_aspects) {
>> >              transition_color_buffer(cmd_buffer, image, 1UL <<
>> aspect_bit,
>> >                                      range->baseMipLevel,
>> >                                      anv_get_levelCount(image, range),
>> > -                                    range->baseArrayLayer,
>> > -                                    anv_get_layerCount(image, range),
>> > +                                    base_layer, layer_count,
>> >                                      pImageMemoryBarriers[i].oldLayout,
>> >                                      pImageMemoryBarriers[i].newLay
>> out);
>> >           }
>> > --
>> > 2.5.0.400.gff86faf
>> >
>> > _______________________________________________
>> > 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/20180203/733cccaf/attachment.html>


More information about the mesa-dev mailing list