Metal: Fix clearing of subresource mipmaps.

On Intel the lazy-clearing optimization that bundled multiple
subresources at once to lazy-clear failed when multiple different
mip-levels were bundled together. The rendering was "clipped" to the
size of the smalled miplevel, resulting in some mip levels not being
fully cleared.

Bug:
Change-Id: Icfafbeae25bd426119a0b499237052c87eafe93e
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/22341
Reviewed-by: Austin Eng <enga@chromium.org>
Reviewed-by: Stephen White <senorblanco@chromium.org>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Commit-Queue: Corentin Wallez <cwallez@chromium.org>
diff --git a/src/dawn_native/metal/TextureMTL.mm b/src/dawn_native/metal/TextureMTL.mm
index 46fe75b..ece0214 100644
--- a/src/dawn_native/metal/TextureMTL.mm
+++ b/src/dawn_native/metal/TextureMTL.mm
@@ -421,12 +421,13 @@
                 }
             } else {
                 ASSERT(GetFormat().IsColor());
-                MTLRenderPassDescriptor* descriptor = nil;
-                uint32_t attachment = 0;
-
-                // Create multiple render passes with each subresource as a color attachment to
-                // clear them all.
                 for (uint32_t level = baseMipLevel; level < baseMipLevel + levelCount; ++level) {
+                    // Create multiple render passes with each subresource as a color attachment to
+                    // clear them all. Only do this for array layers to ensure all attachments have
+                    // the same size.
+                    MTLRenderPassDescriptor* descriptor = nil;
+                    uint32_t attachment = 0;
+
                     for (uint32_t arrayLayer = baseArrayLayer;
                          arrayLayer < baseArrayLayer + layerCount; arrayLayer++) {
                         if (clearValue == TextureBase::ClearValue::Zero &&
@@ -456,11 +457,11 @@
                             descriptor = nil;
                         }
                     }
-                }
 
-                if (descriptor != nil) {
-                    commandContext->BeginRender(descriptor);
-                    commandContext->EndRender();
+                    if (descriptor != nil) {
+                        commandContext->BeginRender(descriptor);
+                        commandContext->EndRender();
+                    }
                 }
             }
         } else {