Merge pull request #1401 from billhollings/alpha-to-coverage-no-color-attachment
Support alpha-to-coverage without a color attachment.
diff --git a/Docs/Whats_New.md b/Docs/Whats_New.md
index ed29646..32b0135 100644
--- a/Docs/Whats_New.md
+++ b/Docs/Whats_New.md
@@ -22,6 +22,7 @@
- Fix swizzle of depth and stencil values into RGBA (`float4`) variable in shaders.
- Disable `VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT` for
`VK_FORMAT_E5B9G9R9_UFLOAT_PACK32` on macOS Apple Silicon.
+- Support alpha-to-coverage without a color attachment.
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.mm b/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.mm
index 6cf3d3b..b6bde21 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.mm
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.mm
@@ -1546,7 +1546,12 @@
MVKPixelFormats* pixFmts = getPixelFormats();
MTLPixelFormat mtlDSFormat = pixFmts->getMTLPixelFormat(mvkRenderSubpass->getDepthStencilFormat());
- shaderConfig.options.mslOptions.enable_frag_output_mask = 0;
+ // Disable any unused color attachments, because Metal validation can complain if the
+ // fragment shader outputs a color value without a corresponding color attachment.
+ // However, if alpha-to-coverage is enabled, we must enable the fragment shader first color output,
+ // even without a color attachment present or in use, so that coverage can be calculated.
+ bool hasA2C = pCreateInfo->pMultisampleState && pCreateInfo->pMultisampleState->alphaToCoverageEnable;
+ shaderConfig.options.mslOptions.enable_frag_output_mask = hasA2C ? 1 : 0;
if (pCreateInfo->pColorBlendState) {
for (uint32_t caIdx = 0; caIdx < pCreateInfo->pColorBlendState->attachmentCount; caIdx++) {
if (mvkRenderSubpass->isColorAttachmentUsed(caIdx)) {