[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 07:04:17 UTC 2018
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].newLayout);
> > }
> > --
> > 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/20180202/e2799c3a/attachment-0001.html>
More information about the mesa-dev
mailing list