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. > 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? > 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