Commit f41d0ee1 by Geoff Lang Committed by Commit Bot

Implement robust GetUniform entry points.

BUG=angleproject:1354 Change-Id: I07dccc470c57aadd41cae8fce327e4aca58a0bea Reviewed-on: https://chromium-review.googlesource.com/395113Reviewed-by: 's avatarCorentin Wallez <cwallez@chromium.org> Commit-Queue: Geoff Lang <geofflang@chromium.org>
parent 4310354e
......@@ -2674,13 +2674,28 @@ bool ValidateGetUniformiv(Context *context, GLuint program, GLint location, GLin
return ValidateGetUniformBase(context, program, location);
}
static bool ValidateSizedGetUniform(Context *context, GLuint program, GLint location, GLsizei bufSize)
static bool ValidateSizedGetUniform(Context *context,
GLuint program,
GLint location,
GLsizei bufSize,
GLsizei *length)
{
if (length)
{
*length = 0;
}
if (!ValidateGetUniformBase(context, program, location))
{
return false;
}
if (bufSize < 0)
{
context->handleError(Error(GL_INVALID_VALUE, "bufSize cannot be negative."));
return false;
}
gl::Program *programObject = context->getProgram(program);
ASSERT(programObject);
......@@ -2689,21 +2704,83 @@ static bool ValidateSizedGetUniform(Context *context, GLuint program, GLint loca
size_t requiredBytes = VariableExternalSize(uniform.type);
if (static_cast<size_t>(bufSize) < requiredBytes)
{
context->handleError(Error(GL_INVALID_OPERATION));
context->handleError(
Error(GL_INVALID_OPERATION, "bufSize of at least %u is required.", requiredBytes));
return false;
}
if (length)
{
// Cast is safe because of comparison to bufSize.
*length = static_cast<GLsizei>(requiredBytes);
}
return true;
}
bool ValidateGetnUniformfvEXT(Context *context, GLuint program, GLint location, GLsizei bufSize, GLfloat* params)
{
return ValidateSizedGetUniform(context, program, location, bufSize);
return ValidateSizedGetUniform(context, program, location, bufSize, nullptr);
}
bool ValidateGetnUniformivEXT(Context *context, GLuint program, GLint location, GLsizei bufSize, GLint* params)
{
return ValidateSizedGetUniform(context, program, location, bufSize);
return ValidateSizedGetUniform(context, program, location, bufSize, nullptr);
}
bool ValidateGetUniformfvRobustANGLE(Context *context,
GLuint program,
GLint location,
GLsizei bufSize,
GLsizei *length,
GLfloat *params)
{
if (!ValidateRobustEntryPoint(context, bufSize))
{
return false;
}
// bufSize is validated in ValidateSizedGetUniform
return ValidateSizedGetUniform(context, program, location, bufSize, length);
}
bool ValidateGetUniformivRobustANGLE(Context *context,
GLuint program,
GLint location,
GLsizei bufSize,
GLsizei *length,
GLint *params)
{
if (!ValidateRobustEntryPoint(context, bufSize))
{
return false;
}
// bufSize is validated in ValidateSizedGetUniform
return ValidateSizedGetUniform(context, program, location, bufSize, length);
}
bool ValidateGetUniformuivRobustANGLE(Context *context,
GLuint program,
GLint location,
GLsizei bufSize,
GLsizei *length,
GLuint *params)
{
if (!ValidateRobustEntryPoint(context, bufSize))
{
return false;
}
if (context->getClientMajorVersion() < 3)
{
context->handleError(
Error(GL_INVALID_OPERATION, "Entry point requires at least OpenGL ES 3.0."));
return false;
}
// bufSize is validated in ValidateSizedGetUniform
return ValidateSizedGetUniform(context, program, location, bufSize, length);
}
bool ValidateDiscardFramebufferBase(Context *context, GLenum target, GLsizei numAttachments,
......
......@@ -228,6 +228,24 @@ bool ValidateGetUniformfv(Context *context, GLuint program, GLint location, GLfl
bool ValidateGetUniformiv(Context *context, GLuint program, GLint location, GLint* params);
bool ValidateGetnUniformfvEXT(Context *context, GLuint program, GLint location, GLsizei bufSize, GLfloat* params);
bool ValidateGetnUniformivEXT(Context *context, GLuint program, GLint location, GLsizei bufSize, GLint* params);
bool ValidateGetUniformfvRobustANGLE(Context *context,
GLuint program,
GLint location,
GLsizei bufSize,
GLsizei *length,
GLfloat *params);
bool ValidateGetUniformivRobustANGLE(Context *context,
GLuint program,
GLint location,
GLsizei bufSize,
GLsizei *length,
GLint *params);
bool ValidateGetUniformuivRobustANGLE(Context *context,
GLuint program,
GLint location,
GLsizei bufSize,
GLsizei *length,
GLuint *params);
bool ValidateDiscardFramebufferBase(Context *context, GLenum target, GLsizei numAttachments,
const GLenum *attachments, bool defaultFramebuffer);
......
......@@ -2248,7 +2248,23 @@ ANGLE_EXPORT void GL_APIENTRY GetUniformfvRobustANGLE(GLuint program,
"(GLuint program = %d, GLint location = %d, GLsizei bufsize = %d, GLsizei* length = "
"0x%0.8p, GLfloat* params = 0x%0.8p)",
program, location, bufSize, length, params);
UNIMPLEMENTED();
Context *context = GetValidGlobalContext();
if (context)
{
GLsizei writeLength = 0;
if (!ValidateGetUniformfvRobustANGLE(context, program, location, bufSize, &writeLength,
params))
{
return;
}
Program *programObject = context->getProgram(program);
ASSERT(programObject);
programObject->getUniformfv(location, params);
SetRobustLengthParam(length, writeLength);
}
}
ANGLE_EXPORT void GL_APIENTRY GetUniformivRobustANGLE(GLuint program,
......@@ -2261,7 +2277,23 @@ ANGLE_EXPORT void GL_APIENTRY GetUniformivRobustANGLE(GLuint program,
"(GLuint program = %d, GLint location = %d, GLsizei bufsize = %d, GLsizei* length = "
"0x%0.8p, GLint* params = 0x%0.8p)",
program, location, bufSize, length, params);
UNIMPLEMENTED();
Context *context = GetValidGlobalContext();
if (context)
{
GLsizei writeLength = 0;
if (!ValidateGetUniformivRobustANGLE(context, program, location, bufSize, &writeLength,
params))
{
return;
}
Program *programObject = context->getProgram(program);
ASSERT(programObject);
programObject->getUniformiv(location, params);
SetRobustLengthParam(length, writeLength);
}
}
ANGLE_EXPORT void GL_APIENTRY GetVertexAttribfvRobustANGLE(GLuint index,
......@@ -2525,7 +2557,23 @@ ANGLE_EXPORT void GL_APIENTRY GetUniformuivRobustANGLE(GLuint program,
"(GLuint program = %u, GLint location = %d, GLsizei bufsize = %d, GLsizei* length = "
"0x%0.8p, GLuint* params = 0x%0.8p)",
program, location, bufSize, length, params);
UNIMPLEMENTED();
Context *context = GetValidGlobalContext();
if (context)
{
GLsizei writeLength = 0;
if (!ValidateGetUniformuivRobustANGLE(context, program, location, bufSize, &writeLength,
params))
{
return;
}
Program *programObject = context->getProgram(program);
ASSERT(programObject);
programObject->getUniformuiv(location, params);
SetRobustLengthParam(length, writeLength);
}
}
ANGLE_EXPORT void GL_APIENTRY GetActiveUniformBlockivRobustANGLE(GLuint program,
......
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