Merge pull request #1060 from cdavis5e/layered-clears

MVKCmdClearImage: Use layered rendering when possible.
This commit is contained in:
Bill Hollings 2020-09-22 17:47:47 -04:00 committed by GitHub
commit 6cfe8cdd36
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -1345,20 +1345,41 @@ void MVKCmdClearImage<N>::encode(MVKCommandEncoder* cmdEncoder) {
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];
}
}
}
}