[Mesa-dev] [PATCH] anv: Do color resolve tracking one slice at a time for 3D images
Jason Ekstrand
jason at jlekstrand.net
Fri Feb 2 02:31:18 UTC 2018
---
src/intel/vulkan/anv_image.c | 14 +++++++++-----
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);
+ }
+
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
More information about the mesa-dev
mailing list