anv/meta_clear: Don't trash state if no clears are needed
authorJason Ekstrand <jason.ekstrand@intel.com>
Sat, 21 Nov 2015 19:39:12 +0000 (11:39 -0800)
committerJason Ekstrand <jason.ekstrand@intel.com>
Sat, 21 Nov 2015 19:39:12 +0000 (11:39 -0800)
src/vulkan/anv_meta_clear.c

index 16e15c67cc9a3fd41f6c92d689334aefcd769e5a..6645e37d1248193fe2bb8ad21354b17871ad1f65 100644 (file)
@@ -619,6 +619,32 @@ anv_cmd_buffer_clear_attachments(struct anv_cmd_buffer *cmd_buffer,
 {
    struct anv_meta_saved_state saved_state;
 
+   /* Figure out whether or not we actually need to clear anything to avoid
+    * trashing state when clearing is a no-op.
+    */
+   bool needs_clear = false;
+   for (uint32_t a = 0; a < pass->attachment_count; ++a) {
+      struct anv_render_pass_attachment *att = &pass->attachments[a];
+
+      if (anv_format_is_color(att->format)) {
+         if (att->load_op == VK_ATTACHMENT_LOAD_OP_CLEAR) {
+            needs_clear = true;
+            break;
+         }
+      } else {
+         if ((att->format->depth_format &&
+              att->load_op == VK_ATTACHMENT_LOAD_OP_CLEAR) ||
+             (att->format->has_stencil &&
+              att->stencil_load_op == VK_ATTACHMENT_LOAD_OP_CLEAR)) {
+            needs_clear = true;
+            break;
+         }
+      }
+   }
+
+   if (!needs_clear)
+      return;
+
    meta_clear_begin(&saved_state, cmd_buffer);
 
    for (uint32_t a = 0; a < pass->attachment_count; ++a) {