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 ...@@ -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)); 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) void Context::blendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
{ {
mGLState.setBlendEquation(modeRGB, 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) void Context::blendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
{ {
mGLState.setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha); mGLState.setBlendFactors(srcRGB, dstRGB, srcAlpha, dstAlpha);
......
...@@ -206,7 +206,9 @@ class Context final : public ValidationContext ...@@ -206,7 +206,9 @@ class Context final : public ValidationContext
void activeTexture(GLenum texture); void activeTexture(GLenum texture);
void blendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); void blendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
void blendEquation(GLenum mode);
void blendEquationSeparate(GLenum modeRGB, GLenum modeAlpha); void blendEquationSeparate(GLenum modeRGB, GLenum modeAlpha);
void blendFunc(GLenum sfactor, GLenum dfactor);
void blendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); void blendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
void clearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); void clearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
void clearDepthf(GLclampf depth); void clearDepthf(GLclampf depth);
......
...@@ -3692,4 +3692,164 @@ bool ValidateBindRenderbuffer(ValidationContext *context, GLenum target, GLuint ...@@ -3692,4 +3692,164 @@ bool ValidateBindRenderbuffer(ValidationContext *context, GLenum target, GLuint
return true; 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 } // namespace gl
...@@ -361,6 +361,14 @@ bool ValidateBindAttribLocation(ValidationContext *context, ...@@ -361,6 +361,14 @@ bool ValidateBindAttribLocation(ValidationContext *context,
bool ValidateBindBuffer(ValidationContext *context, GLenum target, GLuint buffer); bool ValidateBindBuffer(ValidationContext *context, GLenum target, GLuint buffer);
bool ValidateBindFramebuffer(ValidationContext *context, GLenum target, GLuint framebuffer); bool ValidateBindFramebuffer(ValidationContext *context, GLenum target, GLuint framebuffer);
bool ValidateBindRenderbuffer(ValidationContext *context, GLenum target, GLuint renderbuffer); 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 } // namespace gl
......
...@@ -164,191 +164,66 @@ void GL_APIENTRY BlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclamp ...@@ -164,191 +164,66 @@ void GL_APIENTRY BlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclamp
void GL_APIENTRY BlendEquation(GLenum mode) void GL_APIENTRY BlendEquation(GLenum mode)
{ {
BlendEquationSeparate(mode, mode); EVENT("(GLenum mode = 0x%X)", mode);
}
void GL_APIENTRY BlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
{
EVENT("(GLenum modeRGB = 0x%X, GLenum modeAlpha = 0x%X)", modeRGB, modeAlpha);
Context *context = GetValidGlobalContext(); Context *context = GetValidGlobalContext();
if (context) if (context)
{ {
switch (modeRGB) if (!context->skipValidation() && !ValidateBlendEquation(context, mode))
{ {
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; return;
} }
switch (modeAlpha) context->blendEquation(mode);
{
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;
} }
context->blendEquationSeparate(modeRGB, modeAlpha);
}
}
void GL_APIENTRY BlendFunc(GLenum sfactor, GLenum dfactor)
{
BlendFuncSeparate(sfactor, dfactor, sfactor, dfactor);
} }
void GL_APIENTRY BlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha) void GL_APIENTRY BlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)
{ {
EVENT("(GLenum srcRGB = 0x%X, GLenum dstRGB = 0x%X, GLenum srcAlpha = 0x%X, GLenum dstAlpha = 0x%X)", EVENT("(GLenum modeRGB = 0x%X, GLenum modeAlpha = 0x%X)", modeRGB, modeAlpha);
srcRGB, dstRGB, srcAlpha, dstAlpha);
Context *context = GetValidGlobalContext(); Context *context = GetValidGlobalContext();
if (context) if (context)
{ {
switch (srcRGB) if (!context->skipValidation() &&
{ !ValidateBlendEquationSeparate(context, modeRGB, modeAlpha))
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; return;
} }
break;
default: context->blendEquationSeparate(modeRGB, modeAlpha);
context->handleError(Error(GL_INVALID_ENUM));
return;
} }
}
switch (srcAlpha) void GL_APIENTRY BlendFunc(GLenum sfactor, GLenum dfactor)
{ {
case GL_ZERO: EVENT("(GLenum sfactor = 0x%X, GLenum dfactor = 0x%X)", sfactor, dfactor);
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) Context *context = GetValidGlobalContext();
if (context)
{ {
case GL_ZERO: if (!context->skipValidation() && !ValidateBlendFunc(context, sfactor, dfactor))
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; return;
} }
break;
default: context->blendFunc(sfactor, dfactor);
context->handleError(Error(GL_INVALID_ENUM));
return;
} }
}
if (context->getLimitations().noSimultaneousConstantColorAndAlphaBlendFunc) void GL_APIENTRY BlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)
{ {
bool constantColorUsed = EVENT("(GLenum srcRGB = 0x%X, GLenum dstRGB = 0x%X, GLenum srcAlpha = 0x%X, GLenum dstAlpha = 0x%X)",
(srcRGB == GL_CONSTANT_COLOR || srcRGB == GL_ONE_MINUS_CONSTANT_COLOR || srcRGB, dstRGB, srcAlpha, dstAlpha);
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) Context *context = GetValidGlobalContext();
if (context)
{
if (!context->skipValidation() &&
!ValidateBlendFuncSeparate(context, srcRGB, dstRGB, srcAlpha, dstAlpha))
{ {
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); 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