Merge pull request #1144 from cdavis5e/mixed-2d-3d-layered-render

MVKCommandEncoder: Don't set renderTargetArrayLength for mixed 2D/3D renders.
This commit is contained in:
Bill Hollings 2020-11-13 10:43:04 -05:00 committed by GitHub
commit f37c9ad146
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -341,12 +341,29 @@ void MVKCommandEncoder::beginMetalRenderPass(bool loadOverride) {
mtlRPDesc.renderTargetWidthMVK = max(min(_renderArea.offset.x + _renderArea.extent.width, fbExtent.width), 1u);
mtlRPDesc.renderTargetHeightMVK = max(min(_renderArea.offset.y + _renderArea.extent.height, fbExtent.height), 1u);
if (_canUseLayeredRendering) {
uint32_t renderTargetArrayLength;
bool found3D = false, found2D = false;
for (uint32_t i = 0; i < 8; i++) {
id<MTLTexture> mtlTex = mtlRPDesc.colorAttachments[i].texture;
if (mtlTex == nil) { continue; }
switch (mtlTex.textureType) {
case MTLTextureType3D:
found3D = true;
default:
found2D = true;
}
}
if (getSubpass()->isMultiview()) {
// In the case of a multiview pass, the framebuffer layer count will be one.
// We need to use the view count for this multiview pass.
mtlRPDesc.renderTargetArrayLengthMVK = getSubpass()->getViewCountInMetalPass(_multiviewPassIndex);
renderTargetArrayLength = getSubpass()->getViewCountInMetalPass(_multiviewPassIndex);
} else {
mtlRPDesc.renderTargetArrayLengthMVK = _framebuffer->getLayerCount();
renderTargetArrayLength = _framebuffer->getLayerCount();
}
// Metal does not allow layered render passes where some RTs are 3D and others are 2D.
if (!(found3D && found2D) || renderTargetArrayLength > 1) {
mtlRPDesc.renderTargetArrayLengthMVK = renderTargetArrayLength;
}
}