Merge pull request #999 from cdavis5e/null-clear-atts

MVKCmdClearAttachments: Don't attempt to clear unused attachments.
diff --git a/MoltenVK/MoltenVK/Commands/MVKCmdTransfer.mm b/MoltenVK/MoltenVK/Commands/MVKCmdTransfer.mm
index 52b49a9..f64f47a 100644
--- a/MoltenVK/MoltenVK/Commands/MVKCmdTransfer.mm
+++ b/MoltenVK/MoltenVK/Commands/MVKCmdTransfer.mm
@@ -1039,6 +1039,11 @@
 
     uint32_t caCnt = subpass->getColorAttachmentCount();
     for (uint32_t caIdx = 0; caIdx < caCnt; caIdx++) {
+        if (!subpass->isColorAttachmentUsed(caIdx)) {
+            // If the subpass attachment isn't actually used, don't try to clear it.
+            _rpsKey.disableAttachment(caIdx);
+            continue;
+        }
         VkFormat vkAttFmt = subpass->getColorAttachmentFormat(caIdx);
 		_rpsKey.attachmentMTLPixelFormats[caIdx] = pixFmts->getMTLPixelFormat(vkAttFmt);
 		MTLClearColor mtlCC = pixFmts->getMTLClearColor(getClearValue(caIdx), vkAttFmt);
@@ -1054,6 +1059,15 @@
 
 	bool isClearingDepth = _isClearingDepth && pixFmts->isDepthFormat(mtlAttFmt);
 	bool isClearingStencil = _isClearingStencil && pixFmts->isStencilFormat(mtlAttFmt);
+    if (!isClearingDepth && !isClearingStencil) {
+        // If the subpass attachment isn't actually used, don't try to clear it.
+        _rpsKey.disableAttachment(kMVKClearAttachmentDepthStencilIndex);
+    }
+
+	if (!_rpsKey.isAnyAttachmentEnabled()) {
+		// Nothing to do.
+		return;
+	}
 
     // Render the clear colors to the attachments
 	MVKCommandEncodingPool* cmdEncPool = cmdEncoder->getCommandEncodingPool();
diff --git a/MoltenVK/MoltenVK/Commands/MVKCommandResourceFactory.h b/MoltenVK/MoltenVK/Commands/MVKCommandResourceFactory.h
index 1bf9bd1..58e6451 100644
--- a/MoltenVK/MoltenVK/Commands/MVKCommandResourceFactory.h
+++ b/MoltenVK/MoltenVK/Commands/MVKCommandResourceFactory.h
@@ -120,8 +120,12 @@
 
     void enableAttachment(uint32_t attIdx) { mvkEnableFlags(flags, bitFlag << attIdx); }
 
+    void disableAttachment(uint32_t attIdx) { mvkDisableFlags(flags, bitFlag << attIdx); }
+
     bool isAttachmentEnabled(uint32_t attIdx) { return mvkIsAnyFlagEnabled(flags, bitFlag << attIdx); }
 
+	bool isAnyAttachmentEnabled() { return mvkIsAnyFlagEnabled(flags, (bitFlag << kMVKClearAttachmentCount) - 1); }
+
 	void enableLayeredRendering() { mvkEnableFlags(flags, bitFlag << kMVKClearAttachmentLayeredRenderingBitIndex); }
 
 	bool isLayeredRenderingEnabled() { return mvkIsAnyFlagEnabled(flags, bitFlag << kMVKClearAttachmentLayeredRenderingBitIndex); }