radv: add radv_attachment_needs_clear() helper

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
This commit is contained in:
Samuel Pitoiset 2017-09-28 21:47:14 +02:00
parent 0a208122d7
commit a821771c56
1 changed files with 32 additions and 40 deletions

View File

@ -1075,32 +1075,32 @@ emit_clear(struct radv_cmd_buffer *cmd_buffer,
}
}
static bool
subpass_needs_clear(const struct radv_cmd_buffer *cmd_buffer)
static inline bool
radv_attachment_needs_clear(struct radv_cmd_state *cmd_state, uint32_t a)
{
const struct radv_cmd_state *cmd_state = &cmd_buffer->state;
uint32_t ds;
uint32_t view_mask = cmd_state->subpass->view_mask;
return (a != VK_ATTACHMENT_UNUSED &&
cmd_state->attachments[a].pending_clear_aspects &&
(!view_mask || (view_mask & ~cmd_state->attachments[a].cleared_views)));
}
static bool
radv_subpass_needs_clear(struct radv_cmd_buffer *cmd_buffer)
{
struct radv_cmd_state *cmd_state = &cmd_buffer->state;
uint32_t a;
if (!cmd_state->subpass)
return false;
uint32_t view_mask = cmd_state->subpass->view_mask;
ds = cmd_state->subpass->depth_stencil_attachment.attachment;
for (uint32_t i = 0; i < cmd_state->subpass->color_count; ++i) {
uint32_t a = cmd_state->subpass->color_attachments[i].attachment;
if (a != VK_ATTACHMENT_UNUSED &&
cmd_state->attachments[a].pending_clear_aspects &&
(!view_mask || (view_mask & ~cmd_state->attachments[a].cleared_views))) {
a = cmd_state->subpass->color_attachments[i].attachment;
if (radv_attachment_needs_clear(cmd_state, a))
return true;
}
}
if (ds != VK_ATTACHMENT_UNUSED &&
cmd_state->attachments[ds].pending_clear_aspects &&
(!view_mask || (view_mask & ~cmd_state->attachments[ds].cleared_views))) {
return true;
}
return false;
a = cmd_state->subpass->depth_stencil_attachment.attachment;
return radv_attachment_needs_clear(cmd_state, a);
}
/**
@ -1117,7 +1117,7 @@ radv_cmd_buffer_clear_subpass(struct radv_cmd_buffer *cmd_buffer)
enum radv_cmd_flush_bits post_flush = 0;
uint32_t view_mask = cmd_buffer->state.subpass->view_mask;
if (!subpass_needs_clear(cmd_buffer))
if (!radv_subpass_needs_clear(cmd_buffer))
return;
radv_meta_save_graphics_reset_vport_scissor_novertex(&saved_state, cmd_buffer);
@ -1131,9 +1131,7 @@ radv_cmd_buffer_clear_subpass(struct radv_cmd_buffer *cmd_buffer)
for (uint32_t i = 0; i < cmd_state->subpass->color_count; ++i) {
uint32_t a = cmd_state->subpass->color_attachments[i].attachment;
if (a == VK_ATTACHMENT_UNUSED ||
!cmd_state->attachments[a].pending_clear_aspects ||
(view_mask && !(view_mask & ~cmd_state->attachments[a].cleared_views)))
if (!radv_attachment_needs_clear(cmd_state, a))
continue;
assert(cmd_state->attachments[a].pending_clear_aspects ==
@ -1154,25 +1152,19 @@ radv_cmd_buffer_clear_subpass(struct radv_cmd_buffer *cmd_buffer)
}
uint32_t ds = cmd_state->subpass->depth_stencil_attachment.attachment;
if (radv_attachment_needs_clear(cmd_state, ds)) {
VkClearAttachment clear_att = {
.aspectMask = cmd_state->attachments[ds].pending_clear_aspects,
.clearValue = cmd_state->attachments[ds].clear_value,
};
if (ds != VK_ATTACHMENT_UNUSED) {
if (cmd_state->attachments[ds].pending_clear_aspects &&
(!view_mask || (view_mask & ~cmd_state->attachments[ds].cleared_views))) {
VkClearAttachment clear_att = {
.aspectMask = cmd_state->attachments[ds].pending_clear_aspects,
.clearValue = cmd_state->attachments[ds].clear_value,
};
emit_clear(cmd_buffer, &clear_att, &clear_rect,
&pre_flush, &post_flush,
view_mask & ~cmd_state->attachments[ds].cleared_views);
if (view_mask)
cmd_state->attachments[ds].cleared_views |= view_mask;
else
cmd_state->attachments[ds].pending_clear_aspects = 0;
}
emit_clear(cmd_buffer, &clear_att, &clear_rect, &pre_flush,
&post_flush,
view_mask & ~cmd_state->attachments[ds].cleared_views);
if (view_mask)
cmd_state->attachments[ds].cleared_views |= view_mask;
else
cmd_state->attachments[ds].pending_clear_aspects = 0;
}
radv_meta_restore(&saved_state, cmd_buffer);