[Mesa-dev] [PATCH 20/29] anv/cmd_buffer: Decide whether or not to HiZ clear up-front
Pohjolainen, Topi
topi.pohjolainen at gmail.com
Mon Dec 18 19:45:46 UTC 2017
On Mon, Nov 27, 2017 at 07:06:10PM -0800, Jason Ekstrand wrote:
> This moves the decision out of begin_subpass and into BeginRenderPass
> like the decision for color clears. We use a similar name for the
> function for depth/stencil as for color even though no aux usage is
> really getting computed.
> ---
> src/intel/vulkan/genX_cmd_buffer.c | 84 +++++++++++++++++++++++---------------
> 1 file changed, 50 insertions(+), 34 deletions(-)
>
> diff --git a/src/intel/vulkan/genX_cmd_buffer.c b/src/intel/vulkan/genX_cmd_buffer.c
> index 57685bd..3f90c1a 100644
> --- a/src/intel/vulkan/genX_cmd_buffer.c
> +++ b/src/intel/vulkan/genX_cmd_buffer.c
> @@ -346,6 +346,52 @@ color_attachment_compute_aux_usage(struct anv_device * device,
> }
> }
>
> +static void
> +depth_stencil_attachment_compute_aux_usage(struct anv_device *device,
> + struct anv_cmd_state *cmd_state,
> + uint32_t att, VkRect2D render_area)
> +{
> + struct anv_attachment_state *att_state = &cmd_state->attachments[att];
> + struct anv_image_view *iview = cmd_state->framebuffer->attachments[att];
> +
> + /* These will be initialized after the first subpass transition. */
> + att_state->aux_usage = ISL_AUX_USAGE_NONE;
> + att_state->input_aux_usage = ISL_AUX_USAGE_NONE;
> +
> + if (att_state->aux_usage != ISL_AUX_USAGE_HIZ) {
> + att_state->fast_clear = false;
> + return;
> + } else if (!(att_state->pending_clear_aspects & VK_IMAGE_ASPECT_DEPTH_BIT)) {
> + /* If we're just clearing stencil, we can always HiZ clear */
> + att_state->fast_clear = true;
I need to check that I understood. This is possible because the clear doesn't
trigger for depth later on, right? If so, what does setting fast_clear
actually help?
> + return;
> + }
> +
> + if (!blorp_can_hiz_clear_depth(GEN_GEN,
> + iview->planes[0].isl.format,
> + iview->image->samples,
> + render_area.offset.x,
> + render_area.offset.y,
> + render_area.offset.x +
> + render_area.extent.width,
> + render_area.offset.y +
> + render_area.extent.height)) {
> + att_state->fast_clear = false;
> + } else if (att_state->clear_value.depthStencil.depth != ANV_HZ_FC_VAL) {
> + att_state->fast_clear = false;
> + } else if (GEN_GEN == 8 &&
> + anv_can_sample_with_hiz(&device->info, iview->image)) {
> + /* Only gen9+ supports returning ANV_HZ_FC_VAL when sampling a
> + * fast-cleared portion of a HiZ buffer. Testing has revealed that Gen8
> + * only supports returning 0.0f. Gens prior to gen8 do not support this
> + * feature at all.
> + */
> + att_state->fast_clear = false;
> + } else {
> + att_state->fast_clear = true;
> + }
> +}
> +
> static bool
> need_input_attachment_state(const struct anv_render_pass_attachment *att)
> {
> @@ -1052,12 +1098,9 @@ genX(cmd_buffer_setup_attachments)(struct anv_cmd_buffer *cmd_buffer,
> add_image_view_relocs(cmd_buffer, iview, 0,
> state->attachments[i].color);
> } else {
> - /* This field will be initialized after the first subpass
> - * transition.
> - */
> - state->attachments[i].aux_usage = ISL_AUX_USAGE_NONE;
> -
> - state->attachments[i].input_aux_usage = ISL_AUX_USAGE_NONE;
> + depth_stencil_attachment_compute_aux_usage(cmd_buffer->device,
> + state, i,
> + begin->renderArea);
> }
>
> if (need_input_attachment_state(&pass->attachments[i])) {
> @@ -3228,34 +3271,7 @@ cmd_buffer_begin_subpass(struct anv_cmd_buffer *cmd_buffer,
> VK_IMAGE_ASPECT_STENCIL_BIT));
>
> if (att_state->pending_clear_aspects) {
> - bool clear_with_hiz = att_state->aux_usage == ISL_AUX_USAGE_HIZ;
> - if (clear_with_hiz &&
> - (att_state->pending_clear_aspects & VK_IMAGE_ASPECT_DEPTH_BIT)) {
> - if (!blorp_can_hiz_clear_depth(GEN_GEN,
> - iview->planes[0].isl.format,
> - iview->image->samples,
> - render_area.offset.x,
> - render_area.offset.y,
> - render_area.offset.x +
> - render_area.extent.width,
> - render_area.offset.y +
> - render_area.extent.height)) {
> - clear_with_hiz = false;
> - } else if (att_state->clear_value.depthStencil.depth != ANV_HZ_FC_VAL) {
> - clear_with_hiz = false;
> - } else if (GEN_GEN == 8 &&
> - anv_can_sample_with_hiz(&cmd_buffer->device->info,
> - iview->image)) {
> - /* Only gen9+ supports returning ANV_HZ_FC_VAL when sampling a
> - * fast-cleared portion of a HiZ buffer. Testing has revealed
> - * that Gen8 only supports returning 0.0f. Gens prior to gen8
> - * do not support this feature at all.
> - */
> - clear_with_hiz = false;
> - }
> - }
> -
> - if (clear_with_hiz) {
> + if (att_state->fast_clear) {
> /* We currently only support HiZ for single-layer images */
> assert(iview->planes[0].isl.base_level == 0);
> assert(iview->planes[0].isl.base_array_layer == 0);
> --
> 2.5.0.400.gff86faf
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list