Commit 8a9e4bcf by Jamie Madill Committed by Commit Bot

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: 's avatarGeoff Lang <geofflang@chromium.org>
parent dfd7fb2a
......@@ -3104,11 +3104,21 @@ void Context::blendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf a
mGLState.setBlendColor(clamp01(red), clamp01(green), clamp01(blue), clamp01(alpha));
}
void Context::blendEquation(GLenum mode)
{
mGLState.setBlendEquation(mode, mode);
}
void Context::blendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
{
mGLState.setBlendEquation(modeRGB, modeAlpha);
}
void Context::blendFunc(GLenum sfactor, GLenum dfactor)
{
mGLState.setBlendFactors(sfactor, dfactor, sfactor, dfactor);
}
void Context::blendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
{
mGLState.setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
......
......@@ -206,7 +206,9 @@ class Context final : public ValidationContext
void activeTexture(GLenum texture);
void blendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
void blendEquation(GLenum mode);
void blendEquationSeparate(GLenum modeRGB, GLenum modeAlpha);
void blendFunc(GLenum sfactor, GLenum dfactor);
void blendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
void clearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
void clearDepthf(GLclampf depth);
......
......@@ -3692,4 +3692,164 @@ bool ValidateBindRenderbuffer(ValidationContext *context, GLenum target, GLuint
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
......@@ -361,6 +361,14 @@ bool ValidateBindAttribLocation(ValidationContext *context,
bool ValidateBindBuffer(ValidationContext *context, GLenum target, GLuint buffer);
bool ValidateBindFramebuffer(ValidationContext *context, GLenum target, GLuint framebuffer);
bool ValidateBindRenderbuffer(ValidationContext *context, GLenum target, GLuint renderbuffer);
bool ValidateBlendEquation(ValidationContext *context, GLenum mode);
bool ValidateBlendEquationSeparate(ValidationContext *context, GLenum modeRGB, GLenum modeAlpha);
bool ValidateBlendFunc(ValidationContext *context, GLenum sfactor, GLenum dfactor);
bool ValidateBlendFuncSeparate(ValidationContext *context,
GLenum srcRGB,
GLenum dstRGB,
GLenum srcAlpha,
GLenum dstAlpha);
} // namespace gl
......
......@@ -164,7 +164,18 @@ void GL_APIENTRY BlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclamp
void GL_APIENTRY BlendEquation(GLenum mode)
{
BlendEquationSeparate(mode, mode);
EVENT("(GLenum mode = 0x%X)", mode);
Context *context = GetValidGlobalContext();
if (context)
{
if (!context->skipValidation() && !ValidateBlendEquation(context, mode))
{
return;
}
context->blendEquation(mode);
}
}
void GL_APIENTRY BlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
......@@ -174,31 +185,9 @@ void GL_APIENTRY BlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
Context *context = GetValidGlobalContext();
if (context)
{
switch (modeRGB)
{
case GL_FUNC_ADD:
case GL_FUNC_SUBTRACT:
case GL_FUNC_REVERSE_SUBTRACT:
case GL_MIN:
case GL_MAX:
break;
default:
context->handleError(Error(GL_INVALID_ENUM));
return;
}
switch (modeAlpha)
if (!context->skipValidation() &&
!ValidateBlendEquationSeparate(context, modeRGB, modeAlpha))
{
case GL_FUNC_ADD:
case GL_FUNC_SUBTRACT:
case GL_FUNC_REVERSE_SUBTRACT:
case GL_MIN:
case GL_MAX:
break;
default:
context->handleError(Error(GL_INVALID_ENUM));
return;
}
......@@ -208,7 +197,18 @@ void GL_APIENTRY BlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
void GL_APIENTRY BlendFunc(GLenum sfactor, GLenum dfactor)
{
BlendFuncSeparate(sfactor, dfactor, sfactor, dfactor);
EVENT("(GLenum sfactor = 0x%X, GLenum dfactor = 0x%X)", sfactor, dfactor);
Context *context = GetValidGlobalContext();
if (context)
{
if (!context->skipValidation() && !ValidateBlendFunc(context, sfactor, dfactor))
{
return;
}
context->blendFunc(sfactor, dfactor);
}
}
void GL_APIENTRY BlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
......@@ -219,135 +219,10 @@ void GL_APIENTRY BlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha
Context *context = GetValidGlobalContext();
if (context)
{
switch (srcRGB)
{
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:
break;
default:
context->handleError(Error(GL_INVALID_ENUM));
return;
}
switch (dstRGB)
{
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:
break;
case GL_SRC_ALPHA_SATURATE:
if (context->getClientMajorVersion() < 3)
{
context->handleError(Error(GL_INVALID_ENUM));
return;
}
break;
default:
context->handleError(Error(GL_INVALID_ENUM));
return;
}
switch (srcAlpha)
{
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:
break;
default:
context->handleError(Error(GL_INVALID_ENUM));
return;
}
switch (dstAlpha)
{
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:
break;
case GL_SRC_ALPHA_SATURATE:
if (context->getClientMajorVersion() < 3)
{
context->handleError(Error(GL_INVALID_ENUM));
return;
}
break;
default:
context->handleError(Error(GL_INVALID_ENUM));
return;
}
if (context->getLimitations().noSimultaneousConstantColorAndAlphaBlendFunc)
if (!context->skipValidation() &&
!ValidateBlendFuncSeparate(context, srcRGB, dstRGB, srcAlpha, dstAlpha))
{
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));
return;
}
return;
}
context->blendFuncSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment