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 {