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 <nanley.g.chery@intel.com>
This commit is contained in:
Jason Ekstrand
2017-11-27 10:20:00 -08:00
parent 6fc8555610
commit 2cc3445eb2
+72 -35
View File
@@ -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);