MVKCmdClearImage: Use layered rendering when possible.
diff --git a/MoltenVK/MoltenVK/Commands/MVKCmdTransfer.mm b/MoltenVK/MoltenVK/Commands/MVKCmdTransfer.mm
index 15e4b1f..76964a0 100644
--- a/MoltenVK/MoltenVK/Commands/MVKCmdTransfer.mm
+++ b/MoltenVK/MoltenVK/Commands/MVKCmdTransfer.mm
@@ -1345,20 +1345,41 @@
 				layerEnd = layerStart + layerCnt;
 			}
 
-            for (uint32_t layer = layerStart; layer < layerEnd; layer++) {
+            // If we can do layered rendering, I can clear all the layers at once.
+            if (cmdEncoder->getDevice()->_pMetalFeatures->layeredRendering &&
+                (_image->getSampleCount() == VK_SAMPLE_COUNT_1_BIT || cmdEncoder->getDevice()->_pMetalFeatures->multisampleLayeredRendering)) {
                 if (is3D) {
-                    mtlRPCADesc.depthPlane = layer;
-                    mtlRPDADesc.depthPlane = layer;
-                    mtlRPSADesc.depthPlane = layer;
+                    mtlRPCADesc.depthPlane = layerStart;
+                    mtlRPDADesc.depthPlane = layerStart;
+                    mtlRPSADesc.depthPlane = layerStart;
                 } else {
-                    mtlRPCADesc.slice = layer;
-                    mtlRPDADesc.slice = layer;
-                    mtlRPSADesc.slice = layer;
+                    mtlRPCADesc.slice = layerStart;
+                    mtlRPDADesc.slice = layerStart;
+                    mtlRPSADesc.slice = layerStart;
                 }
+                mtlRPDesc.renderTargetArrayLength = (layerCnt == VK_REMAINING_ARRAY_LAYERS
+                                                     ? (_image->getLayerCount() - layerStart)
+                                                     : layerCnt);
 
                 id<MTLRenderCommandEncoder> mtlRendEnc = [cmdEncoder->_mtlCmdBuffer renderCommandEncoderWithDescriptor: mtlRPDesc];
-				setLabelIfNotNil(mtlRendEnc, mtlRendEncName);
+                setLabelIfNotNil(mtlRendEnc, mtlRendEncName);
                 [mtlRendEnc endEncoding];
+            } else {
+                for (uint32_t layer = layerStart; layer < layerEnd; layer++) {
+                    if (is3D) {
+                        mtlRPCADesc.depthPlane = layer;
+                        mtlRPDADesc.depthPlane = layer;
+                        mtlRPSADesc.depthPlane = layer;
+                    } else {
+                        mtlRPCADesc.slice = layer;
+                        mtlRPDADesc.slice = layer;
+                        mtlRPSADesc.slice = layer;
+                    }
+
+                    id<MTLRenderCommandEncoder> mtlRendEnc = [cmdEncoder->_mtlCmdBuffer renderCommandEncoderWithDescriptor: mtlRPDesc];
+                    setLabelIfNotNil(mtlRendEnc, mtlRendEncName);
+                    [mtlRendEnc endEncoding];
+                }
             }
         }
     }