Commit 12e957f8 by Jamie Madill Committed by Commit Bot

Refactor uniform block and other query EPs.

Also some minor fixes to validation and error messages. BUG=angleproject:747 Change-Id: I4f97a45c2d39a8deec2255620e5cc2bcb8cad7b9 Reviewed-on: https://chromium-review.googlesource.com/637126Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Commit-Queue: Jamie Madill <jmadill@chromium.org>
parent f0dcb8b5
......@@ -5094,4 +5094,85 @@ void Context::resumeTransformFeedback()
transformFeedback->resume();
}
void Context::getUniformuiv(GLuint program, GLint location, GLuint *params)
{
const Program *programObject = getProgram(program);
programObject->getUniformuiv(location, params);
}
GLint Context::getFragDataLocation(GLuint program, const GLchar *name)
{
const Program *programObject = getProgram(program);
return programObject->getFragDataLocation(name);
}
void Context::getUniformIndices(GLuint program,
GLsizei uniformCount,
const GLchar *const *uniformNames,
GLuint *uniformIndices)
{
const Program *programObject = getProgram(program);
if (!programObject->isLinked())
{
for (int uniformId = 0; uniformId < uniformCount; uniformId++)
{
uniformIndices[uniformId] = GL_INVALID_INDEX;
}
}
else
{
for (int uniformId = 0; uniformId < uniformCount; uniformId++)
{
uniformIndices[uniformId] = programObject->getUniformIndex(uniformNames[uniformId]);
}
}
}
void Context::getActiveUniformsiv(GLuint program,
GLsizei uniformCount,
const GLuint *uniformIndices,
GLenum pname,
GLint *params)
{
const Program *programObject = getProgram(program);
for (int uniformId = 0; uniformId < uniformCount; uniformId++)
{
const GLuint index = uniformIndices[uniformId];
params[uniformId] = programObject->getActiveUniformi(index, pname);
}
}
GLuint Context::getUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
{
const Program *programObject = getProgram(program);
return programObject->getUniformBlockIndex(uniformBlockName);
}
void Context::getActiveUniformBlockiv(GLuint program,
GLuint uniformBlockIndex,
GLenum pname,
GLint *params)
{
const Program *programObject = getProgram(program);
QueryActiveUniformBlockiv(programObject, uniformBlockIndex, pname, params);
}
void Context::getActiveUniformBlockName(GLuint program,
GLuint uniformBlockIndex,
GLsizei bufSize,
GLsizei *length,
GLchar *uniformBlockName)
{
const Program *programObject = getProgram(program);
programObject->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
}
void Context::uniformBlockBinding(GLuint program,
GLuint uniformBlockIndex,
GLuint uniformBlockBinding)
{
Program *programObject = getProgram(program);
programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
}
} // namespace gl
......@@ -838,6 +838,29 @@ class Context final : public ValidationContext
void *binary);
void programBinary(GLuint program, GLenum binaryFormat, const void *binary, GLsizei length);
void getUniformuiv(GLuint program, GLint location, GLuint *params);
GLint getFragDataLocation(GLuint program, const GLchar *name);
void getUniformIndices(GLuint program,
GLsizei uniformCount,
const GLchar *const *uniformNames,
GLuint *uniformIndices);
void getActiveUniformsiv(GLuint program,
GLsizei uniformCount,
const GLuint *uniformIndices,
GLenum pname,
GLint *params);
GLuint getUniformBlockIndex(GLuint program, const GLchar *uniformBlockName);
void getActiveUniformBlockiv(GLuint program,
GLuint uniformBlockIndex,
GLenum pname,
GLint *params);
void getActiveUniformBlockName(GLuint program,
GLuint uniformBlockIndex,
GLsizei bufSize,
GLsizei *length,
GLchar *uniformBlockName);
void uniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
// Returns the error.
Error handleError(const Error &error) override;
......
......@@ -530,69 +530,6 @@ bool ValidateGetSamplerParameterBase(Context *context,
return true;
}
bool ValidateGetActiveUniformBlockivBase(Context *context,
GLuint program,
GLuint uniformBlockIndex,
GLenum pname,
GLsizei *length)
{
if (length)
{
*length = 0;
}
if (context->getClientMajorVersion() < 3)
{
context->handleError(InvalidOperation() << "Context does not support OpenGL ES 3.0.");
return false;
}
Program *programObject = GetValidProgram(context, program);
if (!programObject)
{
return false;
}
if (uniformBlockIndex >= programObject->getActiveUniformBlockCount())
{
context->handleError(InvalidValue()
<< "uniformBlockIndex exceeds active uniform block count.");
return false;
}
switch (pname)
{
case GL_UNIFORM_BLOCK_BINDING:
case GL_UNIFORM_BLOCK_DATA_SIZE:
case GL_UNIFORM_BLOCK_NAME_LENGTH:
case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:
case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
break;
default:
ANGLE_VALIDATION_ERR(context, InvalidEnum(), EnumNotSupported);
return false;
}
if (length)
{
if (pname == GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES)
{
const UniformBlock &uniformBlock =
programObject->getUniformBlockByIndex(uniformBlockIndex);
*length = static_cast<GLsizei>(uniformBlock.memberIndexes.size());
}
else
{
*length = 1;
}
}
return true;
}
bool ValidateGetInternalFormativBase(Context *context,
GLenum target,
GLenum internalformat,
......@@ -3002,15 +2939,6 @@ bool ValidateDrawArraysCommon(ValidationContext *context,
return true;
}
bool ValidateDrawArraysInstanced(Context *context,
GLenum mode,
GLint first,
GLsizei count,
GLsizei primcount)
{
return ValidateDrawArraysInstancedBase(context, mode, first, count, primcount);
}
bool ValidateDrawArraysInstancedANGLE(Context *context,
GLenum mode,
GLint first,
......@@ -4824,15 +4752,6 @@ bool ValidateGetVertexAttribIuivRobustANGLE(Context *context,
return true;
}
bool ValidateGetActiveUniformBlockiv(Context *context,
GLuint program,
GLuint uniformBlockIndex,
GLenum pname,
GLint *params)
{
return ValidateGetActiveUniformBlockivBase(context, program, uniformBlockIndex, pname, nullptr);
}
bool ValidateGetActiveUniformBlockivRobustANGLE(Context *context,
GLuint program,
GLuint uniformBlockIndex,
......@@ -5861,4 +5780,78 @@ bool ValidateTexParameterBase(Context *context,
template bool ValidateTexParameterBase(Context *, GLenum, GLenum, GLsizei, const GLfloat *);
template bool ValidateTexParameterBase(Context *, GLenum, GLenum, GLsizei, const GLint *);
bool ValidateVertexAttribIndex(ValidationContext *context, GLuint index)
{
if (index >= MAX_VERTEX_ATTRIBS)
{
ANGLE_VALIDATION_ERR(context, InvalidValue(), IndexExceedsMaxVertexAttribute);
return false;
}
return true;
}
bool ValidateGetActiveUniformBlockivBase(Context *context,
GLuint program,
GLuint uniformBlockIndex,
GLenum pname,
GLsizei *length)
{
if (length)
{
*length = 0;
}
if (context->getClientMajorVersion() < 3)
{
ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
return false;
}
Program *programObject = GetValidProgram(context, program);
if (!programObject)
{
return false;
}
if (uniformBlockIndex >= programObject->getActiveUniformBlockCount())
{
context->handleError(InvalidValue()
<< "uniformBlockIndex exceeds active uniform block count.");
return false;
}
switch (pname)
{
case GL_UNIFORM_BLOCK_BINDING:
case GL_UNIFORM_BLOCK_DATA_SIZE:
case GL_UNIFORM_BLOCK_NAME_LENGTH:
case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:
case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
break;
default:
ANGLE_VALIDATION_ERR(context, InvalidEnum(), EnumNotSupported);
return false;
}
if (length)
{
if (pname == GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES)
{
const UniformBlock &uniformBlock =
programObject->getUniformBlockByIndex(uniformBlockIndex);
*length = static_cast<GLsizei>(uniformBlock.memberIndexes.size());
}
else
{
*length = 1;
}
}
return true;
}
} // namespace gl
......@@ -265,11 +265,11 @@ bool ValidateDrawArraysCommon(ValidationContext *context,
GLint first,
GLsizei count,
GLsizei primcount);
bool ValidateDrawArraysInstanced(Context *context,
GLenum mode,
GLint first,
GLsizei count,
GLsizei primcount);
bool ValidateDrawArraysInstancedBase(Context *context,
GLenum mode,
GLint first,
GLsizei count,
GLsizei primcount);
bool ValidateDrawArraysInstancedANGLE(Context *context,
GLenum mode,
GLint first,
......@@ -560,11 +560,6 @@ bool ValidateGetVertexAttribIuivRobustANGLE(Context *context,
GLsizei *length,
GLuint *params);
bool ValidateGetActiveUniformBlockiv(Context *context,
GLuint program,
GLuint uniformBlockIndex,
GLenum pname,
GLint *params);
bool ValidateGetActiveUniformBlockivRobustANGLE(Context *context,
GLuint program,
GLuint uniformBlockIndex,
......@@ -603,6 +598,14 @@ bool ValidateRobustCompressedTexImageBase(ValidationContext *context,
GLsizei imageSize,
GLsizei dataSize);
bool ValidateVertexAttribIndex(ValidationContext *context, GLuint index);
bool ValidateGetActiveUniformBlockivBase(Context *context,
GLuint program,
GLuint uniformBlockIndex,
GLenum pname,
GLsizei *length);
} // namespace gl
#endif // LIBANGLE_VALIDATION_ES_H_
......@@ -5636,17 +5636,6 @@ bool ValidateValidateProgram(ValidationContext *context, GLuint program)
return true;
}
bool ValidateVertexAttribIndex(ValidationContext *context, GLuint index)
{
if (index >= MAX_VERTEX_ATTRIBS)
{
ANGLE_VALIDATION_ERR(context, InvalidValue(), IndexExceedsMaxVertexAttribute);
return false;
}
return true;
}
bool ValidateVertexAttrib1f(ValidationContext *context, GLuint index, GLfloat x)
{
return ValidateVertexAttribIndex(context, index);
......
......@@ -3110,4 +3110,267 @@ bool ValidateResumeTransformFeedback(Context *context)
return true;
}
bool ValidateVertexAttribI4i(Context *context, GLuint index, GLint x, GLint y, GLint z, GLint w)
{
if (context->getClientMajorVersion() < 3)
{
ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
return false;
}
return ValidateVertexAttribIndex(context, index);
}
bool ValidateVertexAttribI4ui(Context *context,
GLuint index,
GLuint x,
GLuint y,
GLuint z,
GLuint w)
{
if (context->getClientMajorVersion() < 3)
{
ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
return false;
}
return ValidateVertexAttribIndex(context, index);
}
bool ValidateVertexAttribI4iv(Context *context, GLuint index, const GLint *v)
{
if (context->getClientMajorVersion() < 3)
{
ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
return false;
}
return ValidateVertexAttribIndex(context, index);
}
bool ValidateVertexAttribI4uiv(Context *context, GLuint index, const GLuint *v)
{
if (context->getClientMajorVersion() < 3)
{
ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
return false;
}
return ValidateVertexAttribIndex(context, index);
}
bool ValidateGetFragDataLocation(Context *context, GLuint program, const GLchar *name)
{
if (context->getClientMajorVersion() < 3)
{
ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
return false;
}
Program *programObject = GetValidProgram(context, program);
if (!programObject)
{
return false;
}
if (!programObject->isLinked())
{
ANGLE_VALIDATION_ERR(context, InvalidOperation(), ProgramNotLinked);
return false;
}
return true;
}
bool ValidateGetUniformIndices(Context *context,
GLuint program,
GLsizei uniformCount,
const GLchar *const *uniformNames,
GLuint *uniformIndices)
{
if (context->getClientMajorVersion() < 3)
{
ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
return false;
}
if (uniformCount < 0)
{
context->handleError(InvalidValue());
return false;
}
Program *programObject = GetValidProgram(context, program);
if (!programObject)
{
return false;
}
return true;
}
bool ValidateGetActiveUniformsiv(Context *context,
GLuint program,
GLsizei uniformCount,
const GLuint *uniformIndices,
GLenum pname,
GLint *params)
{
if (context->getClientMajorVersion() < 3)
{
ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
return false;
}
if (uniformCount < 0)
{
context->handleError(InvalidValue());
return false;
}
Program *programObject = GetValidProgram(context, program);
if (!programObject)
{
return false;
}
switch (pname)
{
case GL_UNIFORM_TYPE:
case GL_UNIFORM_SIZE:
case GL_UNIFORM_NAME_LENGTH:
case GL_UNIFORM_BLOCK_INDEX:
case GL_UNIFORM_OFFSET:
case GL_UNIFORM_ARRAY_STRIDE:
case GL_UNIFORM_MATRIX_STRIDE:
case GL_UNIFORM_IS_ROW_MAJOR:
break;
default:
context->handleError(InvalidEnum());
return false;
}
if (uniformCount > programObject->getActiveUniformCount())
{
context->handleError(InvalidValue());
return false;
}
for (int uniformId = 0; uniformId < uniformCount; uniformId++)
{
const GLuint index = uniformIndices[uniformId];
if (index >= static_cast<GLuint>(programObject->getActiveUniformCount()))
{
context->handleError(InvalidValue());
return false;
}
}
return true;
}
bool ValidateGetUniformBlockIndex(Context *context, GLuint program, const GLchar *uniformBlockName)
{
if (context->getClientMajorVersion() < 3)
{
ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
return false;
}
Program *programObject = GetValidProgram(context, program);
if (!programObject)
{
return false;
}
return true;
}
bool ValidateGetActiveUniformBlockiv(Context *context,
GLuint program,
GLuint uniformBlockIndex,
GLenum pname,
GLint *params)
{
return ValidateGetActiveUniformBlockivBase(context, program, uniformBlockIndex, pname, nullptr);
}
bool ValidateGetActiveUniformBlockName(Context *context,
GLuint program,
GLuint uniformBlockIndex,
GLsizei bufSize,
GLsizei *length,
GLchar *uniformBlockName)
{
if (context->getClientMajorVersion() < 3)
{
ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
return false;
}
Program *programObject = GetValidProgram(context, program);
if (!programObject)
{
return false;
}
if (uniformBlockIndex >= programObject->getActiveUniformBlockCount())
{
context->handleError(InvalidValue());
return false;
}
return true;
}
bool ValidateUniformBlockBinding(Context *context,
GLuint program,
GLuint uniformBlockIndex,
GLuint uniformBlockBinding)
{
if (context->getClientMajorVersion() < 3)
{
ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
return false;
}
if (uniformBlockBinding >= context->getCaps().maxUniformBufferBindings)
{
context->handleError(InvalidValue());
return false;
}
Program *programObject = GetValidProgram(context, program);
if (!programObject)
{
return false;
}
// if never linked, there won't be any uniform blocks
if (uniformBlockIndex >= programObject->getActiveUniformBlockCount())
{
context->handleError(InvalidValue());
return false;
}
return true;
}
bool ValidateDrawArraysInstanced(Context *context,
GLenum mode,
GLint first,
GLsizei count,
GLsizei primcount)
{
if (context->getClientMajorVersion() < 3)
{
ANGLE_VALIDATION_ERR(context, InvalidOperation(), ES3Required);
return false;
}
return ValidateDrawArraysInstancedBase(context, mode, first, count, primcount);
}
} // namespace gl
......@@ -509,6 +509,48 @@ bool ValidateBindTransformFeedback(Context *context, GLenum target, GLuint id);
bool ValidateIsTransformFeedback(Context *context, GLuint id);
bool ValidatePauseTransformFeedback(Context *context);
bool ValidateResumeTransformFeedback(Context *context);
bool ValidateVertexAttribI4i(Context *context, GLuint index, GLint x, GLint y, GLint z, GLint w);
bool ValidateVertexAttribI4ui(Context *context,
GLuint index,
GLuint x,
GLuint y,
GLuint z,
GLuint w);
bool ValidateVertexAttribI4iv(Context *context, GLuint index, const GLint *v);
bool ValidateVertexAttribI4uiv(Context *context, GLuint index, const GLuint *v);
bool ValidateGetFragDataLocation(Context *context, GLuint program, const GLchar *name);
bool ValidateGetUniformIndices(Context *context,
GLuint program,
GLsizei uniformCount,
const GLchar *const *uniformNames,
GLuint *uniformIndices);
bool ValidateGetActiveUniformsiv(Context *context,
GLuint program,
GLsizei uniformCount,
const GLuint *uniformIndices,
GLenum pname,
GLint *params);
bool ValidateGetUniformBlockIndex(Context *context, GLuint program, const GLchar *uniformBlockName);
bool ValidateGetActiveUniformBlockiv(Context *context,
GLuint program,
GLuint uniformBlockIndex,
GLenum pname,
GLint *params);
bool ValidateGetActiveUniformBlockName(Context *context,
GLuint program,
GLuint uniformBlockIndex,
GLsizei bufSize,
GLsizei *length,
GLchar *uniformBlockName);
bool ValidateUniformBlockBinding(Context *context,
GLuint program,
GLuint uniformBlockIndex,
GLuint uniformBlockBinding);
bool ValidateDrawArraysInstanced(Context *context,
GLenum mode,
GLint first,
GLsizei count,
GLsizei primcount);
} // namespace gl
......
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