Merge pull request #1060 from cdavis5e/layered-clears
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];
+ }
}
}
}