radv: add radv_attachment_needs_clear() helper
authorSamuel Pitoiset <samuel.pitoiset@gmail.com>
Thu, 28 Sep 2017 19:47:14 +0000 (21:47 +0200)
committerSamuel Pitoiset <samuel.pitoiset@gmail.com>
Mon, 2 Oct 2017 09:56:20 +0000 (11:56 +0200)
Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
src/amd/vulkan/radv_meta_clear.c

index 3317deb..71df17d 100644 (file)
@@ -1075,32 +1075,32 @@ emit_clear(struct radv_cmd_buffer *cmd_buffer,
        }
 }
 
+static inline bool
+radv_attachment_needs_clear(struct radv_cmd_state *cmd_state, uint32_t a)
+{
+       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
-subpass_needs_clear(const struct radv_cmd_buffer *cmd_buffer)
+radv_subpass_needs_clear(struct radv_cmd_buffer *cmd_buffer)
 {
-       const struct radv_cmd_state *cmd_state = &cmd_buffer->state;
-       uint32_t ds;
+       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);