diff options
author | Sagar Ghuge <sagar.ghuge@intel.com> | 2019-11-18 11:21:14 -0800 |
---|---|---|
committer | Marge Bot <eric+marge@anholt.net> | 2020-10-22 21:42:36 +0000 |
commit | be2ca24da55974a8129c0981ce7a8277cf5fc7bd (patch) | |
tree | c051ee99c1d266327c097ce61a703f09644e5053 /src/intel | |
parent | c2a41028485d5ca0a67a4396ac7d8e491c688109 (diff) |
anv: Handle compressed stencil buffer transition on Gen12+
Handle compressed stencil buffer transition from one layout to another
on gen12+.
When stencil compression is enabled, we have to initialize buffer via
stencil clear (HZ_OP) before any renderpass.
v2:
- Pass predicate bit false to anv_image_ccs_op (Nanley Chery)
v3:
- update aspect assertion (Nanley Chery)
v4:
- Make state decision based on anv_layout_to_aux_state instated of
anv_layout_to_aux_usage (Sagar Ghuge)
v5:
- No need to handle stencil CCS resolve case (Jason Ekstrand)
- Initialize buffer using HZ_OP (Nanley Chery)
v6: (Nanley Chery)
- Pass correct layer/level count.
- Remove local variable.
v7:
- Skip stencil initialization with HZ_OP packet if followed by fast
clear. (Nanley Chery)
Signed-off-by: Sagar Ghuge <sagar.ghuge@intel.com>
Reviewed-by: Nanley Chery <nanley.g.chery@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/2942>
Diffstat (limited to 'src/intel')
-rw-r--r-- | src/intel/vulkan/genX_cmd_buffer.c | 62 |
1 files changed, 57 insertions, 5 deletions
diff --git a/src/intel/vulkan/genX_cmd_buffer.c b/src/intel/vulkan/genX_cmd_buffer.c index f651a245c5a..80dbc612971 100644 --- a/src/intel/vulkan/genX_cmd_buffer.c +++ b/src/intel/vulkan/genX_cmd_buffer.c @@ -637,7 +637,8 @@ transition_stencil_buffer(struct anv_cmd_buffer *cmd_buffer, uint32_t base_level, uint32_t level_count, uint32_t base_layer, uint32_t layer_count, VkImageLayout initial_layout, - VkImageLayout final_layout) + VkImageLayout final_layout, + bool will_full_fast_clear) { #if GEN_GEN == 7 uint32_t plane = anv_image_aspect_to_plane(image->aspects, @@ -667,7 +668,51 @@ transition_stencil_buffer(struct anv_cmd_buffer *cmd_buffer, base_level, level_count, base_layer, layer_count); } -#endif /* GEN_GEN == 7 */ +#elif GEN_GEN == 12 + uint32_t plane = anv_image_aspect_to_plane(image->aspects, + VK_IMAGE_ASPECT_STENCIL_BIT); + if (image->planes[plane].aux_usage == ISL_AUX_USAGE_NONE) + return; + + if ((initial_layout == VK_IMAGE_LAYOUT_UNDEFINED || + initial_layout == VK_IMAGE_LAYOUT_PREINITIALIZED) && + cmd_buffer->device->physical->has_implicit_ccs && + cmd_buffer->device->info.has_aux_map) { + anv_image_init_aux_tt(cmd_buffer, image, VK_IMAGE_ASPECT_STENCIL_BIT, + base_level, level_count, base_layer, layer_count); + + /* If will_full_fast_clear is set, the caller promises to fast-clear the + * largest portion of the specified range as it can. + */ + if (will_full_fast_clear) + return; + + for (uint32_t l = 0; l < level_count; l++) { + const uint32_t level = base_level + l; + const VkRect2D clear_rect = { + .offset.x = 0, + .offset.y = 0, + .extent.width = anv_minify(image->extent.width, level), + .extent.height = anv_minify(image->extent.height, level), + }; + + uint32_t aux_layers = + anv_image_aux_layers(image, VK_IMAGE_ASPECT_STENCIL_BIT, level); + uint32_t level_layer_count = + MIN2(layer_count, aux_layers - base_layer); + + /* From Bspec's 3DSTATE_STENCIL_BUFFER_BODY > Stencil Compression + * Enable: + * + * "When enabled, Stencil Buffer needs to be initialized via + * stencil clear (HZ_OP) before any renderpass." + */ + anv_image_hiz_clear(cmd_buffer, image, VK_IMAGE_ASPECT_STENCIL_BIT, + level, base_layer, level_layer_count, + clear_rect, 0 /* Stencil clear value */); + } + } +#endif } #define MI_PREDICATE_SRC0 0x2400 @@ -2354,7 +2399,8 @@ void genX(CmdPipelineBarrier)( anv_get_levelCount(image, range), base_layer, layer_count, pImageMemoryBarriers[i].oldLayout, - pImageMemoryBarriers[i].newLayout); + pImageMemoryBarriers[i].newLayout, + false /* will_full_fast_clear */); } if (range->aspectMask & VK_IMAGE_ASPECT_ANY_COLOR_BIT_ANV) { @@ -5236,10 +5282,15 @@ cmd_buffer_begin_subpass(struct anv_cmd_buffer *cmd_buffer, } if (image->aspects & VK_IMAGE_ASPECT_STENCIL_BIT) { + bool will_full_fast_clear = + (att_state->pending_clear_aspects & VK_IMAGE_ASPECT_STENCIL_BIT) && + att_state->fast_clear && full_surface_draw; + transition_stencil_buffer(cmd_buffer, image, level, 1, base_layer, layer_count, att_state->current_stencil_layout, - target_stencil_layout); + target_stencil_layout, + will_full_fast_clear); } att_state->current_layout = target_layout; att_state->current_stencil_layout = target_stencil_layout; @@ -5895,7 +5946,8 @@ cmd_buffer_end_subpass(struct anv_cmd_buffer *cmd_buffer) iview->planes[0].isl.base_level, 1, base_layer, layer_count, att_state->current_stencil_layout, - target_stencil_layout); + target_stencil_layout, + false /* will_full_fast_clear */); } } |