[Fix] (GL): accept GL_SRC_ALPHA_SATURATE as a source and destination blend factor

This commit is contained in:
2026-10-12 03:55:48 -04:00
parent e7cd3a3290
commit 03aa1528a8
6 changed files with 28 additions and 0 deletions
+3
View File
@@ -50,6 +50,9 @@ namespace MobileGL {
OneMinusSrc1Color,
Src1Alpha,
OneMinusSrc1Alpha,
// GL_SRC_ALPHA_SATURATE: (f, f, f, 1) with f = min(As, 1 - Ad). Legal as a source and a
// destination factor in desktop GL. Appended so the values above keep their encoding.
SrcAlphaSaturate,
BlendFactorCount,
Unknown = -1
};
@@ -104,6 +104,23 @@ TEST_F(RenderStateTest, IndexedBlendTogglesStillWork) {
EXPECT_EQ(MG_Impl::GLImpl::GetError(), GL_NO_ERROR);
}
TEST_F(RenderStateTest, SrcAlphaSaturateIsAcceptedAsSourceAndDestinationFactor) {
// Desktop GL takes GL_SRC_ALPHA_SATURATE for all four factors (KHR-GL30.api.coverage).
MG_Impl::GLImpl::BlendFuncSeparate(GL_SRC_ALPHA_SATURATE, GL_SRC_ALPHA_SATURATE, GL_SRC_ALPHA_SATURATE,
GL_SRC_ALPHA_SATURATE);
EXPECT_EQ(MG_Impl::GLImpl::GetError(), GL_NO_ERROR);
for (const GLenum pname : {GL_BLEND_SRC_RGB, GL_BLEND_DST_RGB, GL_BLEND_SRC_ALPHA, GL_BLEND_DST_ALPHA}) {
GLint value = 0;
MG_Impl::GLImpl::GetIntegerv(pname, &value);
EXPECT_EQ(value, GL_SRC_ALPHA_SATURATE) << "pname " << pname;
}
MG_Impl::GLImpl::BlendFunci(1, GL_SRC_ALPHA_SATURATE, GL_SRC_ALPHA_SATURATE);
EXPECT_EQ(MG_Impl::GLImpl::GetError(), GL_NO_ERROR);
MG_Impl::GLImpl::BlendFunc(GL_ONE, GL_ZERO);
EXPECT_EQ(MG_Impl::GLImpl::GetError(), GL_NO_ERROR);
}
// ---------------------------------------------------------------------------------------------
// ARB_viewport_array: indexed viewport / scissor / depth-range state
// ---------------------------------------------------------------------------------------------
@@ -48,6 +48,8 @@ namespace MobileGL {
return BlendFactor::Src1Alpha;
case GL_ONE_MINUS_SRC1_ALPHA:
return BlendFactor::OneMinusSrc1Alpha;
case GL_SRC_ALPHA_SATURATE:
return BlendFactor::SrcAlphaSaturate;
default:
return BlendFactor::Unknown;
}
@@ -49,6 +49,8 @@ namespace MobileGL {
return GL_SRC1_ALPHA;
case BlendFactor::OneMinusSrc1Alpha:
return GL_ONE_MINUS_SRC1_ALPHA;
case BlendFactor::SrcAlphaSaturate:
return GL_SRC_ALPHA_SATURATE;
default:
return GL_UNKNOWN_MGL;
}
@@ -48,6 +48,8 @@ namespace MobileGL {
return "Src1Alpha";
case BlendFactor::OneMinusSrc1Alpha:
return "OneMinusSrc1Alpha";
case BlendFactor::SrcAlphaSaturate:
return "SrcAlphaSaturate";
default:
return "Unknown";
}
@@ -200,6 +200,8 @@ namespace MobileGL {
return VK_BLEND_FACTOR_SRC1_ALPHA;
case BlendFactor::OneMinusSrc1Alpha:
return VK_BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA;
case BlendFactor::SrcAlphaSaturate:
return VK_BLEND_FACTOR_SRC_ALPHA_SATURATE;
default:
return VK_BLEND_FACTOR_ONE;
}