[Fix] (Magma): leave the fragment stage out of rasterizer-discard pipelines

This commit is contained in:
2026-10-13 12:47:30 -04:00
parent 6336943b87
commit e8dafacb1c
2 changed files with 13 additions and 1 deletions
@@ -525,6 +525,16 @@ namespace MobileGL::MG_Backend::DirectVulkan {
}
effectiveStages = &adjustedStages;
}
// A static rasterizer discard leaves the pipeline without fragment shader state, and then
// pStages may not name a fragment stage (VUID-VkGraphicsPipelineCreateInfo-pStages-06894).
// Nothing would run it anyway.
if (payload.rasterizerDiscardEnable) {
if (effectiveStages != &adjustedStages) adjustedStages = *effectiveStages;
std::erase_if(adjustedStages, [](const VkPipelineShaderStageCreateInfo& stageInfo) {
return stageInfo.stage == VK_SHADER_STAGE_FRAGMENT_BIT;
});
effectiveStages = &adjustedStages;
}
{
VkShaderStageFlags stagesPresent = 0;
for (const auto& stageInfo : *effectiveStages) {
@@ -265,7 +265,9 @@ namespace MobileGL::MG_Backend::DirectVulkan {
dynamic.dynamicStateCount = 2;
dynamic.pDynamicStates = kDynamic;
VkGraphicsPipelineCreateInfo info{VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO};
info.stageCount = 2;
// As PipelineFactory builds it: a static discard has no fragment shader state, so no
// fragment stage (VUID-VkGraphicsPipelineCreateInfo-pStages-06894).
info.stageCount = discard ? 1u : 2u;
info.pStages = stages;
info.pVertexInputState = &vertexInput;
info.pInputAssemblyState = &assembly;