Commit ff325f1b by Jamie Madill Committed by Commit Bot

Refactor ES3 uniform entry points.

This should improve validation speed slightly because it allows us to move the ES3-only check into the ES3-only code, and make it a bit simpler. BUG=angleproject:747 BUG=angleproject:1390 Change-Id: I41f9ffef1c6a552fde924e62e481831f07b1503a Reviewed-on: https://chromium-review.googlesource.com/636061Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Commit-Queue: Jamie Madill <jmadill@chromium.org>
parent ef661517
......@@ -4902,4 +4902,54 @@ void Context::programBinary(GLuint program, GLenum binaryFormat, const void *bin
handleError(programObject->loadBinary(this, binaryFormat, binary, length));
}
void Context::uniform1ui(GLint location, GLuint v0)
{
Program *program = mGLState.getProgram();
program->setUniform1uiv(location, 1, &v0);
}
void Context::uniform2ui(GLint location, GLuint v0, GLuint v1)
{
Program *program = mGLState.getProgram();
const GLuint xy[] = {v0, v1};
program->setUniform2uiv(location, 1, xy);
}
void Context::uniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
{
Program *program = mGLState.getProgram();
const GLuint xyz[] = {v0, v1, v2};
program->setUniform3uiv(location, 1, xyz);
}
void Context::uniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
{
Program *program = mGLState.getProgram();
const GLuint xyzw[] = {v0, v1, v2, v3};
program->setUniform4uiv(location, 1, xyzw);
}
void Context::uniform1uiv(GLint location, GLsizei count, const GLuint *value)
{
Program *program = mGLState.getProgram();
program->setUniform1uiv(location, count, value);
}
void Context::uniform2uiv(GLint location, GLsizei count, const GLuint *value)
{
Program *program = mGLState.getProgram();
program->setUniform2uiv(location, count, value);
}
void Context::uniform3uiv(GLint location, GLsizei count, const GLuint *value)
{
Program *program = mGLState.getProgram();
program->setUniform3uiv(location, count, value);
}
void Context::uniform4uiv(GLint location, GLsizei count, const GLuint *value)
{
Program *program = mGLState.getProgram();
program->setUniform4uiv(location, count, value);
}
} // namespace gl
......@@ -780,6 +780,15 @@ class Context final : public ValidationContext
void uniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
void validateProgram(GLuint program);
void uniform1ui(GLint location, GLuint v0);
void uniform2ui(GLint location, GLuint v0, GLuint v1);
void uniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2);
void uniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
void uniform1uiv(GLint location, GLsizei count, const GLuint *value);
void uniform2uiv(GLint location, GLsizei count, const GLuint *value);
void uniform3uiv(GLint location, GLsizei count, const GLuint *value);
void uniform4uiv(GLint location, GLsizei count, const GLuint *value);
void getProgramBinary(GLuint program,
GLsizei bufSize,
GLsizei *length,
......
......@@ -2415,13 +2415,6 @@ bool ValidateProgramUniformMatrix(gl::Context *context,
bool ValidateUniform(ValidationContext *context, GLenum valueType, GLint location, GLsizei count)
{
// Check for ES3 uniform entry points
if (VariableComponentType(valueType) == GL_UNSIGNED_INT && context->getClientMajorVersion() < 3)
{
context->handleError(InvalidOperation());
return false;
}
const LinkedUniform *uniform = nullptr;
gl::Program *programObject = context->getGLState().getProgram();
return ValidateUniformCommonBase(context, programObject, location, count, &uniform) &&
......
......@@ -82,7 +82,18 @@ bool ValidateFramebufferTextureMultiviewLevelAndFormat(Context *context,
return true;
}
} // namespace
bool ValidateUniformES3(Context *context, GLenum uniformType, GLint location, GLint count)
{
if (context->getClientMajorVersion() < 3)
{
ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
return false;
}
return ValidateUniform(context, uniformType, location, count);
}
} // anonymous namespace
static bool ValidateTexImageFormatCombination(gl::Context *context,
GLenum target,
......@@ -2777,4 +2788,49 @@ bool ValidateFramebufferTextureMultiviewSideBySideANGLE(Context *context,
return true;
}
bool ValidateUniform1ui(Context *context, GLint location, GLuint v0)
{
return ValidateUniformES3(context, GL_UNSIGNED_INT, location, 1);
}
bool ValidateUniform2ui(Context *context, GLint location, GLuint v0, GLuint v1)
{
return ValidateUniformES3(context, GL_UNSIGNED_INT_VEC2, location, 1);
}
bool ValidateUniform3ui(Context *context, GLint location, GLuint v0, GLuint v1, GLuint v2)
{
return ValidateUniformES3(context, GL_UNSIGNED_INT_VEC3, location, 1);
}
bool ValidateUniform4ui(Context *context,
GLint location,
GLuint v0,
GLuint v1,
GLuint v2,
GLuint v3)
{
return ValidateUniformES3(context, GL_UNSIGNED_INT_VEC4, location, 1);
}
bool ValidateUniform1uiv(Context *context, GLint location, GLsizei count, const GLuint *value)
{
return ValidateUniformES3(context, GL_UNSIGNED_INT, location, count);
}
bool ValidateUniform2uiv(Context *context, GLint location, GLsizei count, const GLuint *value)
{
return ValidateUniformES3(context, GL_UNSIGNED_INT_VEC2, location, count);
}
bool ValidateUniform3uiv(Context *context, GLint location, GLsizei count, const GLuint *value)
{
return ValidateUniformES3(context, GL_UNSIGNED_INT_VEC3, location, count);
}
bool ValidateUniform4uiv(Context *context, GLint location, GLsizei count, const GLuint *value)
{
return ValidateUniformES3(context, GL_UNSIGNED_INT_VEC4, location, count);
}
} // namespace gl
......@@ -443,6 +443,21 @@ bool ValidateFramebufferTextureMultiviewSideBySideANGLE(Context *context,
GLsizei numViews,
const GLint *viewportOffsets);
bool ValidateUniform1ui(Context *context, GLint location, GLuint v0);
bool ValidateUniform2ui(Context *context, GLint location, GLuint v0, GLuint v1);
bool ValidateUniform3ui(Context *context, GLint location, GLuint v0, GLuint v1, GLuint v2);
bool ValidateUniform4ui(Context *context,
GLint location,
GLuint v0,
GLuint v1,
GLuint v2,
GLuint v3);
bool ValidateUniform1uiv(Context *context, GLint location, GLsizei count, const GLuint *value);
bool ValidateUniform2uiv(Context *context, GLint location, GLsizei count, const GLuint *value);
bool ValidateUniform3uiv(Context *context, GLint location, GLsizei count, const GLuint *value);
bool ValidateUniform4uiv(Context *context, GLint location, GLsizei count, const GLuint *value);
} // namespace gl
#endif // LIBANGLE_VALIDATION_ES3_H_
......@@ -1151,25 +1151,68 @@ GLint GL_APIENTRY GetFragDataLocation(GLuint program, const GLchar *name)
void GL_APIENTRY Uniform1ui(GLint location, GLuint v0)
{
Uniform1uiv(location, 1, &v0);
EVENT("(GLint location = %d, GLuint v0 = %u)", location, v0);
Context *context = GetValidGlobalContext();
if (context)
{
if (!context->skipValidation() && !ValidateUniform1ui(context, location, v0))
{
return;
}
context->uniform1ui(location, v0);
}
}
void GL_APIENTRY Uniform2ui(GLint location, GLuint v0, GLuint v1)
{
const GLuint xy[] = {v0, v1};
Uniform2uiv(location, 1, xy);
EVENT("(GLint location = %d, GLuint v0 = %u, GLuint v1 = %u)", location, v0, v1);
Context *context = GetValidGlobalContext();
if (context)
{
if (!context->skipValidation() && !ValidateUniform2ui(context, location, v0, v1))
{
return;
}
context->uniform2ui(location, v0, v1);
}
}
void GL_APIENTRY Uniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
{
const GLuint xyz[] = {v0, v1, v2};
Uniform3uiv(location, 1, xyz);
EVENT("(GLint location = %d, GLuint v0 = %u, GLuint v1 = %u, GLuint v2 = %u)", location, v0, v1,
v2);
Context *context = GetValidGlobalContext();
if (context)
{
if (!context->skipValidation() && !ValidateUniform3ui(context, location, v0, v1, v2))
{
return;
}
context->uniform3ui(location, v0, v1, v2);
}
}
void GL_APIENTRY Uniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
{
const GLuint xyzw[] = {v0, v1, v2, v3};
Uniform4uiv(location, 1, xyzw);
EVENT("(GLint location = %d, GLuint v0 = %u, GLuint v1 = %u, GLuint v2 = %u, GLuint v3 = %u)",
location, v0, v1, v2, v3);
Context *context = GetValidGlobalContext();
if (context)
{
if (!context->skipValidation() && !ValidateUniform4ui(context, location, v0, v1, v2, v3))
{
return;
}
context->uniform4ui(location, v0, v1, v2, v3);
}
}
void GL_APIENTRY Uniform1uiv(GLint location, GLsizei count, const GLuint *value)
......@@ -1180,13 +1223,12 @@ void GL_APIENTRY Uniform1uiv(GLint location, GLsizei count, const GLuint *value)
Context *context = GetValidGlobalContext();
if (context)
{
if (!ValidateUniform(context, GL_UNSIGNED_INT, location, count))
if (!context->skipValidation() && !ValidateUniform1uiv(context, location, count, value))
{
return;
}
Program *program = context->getGLState().getProgram();
program->setUniform1uiv(location, count, value);
context->uniform1uiv(location, count, value);
}
}
......@@ -1198,13 +1240,12 @@ void GL_APIENTRY Uniform2uiv(GLint location, GLsizei count, const GLuint *value)
Context *context = GetValidGlobalContext();
if (context)
{
if (!ValidateUniform(context, GL_UNSIGNED_INT_VEC2, location, count))
if (!context->skipValidation() && !ValidateUniform2uiv(context, location, count, value))
{
return;
}
Program *program = context->getGLState().getProgram();
program->setUniform2uiv(location, count, value);
context->uniform2uiv(location, count, value);
}
}
......@@ -1215,13 +1256,12 @@ void GL_APIENTRY Uniform3uiv(GLint location, GLsizei count, const GLuint *value)
Context *context = GetValidGlobalContext();
if (context)
{
if (!ValidateUniform(context, GL_UNSIGNED_INT_VEC3, location, count))
if (!context->skipValidation() && !ValidateUniform3uiv(context, location, count, value))
{
return;
}
Program *program = context->getGLState().getProgram();
program->setUniform3uiv(location, count, value);
context->uniform3uiv(location, count, value);
}
}
......@@ -1233,13 +1273,12 @@ void GL_APIENTRY Uniform4uiv(GLint location, GLsizei count, const GLuint *value)
Context *context = GetValidGlobalContext();
if (context)
{
if (!ValidateUniform(context, GL_UNSIGNED_INT_VEC4, location, count))
if (!context->skipValidation() && !ValidateUniform4uiv(context, location, count, value))
{
return;
}
Program *program = context->getGLState().getProgram();
program->setUniform4uiv(location, count, value);
context->uniform4uiv(location, count, value);
}
}
......
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