summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLaura Ekstrand <laura@jlekstrand.net>2017-11-01 16:52:25 -0700
committerLaura Ekstrand <laura@jlekstrand.net>2017-11-01 16:52:25 -0700
commit7cd9cc9dd6ed0d4217992aa6ba08078ba17e2750 (patch)
tree9517758c389bd2d3ca7291d88ee3d85d7bb24ba5
parentd25b9dd1a61292842569b7b870666217a1c8e585 (diff)
intel/vulkan: Added anv_mcs_partial_resolve.
-rw-r--r--src/intel/vulkan/anv_blorp.c40
-rw-r--r--src/intel/vulkan/anv_private.h8
2 files changed, 48 insertions, 0 deletions
diff --git a/src/intel/vulkan/anv_blorp.c b/src/intel/vulkan/anv_blorp.c
index 70e1b2b022..d076e73876 100644
--- a/src/intel/vulkan/anv_blorp.c
+++ b/src/intel/vulkan/anv_blorp.c
@@ -1694,3 +1694,43 @@ anv_ccs_resolve(struct anv_cmd_buffer * const cmd_buffer,
blorp_batch_finish(&batch);
}
+
+void
+anv_mcs_partial_resolve(struct anv_cmd_buffer * const cmd_buffer,
+ const struct anv_state surface_state,
+ const struct anv_image * const image,
+ VkImageAspectFlagBits aspect,
+ const uint32_t start_layer,
+ const uint32_t layer_count)
+{
+ assert(cmd_buffer && image);
+
+ uint32_t plane = anv_image_aspect_to_plane(image->aspects, aspect);
+
+ /* The resolved subresource range must have a MCS buffer. */
+ assert(layer_count <= anv_image_aux_layers(image, aspect, 0));
+ assert(image->aspects & VK_IMAGE_ASPECT_ANY_COLOR_BIT && image->samples > 1);
+
+ /* Create a binding table for this surface state. */
+ uint32_t binding_table;
+ VkResult result =
+ binding_table_for_surface_state(cmd_buffer, surface_state,
+ &binding_table);
+ if (result != VK_SUCCESS)
+ return;
+
+ struct blorp_batch batch;
+ blorp_batch_init(&cmd_buffer->device->blorp, &batch, cmd_buffer,
+ BLORP_BATCH_PREDICATE_ENABLE);
+
+ struct blorp_surf surf;
+ get_blorp_surf_for_anv_image(image, aspect,
+ fast_clear_aux_usage(image, aspect),
+ &surf);
+
+ blorp_mcs_partial_resolve_attachment(&batch, binding_table, &surf,
+ image->planes[plane].surface.isl.format,
+ start_layer, layer_count);
+
+ blorp_batch_finish(&batch);
+}
diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h
index 8de5103453..dff023d0f0 100644
--- a/src/intel/vulkan/anv_private.h
+++ b/src/intel/vulkan/anv_private.h
@@ -2507,6 +2507,14 @@ anv_ccs_resolve(struct anv_cmd_buffer * const cmd_buffer,
const enum blorp_fast_clear_op op);
void
+anv_mcs_partial_resolve(struct anv_cmd_buffer * const cmd_buffer,
+ const struct anv_state surface_state,
+ const struct anv_image * const image,
+ VkImageAspectFlagBits aspect,
+ const uint32_t start_layer,
+ const uint32_t layer_count);
+
+void
anv_image_fast_clear(struct anv_cmd_buffer *cmd_buffer,
const struct anv_image *image,
VkImageAspectFlagBits aspect,