Commit ee9f08c0 by Jiajia Qin Committed by Commit Bot

Implement ES3.1 glProgramUniform* entry points

BUG=angleproject:1589 TEST=dEQP-GLES31.functional.program_uniform.* Change-Id: I27fffa755fd277ed918746259cac88ab9e349c41 Reviewed-on: https://chromium-review.googlesource.com/412193 Commit-Queue: Geoff Lang <geofflang@chromium.org> Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Reviewed-by: 's avatarCorentin Wallez <cwallez@chromium.org>
parent 51f75c5d
...@@ -2560,19 +2560,20 @@ bool ValidateGetQueryObjectui64vRobustANGLE(Context *context, ...@@ -2560,19 +2560,20 @@ bool ValidateGetQueryObjectui64vRobustANGLE(Context *context,
} }
static bool ValidateUniformCommonBase(gl::Context *context, static bool ValidateUniformCommonBase(gl::Context *context,
gl::Program *program,
GLenum targetUniformType, GLenum targetUniformType,
GLint location, GLint location,
GLsizei count, GLsizei count,
const LinkedUniform **uniformOut) const LinkedUniform **uniformOut)
{ {
// TODO(Jiajia): Add image uniform check in future.
if (count < 0) if (count < 0)
{ {
context->handleError(Error(GL_INVALID_VALUE)); context->handleError(Error(GL_INVALID_VALUE));
return false; return false;
} }
gl::Program *program = context->getGLState().getProgram(); if (!program || !program->isLinked())
if (!program)
{ {
context->handleError(Error(GL_INVALID_OPERATION)); context->handleError(Error(GL_INVALID_OPERATION));
return false; return false;
...@@ -2603,6 +2604,67 @@ static bool ValidateUniformCommonBase(gl::Context *context, ...@@ -2603,6 +2604,67 @@ static bool ValidateUniformCommonBase(gl::Context *context,
return true; return true;
} }
bool ValidateProgramUniform(gl::Context *context,
GLenum uniformType,
GLuint program,
GLint location,
GLsizei count)
{
// Check for ES31 program uniform entry points
if (context->getClientVersion() < Version(3, 1))
{
context->handleError(Error(GL_INVALID_OPERATION));
return false;
}
const LinkedUniform *uniform = nullptr;
gl::Program *programObject = GetValidProgram(context, program);
if (!ValidateUniformCommonBase(context, programObject, uniformType, location, count, &uniform))
{
return false;
}
GLenum targetBoolType = VariableBoolVectorType(uniformType);
bool samplerUniformCheck = (IsSamplerType(uniform->type) && uniformType == GL_INT);
if (!samplerUniformCheck && uniformType != uniform->type && targetBoolType != uniform->type)
{
context->handleError(Error(GL_INVALID_OPERATION));
return false;
}
return true;
}
bool ValidateProgramUniformMatrix(gl::Context *context,
GLenum matrixType,
GLuint program,
GLint location,
GLsizei count,
GLboolean transpose)
{
// Check for ES31 program uniform entry points
if (context->getClientVersion() < Version(3, 1))
{
context->handleError(Error(GL_INVALID_OPERATION));
return false;
}
const LinkedUniform *uniform = nullptr;
gl::Program *programObject = GetValidProgram(context, program);
if (!ValidateUniformCommonBase(context, programObject, matrixType, location, count, &uniform))
{
return false;
}
if (uniform->type != matrixType)
{
context->handleError(Error(GL_INVALID_OPERATION));
return false;
}
return true;
}
bool ValidateUniform(gl::Context *context, GLenum uniformType, GLint location, GLsizei count) bool ValidateUniform(gl::Context *context, GLenum uniformType, GLint location, GLsizei count)
{ {
// Check for ES3 uniform entry points // Check for ES3 uniform entry points
...@@ -2614,7 +2676,8 @@ bool ValidateUniform(gl::Context *context, GLenum uniformType, GLint location, G ...@@ -2614,7 +2676,8 @@ bool ValidateUniform(gl::Context *context, GLenum uniformType, GLint location, G
} }
const LinkedUniform *uniform = nullptr; const LinkedUniform *uniform = nullptr;
if (!ValidateUniformCommonBase(context, uniformType, location, count, &uniform)) gl::Program *program = context->getGLState().getProgram();
if (!ValidateUniformCommonBase(context, program, uniformType, location, count, &uniform))
{ {
return false; return false;
} }
...@@ -2649,7 +2712,8 @@ bool ValidateUniformMatrix(gl::Context *context, GLenum matrixType, GLint locati ...@@ -2649,7 +2712,8 @@ bool ValidateUniformMatrix(gl::Context *context, GLenum matrixType, GLint locati
} }
const LinkedUniform *uniform = nullptr; const LinkedUniform *uniform = nullptr;
if (!ValidateUniformCommonBase(context, matrixType, location, count, &uniform)) gl::Program *program = context->getGLState().getProgram();
if (!ValidateUniformCommonBase(context, program, matrixType, location, count, &uniform))
{ {
return false; return false;
} }
......
...@@ -179,6 +179,18 @@ bool ValidateGetQueryObjectui64vRobustANGLE(Context *context, ...@@ -179,6 +179,18 @@ bool ValidateGetQueryObjectui64vRobustANGLE(Context *context,
GLsizei *length, GLsizei *length,
GLuint64 *params); GLuint64 *params);
bool ValidateProgramUniform(Context *context,
GLenum uniformType,
GLuint program,
GLint location,
GLsizei count);
bool ValidateProgramUniformMatrix(Context *context,
GLenum matrixType,
GLuint program,
GLint location,
GLsizei count,
GLboolean transpose);
bool ValidateUniform(Context *context, GLenum uniformType, GLint location, GLsizei count); bool ValidateUniform(Context *context, GLenum uniformType, GLint location, GLsizei count);
bool ValidateUniformMatrix(Context *context, GLenum matrixType, GLint location, GLsizei count, bool ValidateUniformMatrix(Context *context, GLenum matrixType, GLint location, GLsizei count,
GLboolean transpose); GLboolean transpose);
......
This source diff could not be displayed because it is too large. You can view the blob instead.
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