diff options
author | Nanley Chery <[email protected]> | 2017-03-10 16:31:16 -0800 |
---|---|---|
committer | Nanley Chery <[email protected]> | 2017-06-26 11:09:12 -0700 |
commit | 4b2a2b70e09a04b6dbcf992c864fda7dc1169be1 (patch) | |
tree | 783e9b798364bc46bed5ca4af3d88616b7ebaebe /src/intel/vulkan | |
parent | d1119ab7b6e7d92505f4855e4f9f4d19e5a94804 (diff) |
anv/blorp: Add a surface-state-based CCS resolve function
This will be used in the next patch.
v2:
- Omit BLORP_BATCH_NO_EMIT_DEPTH_STENCIL (Jason Ekstrand)
- Update commit message.
Signed-off-by: Nanley Chery <[email protected]>
Reviewed-by: Iago Toral Quiroga <[email protected]>
Reviewed-by: Jason Ekstrand <[email protected]>
Diffstat (limited to 'src/intel/vulkan')
-rw-r--r-- | src/intel/vulkan/anv_blorp.c | 38 | ||||
-rw-r--r-- | src/intel/vulkan/anv_private.h | 6 |
2 files changed, 44 insertions, 0 deletions
diff --git a/src/intel/vulkan/anv_blorp.c b/src/intel/vulkan/anv_blorp.c index 5ee67f50c2b..8cb7779fd2e 100644 --- a/src/intel/vulkan/anv_blorp.c +++ b/src/intel/vulkan/anv_blorp.c @@ -1739,3 +1739,41 @@ anv_gen8_hiz_op_resolve(struct anv_cmd_buffer *cmd_buffer, blorp_hiz_op(&batch, &surf, 0, 0, 1, op); blorp_batch_finish(&batch); } + +void +anv_ccs_resolve(struct anv_cmd_buffer * const cmd_buffer, + const struct anv_state surface_state, + const struct anv_image * const image, + const uint8_t level, const uint32_t layer_count, + const enum blorp_fast_clear_op op) +{ + assert(cmd_buffer && image); + + /* The resolved subresource range must have a CCS buffer. */ + assert(level < anv_image_aux_levels(image)); + assert(layer_count <= anv_image_aux_layers(image, level)); + assert(image->aspects == VK_IMAGE_ASPECT_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, 0); + + struct blorp_surf surf; + get_blorp_surf_for_anv_image(image, VK_IMAGE_ASPECT_COLOR_BIT, + image->aux_usage == ISL_AUX_USAGE_CCS_E ? + ISL_AUX_USAGE_CCS_E : ISL_AUX_USAGE_CCS_D, + &surf); + + blorp_ccs_resolve_attachment(&batch, binding_table, &surf, level, + layer_count, image->color_surface.isl.format, + op); + + blorp_batch_finish(&batch); +} diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index b6f9cbdfdbc..573778dad55 100644 --- a/src/intel/vulkan/anv_private.h +++ b/src/intel/vulkan/anv_private.h @@ -2128,6 +2128,12 @@ void anv_gen8_hiz_op_resolve(struct anv_cmd_buffer *cmd_buffer, const struct anv_image *image, enum blorp_hiz_op op); +void +anv_ccs_resolve(struct anv_cmd_buffer * const cmd_buffer, + const struct anv_state surface_state, + const struct anv_image * const image, + const uint8_t level, const uint32_t layer_count, + const enum blorp_fast_clear_op op); void anv_image_ccs_clear(struct anv_cmd_buffer *cmd_buffer, |