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
......
......@@ -924,15 +924,8 @@ void GL_APIENTRY VertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint
Context *context = GetValidGlobalContext();
if (context)
{
if (context->getClientMajorVersion() < 3)
if (!context->skipValidation() && !ValidateVertexAttribI4i(context, index, x, y, z, w))
{
context->handleError(InvalidOperation());
return;
}
if (index >= MAX_VERTEX_ATTRIBS)
{
context->handleError(InvalidValue());
return;
}
......@@ -948,15 +941,8 @@ void GL_APIENTRY VertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GL
Context *context = GetValidGlobalContext();
if (context)
{
if (context->getClientMajorVersion() < 3)
if (!context->skipValidation() && !ValidateVertexAttribI4ui(context, index, x, y, z, w))
{
context->handleError(InvalidOperation());
return;
}
if (index >= MAX_VERTEX_ATTRIBS)
{
context->handleError(InvalidValue());
return;
}
......@@ -971,15 +957,8 @@ void GL_APIENTRY VertexAttribI4iv(GLuint index, const GLint *v)
Context *context = GetValidGlobalContext();
if (context)
{
if (context->getClientMajorVersion() < 3)
if (!context->skipValidation() && !ValidateVertexAttribI4iv(context, index, v))
{
context->handleError(InvalidOperation());
return;
}
if (index >= MAX_VERTEX_ATTRIBS)
{
context->handleError(InvalidValue());
return;
}
......@@ -994,15 +973,8 @@ void GL_APIENTRY VertexAttribI4uiv(GLuint index, const GLuint *v)
Context *context = GetValidGlobalContext();
if (context)
{
if (context->getClientMajorVersion() < 3)
if (!context->skipValidation() && !ValidateVertexAttribI4uiv(context, index, v))
{
context->handleError(InvalidOperation());
return;
}
if (index >= MAX_VERTEX_ATTRIBS)
{
context->handleError(InvalidValue());
return;
}
......@@ -1018,15 +990,13 @@ void GL_APIENTRY GetUniformuiv(GLuint program, GLint location, GLuint *params)
Context *context = GetValidGlobalContext();
if (context)
{
if (!ValidateGetUniformuiv(context, program, location, params))
if (!context->skipValidation() &&
!ValidateGetUniformuiv(context, program, location, params))
{
return;
}
Program *programObject = context->getProgram(program);
ASSERT(programObject);
programObject->getUniformuiv(location, params);
context->getUniformuiv(program, location, params);
}
}
......@@ -1037,30 +1007,15 @@ GLint GL_APIENTRY GetFragDataLocation(GLuint program, const GLchar *name)
Context *context = GetValidGlobalContext();
if (context)
{
if (context->getClientMajorVersion() < 3)
if (!context->skipValidation() && !ValidateGetFragDataLocation(context, program, name))
{
context->handleError(InvalidOperation());
return -1;
}
if (program == 0)
{
context->handleError(InvalidValue());
return -1;
}
Program *programObject = context->getProgram(program);
if (!programObject || !programObject->isLinked())
{
context->handleError(InvalidOperation());
return -1;
}
return programObject->getFragDataLocation(name);
return context->getFragDataLocation(program, name);
}
return 0;
return -1;
}
void GL_APIENTRY Uniform1ui(GLint location, GLuint v0)
......@@ -1324,39 +1279,13 @@ void GL_APIENTRY GetUniformIndices(GLuint program,
Context *context = GetValidGlobalContext();
if (context)
{
if (context->getClientMajorVersion() < 3)
{
context->handleError(InvalidOperation());
return;
}
if (uniformCount < 0)
if (!context->skipValidation() && !ValidateGetUniformIndices(context, program, uniformCount,
uniformNames, uniformIndices))
{
context->handleError(InvalidValue());
return;
}
Program *programObject = GetValidProgram(context, program);
if (!programObject)
{
return;
}
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]);
}
}
context->getUniformIndices(program, uniformCount, uniformNames, uniformIndices);
}
}
......@@ -1374,64 +1303,14 @@ void GL_APIENTRY GetActiveUniformsiv(GLuint program,
Context *context = GetValidGlobalContext();
if (context)
{
if (context->getClientMajorVersion() < 3)
{
context->handleError(InvalidOperation());
return;
}
if (uniformCount < 0)
{
context->handleError(InvalidValue());
return;
}
Program *programObject = GetValidProgram(context, program);
if (!programObject)
{
return;
}
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;
}
if (uniformCount > programObject->getActiveUniformCount())
if (!context->skipValidation() &&
!ValidateGetActiveUniformsiv(context, program, uniformCount, uniformIndices, pname,
params))
{
context->handleError(InvalidValue());
return;
}
for (int uniformId = 0; uniformId < uniformCount; uniformId++)
{
const GLuint index = uniformIndices[uniformId];
if (index >= static_cast<GLuint>(programObject->getActiveUniformCount()))
{
context->handleError(InvalidValue());
return;
}
}
for (int uniformId = 0; uniformId < uniformCount; uniformId++)
{
const GLuint index = uniformIndices[uniformId];
params[uniformId] = programObject->getActiveUniformi(index, pname);
}
context->getActiveUniformsiv(program, uniformCount, uniformIndices, pname, params);
}
}
......@@ -1443,22 +1322,16 @@ GLuint GL_APIENTRY GetUniformBlockIndex(GLuint program, const GLchar *uniformBlo
Context *context = GetValidGlobalContext();
if (context)
{
if (context->getClientMajorVersion() < 3)
{
context->handleError(InvalidOperation());
return GL_INVALID_INDEX;
}
Program *programObject = GetValidProgram(context, program);
if (!programObject)
if (!context->skipValidation() &&
!ValidateGetUniformBlockIndex(context, program, uniformBlockName))
{
return GL_INVALID_INDEX;
}
return programObject->getUniformBlockIndex(uniformBlockName);
return context->getUniformBlockIndex(program, uniformBlockName);
}
return 0;
return GL_INVALID_INDEX;
}
void GL_APIENTRY GetActiveUniformBlockiv(GLuint program,
......@@ -1480,8 +1353,7 @@ void GL_APIENTRY GetActiveUniformBlockiv(GLuint program,
return;
}
const Program *programObject = context->getProgram(program);
QueryActiveUniformBlockiv(programObject, uniformBlockIndex, pname, params);
context->getActiveUniformBlockiv(program, uniformBlockIndex, pname, params);
}
}
......@@ -1499,27 +1371,15 @@ void GL_APIENTRY GetActiveUniformBlockName(GLuint program,
Context *context = GetValidGlobalContext();
if (context)
{
if (context->getClientMajorVersion() < 3)
{
context->handleError(InvalidOperation());
return;
}
Program *programObject = GetValidProgram(context, program);
if (!programObject)
{
return;
}
if (uniformBlockIndex >= programObject->getActiveUniformBlockCount())
if (!context->skipValidation() &&
!ValidateGetActiveUniformBlockName(context, program, uniformBlockIndex, bufSize, length,
uniformBlockName))
{
context->handleError(InvalidValue());
return;
}
programObject->getActiveUniformBlockName(uniformBlockIndex, bufSize, length,
uniformBlockName);
context->getActiveUniformBlockName(program, uniformBlockIndex, bufSize, length,
uniformBlockName);
}
}
......@@ -1533,33 +1393,13 @@ void GL_APIENTRY UniformBlockBinding(GLuint program,
Context *context = GetValidGlobalContext();
if (context)
{
if (context->getClientMajorVersion() < 3)
{
context->handleError(InvalidOperation());
return;
}
if (uniformBlockBinding >= context->getCaps().maxUniformBufferBindings)
{
context->handleError(InvalidValue());
return;
}
Program *programObject = GetValidProgram(context, program);
if (!programObject)
if (!context->skipValidation() &&
!ValidateUniformBlockBinding(context, program, uniformBlockIndex, uniformBlockBinding))
{
return;
}
// if never linked, there won't be any uniform blocks
if (uniformBlockIndex >= programObject->getActiveUniformBlockCount())
{
context->handleError(InvalidValue());
return;
}
programObject->bindUniformBlock(uniformBlockIndex, uniformBlockBinding);
context->uniformBlockBinding(program, uniformBlockIndex, uniformBlockBinding);
}
}
......@@ -1571,13 +1411,8 @@ void GL_APIENTRY DrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GL
Context *context = GetValidGlobalContext();
if (context)
{
if (context->getClientMajorVersion() < 3)
{
context->handleError(InvalidOperation());
return;
}
if (!ValidateDrawArraysInstanced(context, mode, first, count, instanceCount))
if (!context->skipValidation() &&
!ValidateDrawArraysInstanced(context, mode, first, count, instanceCount))
{
return;
}
......
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