From 2cc3445eb24af469537911277f7bc4e73a6c5670 Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Mon, 27 Nov 2017 10:20:00 -0800 Subject: [PATCH] anv/cmd_buffer: Decide whether or not to HiZ clear up-front 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. v2 (Jason Ekstrand): - Don't always disable HiZ clears by accident - Use the initial layout to decide whether to do fast clears Reviewed-by: Nanley Chery --- src/intel/vulkan/genX_cmd_buffer.c | 107 +++++++++++++++++++++++++------------ 1 file changed, 72 insertions(+), 35 deletions(-) diff --git a/src/intel/vulkan/genX_cmd_buffer.c b/src/intel/vulkan/genX_cmd_buffer.c index a1cbe26..5b41284 100644 --- a/src/intel/vulkan/genX_cmd_buffer.c +++ b/src/intel/vulkan/genX_cmd_buffer.c @@ -342,6 +342,73 @@ 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_render_pass_attachment *pass_att = + &cmd_state->pass->attachments[att]; + 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 (GEN_GEN == 7) { + /* We don't do any HiZ or depth fast-clears on gen7 yet */ + att_state->fast_clear = false; + return; + } + + 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; + return; + } + + /* Default to false for now */ + att_state->fast_clear = false; + + /* We must have depth in order to have HiZ */ + if (!(iview->image->aspects & VK_IMAGE_ASPECT_DEPTH_BIT)) + return; + + const enum isl_aux_usage first_subpass_aux_usage = + anv_layout_to_aux_usage(&device->info, iview->image, + VK_IMAGE_ASPECT_DEPTH_BIT, + pass_att->first_subpass_layout); + if (first_subpass_aux_usage != ISL_AUX_USAGE_HIZ) + 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)) + return; + + if (att_state->clear_value.depthStencil.depth != ANV_HZ_FC_VAL) + return; + + 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. + */ + return; + } + + /* If we got here, then we can fast clear */ + att_state->fast_clear = true; +} + static bool need_input_attachment_state(const struct anv_render_pass_attachment *att) { @@ -1113,12 +1180,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])) { @@ -3559,35 +3623,8 @@ 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) { - /* We currently only support HiZ for single-slice images */ + 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); assert(fb->layers == 1); -- 2.7.4