From 7cd9cc9dd6ed0d4217992aa6ba08078ba17e2750 Mon Sep 17 00:00:00 2001 From: Laura Ekstrand Date: Wed, 1 Nov 2017 16:52:25 -0700 Subject: intel/vulkan: Added anv_mcs_partial_resolve. --- src/intel/vulkan/anv_blorp.c | 40 ++++++++++++++++++++++++++++++++++++++++ src/intel/vulkan/anv_private.h | 8 ++++++++ 2 files changed, 48 insertions(+) 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 @@ -2506,6 +2506,14 @@ anv_ccs_resolve(struct anv_cmd_buffer * const cmd_buffer, const uint8_t level, const uint32_t layer_count, 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, -- cgit v1.2.3