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 ...@@ -2674,13 +2674,28 @@ bool ValidateGetUniformiv(Context *context, GLuint program, GLint location, GLin
return ValidateGetUniformBase(context, program, location); 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)) if (!ValidateGetUniformBase(context, program, location))
{ {
return false; return false;
} }
if (bufSize < 0)
{
context->handleError(Error(GL_INVALID_VALUE, "bufSize cannot be negative."));
return false;
}
gl::Program *programObject = context->getProgram(program); gl::Program *programObject = context->getProgram(program);
ASSERT(programObject); ASSERT(programObject);
...@@ -2689,21 +2704,83 @@ static bool ValidateSizedGetUniform(Context *context, GLuint program, GLint loca ...@@ -2689,21 +2704,83 @@ static bool ValidateSizedGetUniform(Context *context, GLuint program, GLint loca
size_t requiredBytes = VariableExternalSize(uniform.type); size_t requiredBytes = VariableExternalSize(uniform.type);
if (static_cast<size_t>(bufSize) < requiredBytes) 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; return false;
} }
if (length)
{
// Cast is safe because of comparison to bufSize.
*length = static_cast<GLsizei>(requiredBytes);
}
return true; return true;
} }
bool ValidateGetnUniformfvEXT(Context *context, GLuint program, GLint location, GLsizei bufSize, GLfloat* params) 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) 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, bool ValidateDiscardFramebufferBase(Context *context, GLenum target, GLsizei numAttachments,
......
...@@ -228,6 +228,24 @@ bool ValidateGetUniformfv(Context *context, GLuint program, GLint location, GLfl ...@@ -228,6 +228,24 @@ bool ValidateGetUniformfv(Context *context, GLuint program, GLint location, GLfl
bool ValidateGetUniformiv(Context *context, GLuint program, GLint location, GLint* params); bool ValidateGetUniformiv(Context *context, GLuint program, GLint location, GLint* params);
bool ValidateGetnUniformfvEXT(Context *context, GLuint program, GLint location, GLsizei bufSize, GLfloat* 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 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, bool ValidateDiscardFramebufferBase(Context *context, GLenum target, GLsizei numAttachments,
const GLenum *attachments, bool defaultFramebuffer); const GLenum *attachments, bool defaultFramebuffer);
......
...@@ -2248,7 +2248,23 @@ ANGLE_EXPORT void GL_APIENTRY GetUniformfvRobustANGLE(GLuint program, ...@@ -2248,7 +2248,23 @@ ANGLE_EXPORT void GL_APIENTRY GetUniformfvRobustANGLE(GLuint program,
"(GLuint program = %d, GLint location = %d, GLsizei bufsize = %d, GLsizei* length = " "(GLuint program = %d, GLint location = %d, GLsizei bufsize = %d, GLsizei* length = "
"0x%0.8p, GLfloat* params = 0x%0.8p)", "0x%0.8p, GLfloat* params = 0x%0.8p)",
program, location, bufSize, length, params); 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, ANGLE_EXPORT void GL_APIENTRY GetUniformivRobustANGLE(GLuint program,
...@@ -2261,7 +2277,23 @@ 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 = " "(GLuint program = %d, GLint location = %d, GLsizei bufsize = %d, GLsizei* length = "
"0x%0.8p, GLint* params = 0x%0.8p)", "0x%0.8p, GLint* params = 0x%0.8p)",
program, location, bufSize, length, params); 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, ANGLE_EXPORT void GL_APIENTRY GetVertexAttribfvRobustANGLE(GLuint index,
...@@ -2525,7 +2557,23 @@ ANGLE_EXPORT void GL_APIENTRY GetUniformuivRobustANGLE(GLuint program, ...@@ -2525,7 +2557,23 @@ ANGLE_EXPORT void GL_APIENTRY GetUniformuivRobustANGLE(GLuint program,
"(GLuint program = %u, GLint location = %d, GLsizei bufsize = %d, GLsizei* length = " "(GLuint program = %u, GLint location = %d, GLsizei bufsize = %d, GLsizei* length = "
"0x%0.8p, GLuint* params = 0x%0.8p)", "0x%0.8p, GLuint* params = 0x%0.8p)",
program, location, bufSize, length, params); 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, 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