anv/cmd_buffer: Iterate all subpass attachments when clearing
This unifies things a bit because we now handle depth and stencil at the same time. Reviewed-by: Nanley Chery <nanley.g.chery@intel.com>
This commit is contained in:
parent
2cc3445eb2
commit
e526d49edd
1 changed files with 33 additions and 45 deletions
|
|
@ -3563,66 +3563,52 @@ cmd_buffer_begin_subpass(struct anv_cmd_buffer *cmd_buffer,
|
|||
|
||||
VkRect2D render_area = cmd_buffer->state.render_area;
|
||||
struct anv_framebuffer *fb = cmd_buffer->state.framebuffer;
|
||||
for (uint32_t i = 0; i < subpass->color_count; ++i) {
|
||||
const uint32_t a = subpass->color_attachments[i].attachment;
|
||||
|
||||
for (uint32_t i = 0; i < subpass->attachment_count; ++i) {
|
||||
const uint32_t a = subpass->attachments[i].attachment;
|
||||
if (a == VK_ATTACHMENT_UNUSED)
|
||||
continue;
|
||||
|
||||
assert(a < cmd_state->pass->attachment_count);
|
||||
struct anv_attachment_state *att_state = &cmd_state->attachments[a];
|
||||
|
||||
if (!att_state->pending_clear_aspects)
|
||||
continue;
|
||||
|
||||
assert(att_state->pending_clear_aspects == VK_IMAGE_ASPECT_COLOR_BIT);
|
||||
|
||||
struct anv_image_view *iview = fb->attachments[a];
|
||||
const struct anv_image *image = iview->image;
|
||||
|
||||
/* Multi-planar images are not supported as attachments */
|
||||
assert(image->aspects == VK_IMAGE_ASPECT_COLOR_BIT);
|
||||
assert(image->n_planes == 1);
|
||||
if (att_state->pending_clear_aspects & VK_IMAGE_ASPECT_COLOR_BIT) {
|
||||
assert(att_state->pending_clear_aspects == VK_IMAGE_ASPECT_COLOR_BIT);
|
||||
|
||||
uint32_t base_clear_layer = iview->planes[0].isl.base_array_layer;
|
||||
uint32_t clear_layer_count = fb->layers;
|
||||
|
||||
if (att_state->fast_clear) {
|
||||
/* We only support fast-clears on the first layer */
|
||||
assert(iview->planes[0].isl.base_level == 0);
|
||||
assert(iview->planes[0].isl.base_array_layer == 0);
|
||||
|
||||
anv_image_ccs_op(cmd_buffer, image, VK_IMAGE_ASPECT_COLOR_BIT,
|
||||
0, 0, 1, ISL_AUX_OP_FAST_CLEAR, false);
|
||||
base_clear_layer++;
|
||||
clear_layer_count--;
|
||||
}
|
||||
|
||||
if (clear_layer_count > 0) {
|
||||
/* Multi-planar images are not supported as attachments */
|
||||
assert(image->aspects == VK_IMAGE_ASPECT_COLOR_BIT);
|
||||
assert(image->n_planes == 1);
|
||||
anv_image_clear_color(cmd_buffer, image, VK_IMAGE_ASPECT_COLOR_BIT,
|
||||
att_state->aux_usage,
|
||||
iview->planes[0].isl.format,
|
||||
iview->planes[0].isl.swizzle,
|
||||
iview->planes[0].isl.base_level,
|
||||
base_clear_layer, clear_layer_count, render_area,
|
||||
vk_to_isl_color(att_state->clear_value.color));
|
||||
}
|
||||
|
||||
att_state->pending_clear_aspects = 0;
|
||||
}
|
||||
uint32_t base_clear_layer = iview->planes[0].isl.base_array_layer;
|
||||
uint32_t clear_layer_count = fb->layers;
|
||||
|
||||
if (subpass->depth_stencil_attachment.attachment != VK_ATTACHMENT_UNUSED) {
|
||||
const uint32_t a = subpass->depth_stencil_attachment.attachment;
|
||||
if (att_state->fast_clear) {
|
||||
/* We only support fast-clears on the first layer */
|
||||
assert(iview->planes[0].isl.base_level == 0);
|
||||
assert(iview->planes[0].isl.base_array_layer == 0);
|
||||
|
||||
assert(a < cmd_state->pass->attachment_count);
|
||||
struct anv_attachment_state *att_state = &cmd_state->attachments[a];
|
||||
struct anv_image_view *iview = fb->attachments[a];
|
||||
const struct anv_image *image = iview->image;
|
||||
anv_image_ccs_op(cmd_buffer, image, VK_IMAGE_ASPECT_COLOR_BIT,
|
||||
0, 0, 1, ISL_AUX_OP_FAST_CLEAR, false);
|
||||
base_clear_layer++;
|
||||
clear_layer_count--;
|
||||
}
|
||||
|
||||
assert(image->aspects & (VK_IMAGE_ASPECT_DEPTH_BIT |
|
||||
VK_IMAGE_ASPECT_STENCIL_BIT));
|
||||
|
||||
if (att_state->pending_clear_aspects) {
|
||||
if (clear_layer_count > 0) {
|
||||
assert(image->n_planes == 1);
|
||||
anv_image_clear_color(cmd_buffer, image, VK_IMAGE_ASPECT_COLOR_BIT,
|
||||
att_state->aux_usage,
|
||||
iview->planes[0].isl.format,
|
||||
iview->planes[0].isl.swizzle,
|
||||
iview->planes[0].isl.base_level,
|
||||
base_clear_layer, clear_layer_count,
|
||||
render_area,
|
||||
vk_to_isl_color(att_state->clear_value.color));
|
||||
}
|
||||
} else if (att_state->pending_clear_aspects & (VK_IMAGE_ASPECT_DEPTH_BIT |
|
||||
VK_IMAGE_ASPECT_STENCIL_BIT)) {
|
||||
if (att_state->fast_clear) {
|
||||
/* We currently only support HiZ for single-layer images */
|
||||
assert(iview->planes[0].isl.base_level == 0);
|
||||
|
|
@ -3645,6 +3631,8 @@ cmd_buffer_begin_subpass(struct anv_cmd_buffer *cmd_buffer,
|
|||
att_state->clear_value.depthStencil.depth,
|
||||
att_state->clear_value.depthStencil.stencil);
|
||||
}
|
||||
} else {
|
||||
assert(att_state->pending_clear_aspects == 0);
|
||||
}
|
||||
|
||||
att_state->pending_clear_aspects = 0;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue