On Fri, Feb 2, 2018 at 6:55 PM, Nanley Chery <nanleych...@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@lists.freedesktop.org > > https://lists.freedesktop.org/mailman/listinfo/mesa-dev >
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev