diff options
author | Laura Ekstrand <laura@jlekstrand.net> | 2017-11-01 16:52:25 -0700 |
---|---|---|
committer | Laura Ekstrand <laura@jlekstrand.net> | 2017-11-01 16:52:25 -0700 |
commit | 7cd9cc9dd6ed0d4217992aa6ba08078ba17e2750 (patch) | |
tree | 9517758c389bd2d3ca7291d88ee3d85d7bb24ba5 | |
parent | d25b9dd1a61292842569b7b870666217a1c8e585 (diff) |
intel/vulkan: Added anv_mcs_partial_resolve.
-rw-r--r-- | src/intel/vulkan/anv_blorp.c | 40 | ||||
-rw-r--r-- | src/intel/vulkan/anv_private.h | 8 |
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, |