diff --git a/src/libANGLE/validationES.cpp b/src/libANGLE/validationES.cpp index eb06b24a80..472f968e2f 100644 --- a/src/libANGLE/validationES.cpp +++ b/src/libANGLE/validationES.cpp @@ -4177,23 +4177,38 @@ const char *ValidateDrawStates(const Context *context, GLenum *outErrorCode) const BlendStateExt &blendStateExt = state.getBlendStateExt(); if (ANGLE_UNLIKELY(blendStateExt.getUsesAdvancedBlendEquationMask().any())) { - const size_t drawBufferCount = framebuffer->getDrawbufferStateCount(); - uint32_t advancedBlendRenderTargetCount = 0; - - for (size_t drawBufferIndex : blendStateExt.getUsesAdvancedBlendEquationMask()) + // Per GLES 3.2 / KHR_blend_equation_advanced: when an advanced blend + // equation is in use on *any* enabled draw buffer, every color output + // other than zero must have its draw buffer set to GL_NONE. This is + // also required to satisfy Vulkan + // VUID-VkPipelineColorBlendAttachmentState-advancedBlendIndependentBlend-01407/01408 + // and -colorBlendOp-01410 on devices where the backend uses native + // VK_EXT_blend_operation_advanced. + const DrawBufferMask advancedMask = blendStateExt.getUsesAdvancedBlendEquationMask(); + const DrawBufferMask enabledMask = blendStateExt.getEnabledMask(); + const size_t drawBufferCount = framebuffer->getDrawbufferStateCount(); + + bool advancedBlendActive = false; + for (size_t drawBufferIndex : advancedMask) { if (drawBufferIndex < drawBufferCount && framebuffer->getDrawBufferState(drawBufferIndex) != GL_NONE && - blendStateExt.getEnabledMask().test(drawBufferIndex) && - blendStateExt.getUsesAdvancedBlendEquationMask().test(drawBufferIndex)) + enabledMask.test(drawBufferIndex)) { - ++advancedBlendRenderTargetCount; + advancedBlendActive = true; + break; } } - if (advancedBlendRenderTargetCount > 1) + if (advancedBlendActive) { - return kAdvancedBlendEquationWithMRT; + for (size_t drawBufferIndex = 1; drawBufferIndex < drawBufferCount; ++drawBufferIndex) + { + if (framebuffer->getDrawBufferState(drawBufferIndex) != GL_NONE) + { + return kAdvancedBlendEquationWithMRT; + } + } } }