Refactor GLES2 Blend entry points.
BUG=angleproject:747
Change-Id: I775265a7494aedd19ca4f18019e3b3181bfb12e9
Reviewed-on: https://chromium-review.googlesource.com/410135
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
diff --git a/src/libANGLE/validationES2.cpp b/src/libANGLE/validationES2.cpp
index 78931cd..39a0c80 100644
--- a/src/libANGLE/validationES2.cpp
+++ b/src/libANGLE/validationES2.cpp
@@ -3692,4 +3692,164 @@
return true;
}
+static bool ValidBlendEquationMode(GLenum mode)
+{
+ switch (mode)
+ {
+ case GL_FUNC_ADD:
+ case GL_FUNC_SUBTRACT:
+ case GL_FUNC_REVERSE_SUBTRACT:
+ case GL_MIN:
+ case GL_MAX:
+ return true;
+
+ default:
+ return false;
+ }
+}
+
+bool ValidateBlendEquation(ValidationContext *context, GLenum mode)
+{
+ if (!ValidBlendEquationMode(mode))
+ {
+ context->handleError(Error(GL_INVALID_ENUM, "Invalid blend equation"));
+ return false;
+ }
+
+ return true;
+}
+
+bool ValidateBlendEquationSeparate(ValidationContext *context, GLenum modeRGB, GLenum modeAlpha)
+{
+ if (!ValidBlendEquationMode(modeRGB))
+ {
+ context->handleError(Error(GL_INVALID_ENUM, "Invalid RGB blend equation"));
+ return false;
+ }
+
+ if (!ValidBlendEquationMode(modeAlpha))
+ {
+ context->handleError(Error(GL_INVALID_ENUM, "Invalid alpha blend equation"));
+ return false;
+ }
+
+ return true;
+}
+
+bool ValidateBlendFunc(ValidationContext *context, GLenum sfactor, GLenum dfactor)
+{
+ return ValidateBlendFuncSeparate(context, sfactor, dfactor, sfactor, dfactor);
+}
+
+static bool ValidSrcBlendFunc(GLenum srcBlend)
+{
+ switch (srcBlend)
+ {
+ case GL_ZERO:
+ case GL_ONE:
+ case GL_SRC_COLOR:
+ case GL_ONE_MINUS_SRC_COLOR:
+ case GL_DST_COLOR:
+ case GL_ONE_MINUS_DST_COLOR:
+ case GL_SRC_ALPHA:
+ case GL_ONE_MINUS_SRC_ALPHA:
+ case GL_DST_ALPHA:
+ case GL_ONE_MINUS_DST_ALPHA:
+ case GL_CONSTANT_COLOR:
+ case GL_ONE_MINUS_CONSTANT_COLOR:
+ case GL_CONSTANT_ALPHA:
+ case GL_ONE_MINUS_CONSTANT_ALPHA:
+ case GL_SRC_ALPHA_SATURATE:
+ return true;
+
+ default:
+ return false;
+ }
+}
+
+static bool ValidDstBlendFunc(GLenum dstBlend, GLint contextMajorVersion)
+{
+ switch (dstBlend)
+ {
+ case GL_ZERO:
+ case GL_ONE:
+ case GL_SRC_COLOR:
+ case GL_ONE_MINUS_SRC_COLOR:
+ case GL_DST_COLOR:
+ case GL_ONE_MINUS_DST_COLOR:
+ case GL_SRC_ALPHA:
+ case GL_ONE_MINUS_SRC_ALPHA:
+ case GL_DST_ALPHA:
+ case GL_ONE_MINUS_DST_ALPHA:
+ case GL_CONSTANT_COLOR:
+ case GL_ONE_MINUS_CONSTANT_COLOR:
+ case GL_CONSTANT_ALPHA:
+ case GL_ONE_MINUS_CONSTANT_ALPHA:
+ return true;
+
+ case GL_SRC_ALPHA_SATURATE:
+ return (contextMajorVersion >= 3);
+
+ default:
+ return false;
+ }
+}
+
+bool ValidateBlendFuncSeparate(ValidationContext *context,
+ GLenum srcRGB,
+ GLenum dstRGB,
+ GLenum srcAlpha,
+ GLenum dstAlpha)
+{
+ if (!ValidSrcBlendFunc(srcRGB))
+ {
+ context->handleError(Error(GL_INVALID_ENUM, "Invalid blend function"));
+ return false;
+ }
+
+ if (!ValidDstBlendFunc(dstRGB, context->getClientMajorVersion()))
+ {
+ context->handleError(Error(GL_INVALID_ENUM, "Invalid blend function"));
+ return false;
+ }
+
+ if (!ValidSrcBlendFunc(srcAlpha))
+ {
+ context->handleError(Error(GL_INVALID_ENUM, "Invalid blend function"));
+ return false;
+ }
+
+ if (!ValidDstBlendFunc(dstAlpha, context->getClientMajorVersion()))
+ {
+ context->handleError(Error(GL_INVALID_ENUM, "Invalid blend function"));
+ return false;
+ }
+
+ if (context->getLimitations().noSimultaneousConstantColorAndAlphaBlendFunc)
+ {
+ bool constantColorUsed =
+ (srcRGB == GL_CONSTANT_COLOR || srcRGB == GL_ONE_MINUS_CONSTANT_COLOR ||
+ dstRGB == GL_CONSTANT_COLOR || dstRGB == GL_ONE_MINUS_CONSTANT_COLOR);
+
+ bool constantAlphaUsed =
+ (srcRGB == GL_CONSTANT_ALPHA || srcRGB == GL_ONE_MINUS_CONSTANT_ALPHA ||
+ dstRGB == GL_CONSTANT_ALPHA || dstRGB == GL_ONE_MINUS_CONSTANT_ALPHA);
+
+ if (constantColorUsed && constantAlphaUsed)
+ {
+ ERR("Simultaneous use of GL_CONSTANT_ALPHA/GL_ONE_MINUS_CONSTANT_ALPHA and "
+ "GL_CONSTANT_COLOR/GL_ONE_MINUS_CONSTANT_COLOR not supported by this "
+ "implementation.");
+ context->handleError(Error(GL_INVALID_OPERATION,
+ "Simultaneous use of "
+ "GL_CONSTANT_ALPHA/GL_ONE_MINUS_CONSTANT_ALPHA and "
+ "GL_CONSTANT_COLOR/GL_ONE_MINUS_CONSTANT_COLOR not "
+ "supported by this implementation."));
+ return false;
+ }
+ }
+
+ return true;
+}
+
} // namespace gl