Commit e93dabaa by Geoff Lang Committed by Commit Bot

Output the number of columns and rows written for robust ReadPixels.

BUG=angleproject:1354 Change-Id: Ib78f74d7b1a449468e2c477955f6795dc5dbc811 Reviewed-on: https://chromium-review.googlesource.com/463786Reviewed-by: 's avatarCorentin Wallez <cwallez@chromium.org> Commit-Queue: Geoff Lang <geofflang@chromium.org>
parent 6b2ea3fe
...@@ -20,7 +20,7 @@ Status ...@@ -20,7 +20,7 @@ Status
Version Version
Version 3, October 7, 2016 Version 4, March 30, 2017
Number Number
...@@ -65,7 +65,7 @@ New Procedures and Functions ...@@ -65,7 +65,7 @@ New Procedures and Functions
void GetVertexAttribfvRobustANGLE(uint index, enum pname, sizei bufSize, sizei *length, float *params) void GetVertexAttribfvRobustANGLE(uint index, enum pname, sizei bufSize, sizei *length, float *params)
void GetVertexAttribivRobustANGLE(uint index, enum pname, sizei bufSize, sizei *length, int *params) void GetVertexAttribivRobustANGLE(uint index, enum pname, sizei bufSize, sizei *length, int *params)
void GetVertexAttribPointervRobustANGLE(uint index, enum pname, sizei bufSize, sizei *length, void **pointer) void GetVertexAttribPointervRobustANGLE(uint index, enum pname, sizei bufSize, sizei *length, void **pointer)
void ReadPixelsRobustANGLE(int x, int y, sizei width, sizei height, enum format, enum type, sizei bufSize, sizei *length, void *pixels) void ReadPixelsRobustANGLE(int x, int y, sizei width, sizei height, enum format, enum type, sizei bufSize, sizei *length, sizei *columns, sizei *rows, void *pixels)
void TexImage2DRobustANGLE(enum target, int level, int internalformat, sizei width, sizei height, int border, enum format, enum type, sizei bufSize, const void *pixels) void TexImage2DRobustANGLE(enum target, int level, int internalformat, sizei width, sizei height, int border, enum format, enum type, sizei bufSize, const void *pixels)
void TexParameterfvRobustANGLE(enum target, enum pname, sizei bufSize, const GLfloat *params) void TexParameterfvRobustANGLE(enum target, enum pname, sizei bufSize, const GLfloat *params)
void TexParameterivRobustANGLE(enum target, enum pname, sizei bufSize, const GLint *params) void TexParameterivRobustANGLE(enum target, enum pname, sizei bufSize, const GLint *params)
...@@ -98,7 +98,7 @@ New Procedures and Functions ...@@ -98,7 +98,7 @@ New Procedures and Functions
void GetTexLevelParameterfvRobustANGLE(enum target, int level, enum pname, sizei bufSize, sizei *length, float *params) void GetTexLevelParameterfvRobustANGLE(enum target, int level, enum pname, sizei bufSize, sizei *length, float *params)
void GetPointervRobustANGLERobustANGLE(enum pname, sizei bufSize, sizei *length, void **params) void GetPointervRobustANGLERobustANGLE(enum pname, sizei bufSize, sizei *length, void **params)
void ReadnPixelsRobustANGLE(int x, int y, sizei width, sizei height, enum format, enum type, sizei bufSize, sizei *length, void *data) void ReadnPixelsRobustANGLE(int x, int y, sizei width, sizei height, enum format, enum type, sizei bufSize, sizei *length, sizei *columns, sizei *rows, void *data)
void GetnUniformfvRobustANGLE(uint program, int location, sizei bufSize, sizei *length, float *params) void GetnUniformfvRobustANGLE(uint program, int location, sizei bufSize, sizei *length, float *params)
void GetnUniformivRobustANGLE(uint program, int location, sizei bufSize, sizei *length, int *params) void GetnUniformivRobustANGLE(uint program, int location, sizei bufSize, sizei *length, int *params)
void GetnUniformuivRobustANGLE(uint program, int location, sizei bufSize, sizei *length, uint *params) void GetnUniformuivRobustANGLE(uint program, int location, sizei bufSize, sizei *length, uint *params)
...@@ -128,6 +128,12 @@ Additions to the OpenGL ES Specification: ...@@ -128,6 +128,12 @@ Additions to the OpenGL ES Specification:
recieve the number of values written to the buffer. When an error is recieve the number of values written to the buffer. When an error is
generated nothing will be written to <length>. generated nothing will be written to <length>.
The <columns> and <rows> parameters of ReadPixelsRobustANGLE and
ReadnPixelsRobustANGLE specify addresses of variables to recieve the number
of columns and rows of pixels written to the buffer which may be less than
the <width> and <height> parameters if they would have read outside of the
framebuffer.
Calls to "xRobustANGLE" will generate errors under the same conditions as Calls to "xRobustANGLE" will generate errors under the same conditions as
"x". Any instances of undefined behaviour in "x" will also be undefined in "x". Any instances of undefined behaviour in "x" will also be undefined in
"xRobustANGLE". For example, it is invalid to call "xRobustANGLE". For example, it is invalid to call
...@@ -167,3 +173,4 @@ Revision History ...@@ -167,3 +173,4 @@ Revision History
2 Sept 28, 2016 geofflang Changed name from ANGLE_robust_queries to 2 Sept 28, 2016 geofflang Changed name from ANGLE_robust_queries to
ANGLE_robust_client_memory, added issue 3. ANGLE_robust_client_memory, added issue 3.
3 Oct 7, 2016 geofflang Added and resolved issue 4. 3 Oct 7, 2016 geofflang Added and resolved issue 4.
4 Mar 30, 2017 geofflang Added columns and rows to ReadPixels.
...@@ -3622,7 +3622,7 @@ typedef void (GL_APIENTRYP PFNGLGETUNIFORMIVROBUSTANGLE) (GLuint program, GLint ...@@ -3622,7 +3622,7 @@ typedef void (GL_APIENTRYP PFNGLGETUNIFORMIVROBUSTANGLE) (GLuint program, GLint
typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBFVROBUSTANGLE) (GLuint index, GLenum pname, GLsizei bufSize, GLsizei *length, GLfloat *params); typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBFVROBUSTANGLE) (GLuint index, GLenum pname, GLsizei bufSize, GLsizei *length, GLfloat *params);
typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBIVROBUSTANGLE) (GLuint index, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *params); typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBIVROBUSTANGLE) (GLuint index, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *params);
typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVROBUSTANGLE) (GLuint index, GLenum pname, GLsizei bufSize, GLsizei *length, void **pointer); typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVROBUSTANGLE) (GLuint index, GLenum pname, GLsizei bufSize, GLsizei *length, void **pointer);
typedef void (GL_APIENTRYP PFNGLREADPIXELSROBUSTANGLE) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, GLsizei *length, void *pixels); typedef void (GL_APIENTRYP PFNGLREADPIXELSROBUSTANGLE) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, GLsizei *length, GLsizei *columns, GLsizei *rows, void *pixels);
typedef void (GL_APIENTRYP PFNGLTEXIMAGE2DROBUSTANGLE) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, GLsizei bufSize, const void *pixels); typedef void (GL_APIENTRYP PFNGLTEXIMAGE2DROBUSTANGLE) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, GLsizei bufSize, const void *pixels);
typedef void (GL_APIENTRYP PFNGLTEXPARAMETERFVROBUSTANGLE) (GLenum target, GLenum pname, GLsizei bufSize, const GLfloat *params); typedef void (GL_APIENTRYP PFNGLTEXPARAMETERFVROBUSTANGLE) (GLenum target, GLenum pname, GLsizei bufSize, const GLfloat *params);
typedef void (GL_APIENTRYP PFNGLTEXPARAMETERIVROBUSTANGLE) (GLenum target, GLenum pname, GLsizei bufSize, const GLint *params); typedef void (GL_APIENTRYP PFNGLTEXPARAMETERIVROBUSTANGLE) (GLenum target, GLenum pname, GLsizei bufSize, const GLint *params);
...@@ -3652,7 +3652,7 @@ typedef void (GL_APIENTRYP PFNGLGETMULTISAMPLEFVROBUSTANGLE) (GLenum pname, GLui ...@@ -3652,7 +3652,7 @@ typedef void (GL_APIENTRYP PFNGLGETMULTISAMPLEFVROBUSTANGLE) (GLenum pname, GLui
typedef void (GL_APIENTRYP PFNGLGETTEXLEVELPARAMETERIVROBUSTANGLE) (GLenum target, GLint level, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *params); typedef void (GL_APIENTRYP PFNGLGETTEXLEVELPARAMETERIVROBUSTANGLE) (GLenum target, GLint level, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *params);
typedef void (GL_APIENTRYP PFNGLGETTEXLEVELPARAMETERFVROBUSTANGLE) (GLenum target, GLint level, GLenum pname, GLsizei bufSize, GLsizei *length, GLfloat *params); typedef void (GL_APIENTRYP PFNGLGETTEXLEVELPARAMETERFVROBUSTANGLE) (GLenum target, GLint level, GLenum pname, GLsizei bufSize, GLsizei *length, GLfloat *params);
typedef void (GL_APIENTRYP PFNGLGETPOINTERVROBUSTANGLEROBUSTANGLE) (GLenum pname, GLsizei bufSize, GLsizei *length, void **params); typedef void (GL_APIENTRYP PFNGLGETPOINTERVROBUSTANGLEROBUSTANGLE) (GLenum pname, GLsizei bufSize, GLsizei *length, void **params);
typedef void (GL_APIENTRYP PFNGLREADNPIXELSROBUSTANGLE) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, GLsizei *length, void *data); typedef void (GL_APIENTRYP PFNGLREADNPIXELSROBUSTANGLE) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, GLsizei *length, GLsizei *columns, GLsizei *rows, void *data);
typedef void (GL_APIENTRYP PFNGLGETNUNIFORMFVROBUSTANGLE) (GLuint program, GLint location, GLsizei bufSize, GLsizei *length, GLfloat *params); typedef void (GL_APIENTRYP PFNGLGETNUNIFORMFVROBUSTANGLE) (GLuint program, GLint location, GLsizei bufSize, GLsizei *length, GLfloat *params);
typedef void (GL_APIENTRYP PFNGLGETNUNIFORMIVROBUSTANGLE) (GLuint program, GLint location, GLsizei bufSize, GLsizei *length, GLint *params); typedef void (GL_APIENTRYP PFNGLGETNUNIFORMIVROBUSTANGLE) (GLuint program, GLint location, GLsizei bufSize, GLsizei *length, GLint *params);
typedef void (GL_APIENTRYP PFNGLGETNUNIFORMUIVROBUSTANGLE) (GLuint program, GLint location, GLsizei bufSize, GLsizei *length, GLuint *params); typedef void (GL_APIENTRYP PFNGLGETNUNIFORMUIVROBUSTANGLE) (GLuint program, GLint location, GLsizei bufSize, GLsizei *length, GLuint *params);
...@@ -3683,7 +3683,7 @@ GL_APICALL void GL_APIENTRY glGetUniformivRobustANGLE (GLuint program, GLint loc ...@@ -3683,7 +3683,7 @@ GL_APICALL void GL_APIENTRY glGetUniformivRobustANGLE (GLuint program, GLint loc
GL_APICALL void GL_APIENTRY glGetVertexAttribfvRobustANGLE (GLuint index, GLenum pname, GLsizei bufSize, GLsizei *length, GLfloat *params); GL_APICALL void GL_APIENTRY glGetVertexAttribfvRobustANGLE (GLuint index, GLenum pname, GLsizei bufSize, GLsizei *length, GLfloat *params);
GL_APICALL void GL_APIENTRY glGetVertexAttribivRobustANGLE (GLuint index, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *params); GL_APICALL void GL_APIENTRY glGetVertexAttribivRobustANGLE (GLuint index, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *params);
GL_APICALL void GL_APIENTRY glGetVertexAttribPointervRobustANGLE (GLuint index, GLenum pname, GLsizei bufSize, GLsizei *length, void **pointer); GL_APICALL void GL_APIENTRY glGetVertexAttribPointervRobustANGLE (GLuint index, GLenum pname, GLsizei bufSize, GLsizei *length, void **pointer);
GL_APICALL void GL_APIENTRY glReadPixelsRobustANGLE (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, GLsizei *length, void *pixels); GL_APICALL void GL_APIENTRY glReadPixelsRobustANGLE (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, GLsizei *length, GLsizei *columns, GLsizei *rows, void *pixels);
GL_APICALL void GL_APIENTRY glTexImage2DRobustANGLE (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, GLsizei bufSize, const void *pixels); GL_APICALL void GL_APIENTRY glTexImage2DRobustANGLE (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, GLsizei bufSize, const void *pixels);
GL_APICALL void GL_APIENTRY glTexParameterfvRobustANGLE (GLenum target, GLenum pname, GLsizei bufSize, const GLfloat *params); GL_APICALL void GL_APIENTRY glTexParameterfvRobustANGLE (GLenum target, GLenum pname, GLsizei bufSize, const GLfloat *params);
GL_APICALL void GL_APIENTRY glTexParameterivRobustANGLE (GLenum target, GLenum pname, GLsizei bufSize, const GLint *params); GL_APICALL void GL_APIENTRY glTexParameterivRobustANGLE (GLenum target, GLenum pname, GLsizei bufSize, const GLint *params);
...@@ -3713,7 +3713,7 @@ GL_APICALL void GL_APIENTRY glGetMultisamplefvRobustANGLE (GLenum pname, GLuint ...@@ -3713,7 +3713,7 @@ GL_APICALL void GL_APIENTRY glGetMultisamplefvRobustANGLE (GLenum pname, GLuint
GL_APICALL void GL_APIENTRY glGetTexLevelParameterivRobustANGLE (GLenum target, GLint level, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *params); GL_APICALL void GL_APIENTRY glGetTexLevelParameterivRobustANGLE (GLenum target, GLint level, GLenum pname, GLsizei bufSize, GLsizei *length, GLint *params);
GL_APICALL void GL_APIENTRY glGetTexLevelParameterfvRobustANGLE (GLenum target, GLint level, GLenum pname, GLsizei bufSize, GLsizei *length, GLfloat *params); GL_APICALL void GL_APIENTRY glGetTexLevelParameterfvRobustANGLE (GLenum target, GLint level, GLenum pname, GLsizei bufSize, GLsizei *length, GLfloat *params);
GL_APICALL void GL_APIENTRY glGetPointervRobustANGLERobustANGLE (GLenum pname, GLsizei bufSize, GLsizei *length, void **params); GL_APICALL void GL_APIENTRY glGetPointervRobustANGLERobustANGLE (GLenum pname, GLsizei bufSize, GLsizei *length, void **params);
GL_APICALL void GL_APIENTRY glReadnPixelsRobustANGLE (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, GLsizei *length, void *data); GL_APICALL void GL_APIENTRY glReadnPixelsRobustANGLE (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, GLsizei *length, GLsizei *columns, GLsizei *rows, void *data);
GL_APICALL void GL_APIENTRY glGetnUniformfvRobustANGLE (GLuint program, GLint location, GLsizei bufSize, GLsizei *length, GLfloat *params); GL_APICALL void GL_APIENTRY glGetnUniformfvRobustANGLE (GLuint program, GLint location, GLsizei bufSize, GLsizei *length, GLfloat *params);
GL_APICALL void GL_APIENTRY glGetnUniformivRobustANGLE (GLuint program, GLint location, GLsizei bufSize, GLsizei *length, GLint *params); GL_APICALL void GL_APIENTRY glGetnUniformivRobustANGLE (GLuint program, GLint location, GLsizei bufSize, GLsizei *length, GLint *params);
GL_APICALL void GL_APIENTRY glGetnUniformuivRobustANGLE (GLuint program, GLint location, GLsizei bufSize, GLsizei *length, GLuint *params); GL_APICALL void GL_APIENTRY glGetnUniformuivRobustANGLE (GLuint program, GLint location, GLsizei bufSize, GLsizei *length, GLuint *params);
......
...@@ -233,12 +233,22 @@ bool ValidateReadPixelsBase(ValidationContext *context, ...@@ -233,12 +233,22 @@ bool ValidateReadPixelsBase(ValidationContext *context,
GLenum type, GLenum type,
GLsizei bufSize, GLsizei bufSize,
GLsizei *length, GLsizei *length,
GLsizei *columns,
GLsizei *rows,
GLvoid *pixels) GLvoid *pixels)
{ {
if (length != nullptr) if (length != nullptr)
{ {
*length = 0; *length = 0;
} }
if (rows != nullptr)
{
*rows = 0;
}
if (columns != nullptr)
{
*columns = 0;
}
if (width < 0 || height < 0) if (width < 0 || height < 0)
{ {
...@@ -320,8 +330,7 @@ bool ValidateReadPixelsBase(ValidationContext *context, ...@@ -320,8 +330,7 @@ bool ValidateReadPixelsBase(ValidationContext *context,
size_t endByte = endByteOrErr.getResult(); size_t endByte = endByteOrErr.getResult();
if (bufSize >= 0) if (bufSize >= 0)
{ {
if (pixelPackBuffer == nullptr && static_cast<size_t>(bufSize) < endByte)
if (static_cast<size_t>(bufSize) < endByte)
{ {
context->handleError( context->handleError(
Error(GL_INVALID_OPERATION, "bufSize must be at least %u bytes.", endByte)); Error(GL_INVALID_OPERATION, "bufSize must be at least %u bytes.", endByte));
...@@ -344,7 +353,7 @@ bool ValidateReadPixelsBase(ValidationContext *context, ...@@ -344,7 +353,7 @@ bool ValidateReadPixelsBase(ValidationContext *context,
} }
} }
if (length != nullptr) if (pixelPackBuffer == nullptr && length != nullptr)
{ {
if (endByte > static_cast<size_t>(std::numeric_limits<GLsizei>::max())) if (endByte > static_cast<size_t>(std::numeric_limits<GLsizei>::max()))
{ {
...@@ -356,6 +365,39 @@ bool ValidateReadPixelsBase(ValidationContext *context, ...@@ -356,6 +365,39 @@ bool ValidateReadPixelsBase(ValidationContext *context,
*length = static_cast<GLsizei>(endByte); *length = static_cast<GLsizei>(endByte);
} }
auto getClippedExtent = [](GLint start, GLsizei length, int bufferSize) {
angle::CheckedNumeric<int> clippedExtent(length);
if (start < 0)
{
// "subtract" the area that is less than 0
clippedExtent += start;
}
const int readExtent = start + length;
if (readExtent > bufferSize)
{
// Subtract the region to the right of the read buffer
clippedExtent -= (readExtent - bufferSize);
}
if (!clippedExtent.IsValid())
{
return 0;
}
return std::max(clippedExtent.ValueOrDie(), 0);
};
if (columns != nullptr)
{
*columns = getClippedExtent(x, width, readBuffer->getSize().width);
}
if (rows != nullptr)
{
*rows = getClippedExtent(y, height, readBuffer->getSize().height);
}
return true; return true;
} }
...@@ -2326,7 +2368,8 @@ bool ValidateReadPixels(ValidationContext *context, ...@@ -2326,7 +2368,8 @@ bool ValidateReadPixels(ValidationContext *context,
GLenum type, GLenum type,
GLvoid *pixels) GLvoid *pixels)
{ {
return ValidateReadPixelsBase(context, x, y, width, height, format, type, -1, nullptr, pixels); return ValidateReadPixelsBase(context, x, y, width, height, format, type, -1, nullptr, nullptr,
nullptr, pixels);
} }
bool ValidateReadPixelsRobustANGLE(ValidationContext *context, bool ValidateReadPixelsRobustANGLE(ValidationContext *context,
...@@ -2338,6 +2381,8 @@ bool ValidateReadPixelsRobustANGLE(ValidationContext *context, ...@@ -2338,6 +2381,8 @@ bool ValidateReadPixelsRobustANGLE(ValidationContext *context,
GLenum type, GLenum type,
GLsizei bufSize, GLsizei bufSize,
GLsizei *length, GLsizei *length,
GLsizei *columns,
GLsizei *rows,
GLvoid *pixels) GLvoid *pixels)
{ {
if (!ValidateRobustEntryPoint(context, bufSize)) if (!ValidateRobustEntryPoint(context, bufSize))
...@@ -2346,7 +2391,7 @@ bool ValidateReadPixelsRobustANGLE(ValidationContext *context, ...@@ -2346,7 +2391,7 @@ bool ValidateReadPixelsRobustANGLE(ValidationContext *context,
} }
if (!ValidateReadPixelsBase(context, x, y, width, height, format, type, bufSize, length, if (!ValidateReadPixelsBase(context, x, y, width, height, format, type, bufSize, length,
pixels)) columns, rows, pixels))
{ {
return false; return false;
} }
...@@ -2376,7 +2421,7 @@ bool ValidateReadnPixelsEXT(Context *context, ...@@ -2376,7 +2421,7 @@ bool ValidateReadnPixelsEXT(Context *context,
} }
return ValidateReadPixelsBase(context, x, y, width, height, format, type, bufSize, nullptr, return ValidateReadPixelsBase(context, x, y, width, height, format, type, bufSize, nullptr,
pixels); nullptr, nullptr, pixels);
} }
bool ValidateReadnPixelsRobustANGLE(ValidationContext *context, bool ValidateReadnPixelsRobustANGLE(ValidationContext *context,
...@@ -2388,6 +2433,8 @@ bool ValidateReadnPixelsRobustANGLE(ValidationContext *context, ...@@ -2388,6 +2433,8 @@ bool ValidateReadnPixelsRobustANGLE(ValidationContext *context,
GLenum type, GLenum type,
GLsizei bufSize, GLsizei bufSize,
GLsizei *length, GLsizei *length,
GLsizei *columns,
GLsizei *rows,
GLvoid *data) GLvoid *data)
{ {
if (!ValidateRobustEntryPoint(context, bufSize)) if (!ValidateRobustEntryPoint(context, bufSize))
...@@ -2395,7 +2442,8 @@ bool ValidateReadnPixelsRobustANGLE(ValidationContext *context, ...@@ -2395,7 +2442,8 @@ bool ValidateReadnPixelsRobustANGLE(ValidationContext *context,
return false; return false;
} }
if (!ValidateReadPixelsBase(context, x, y, width, height, format, type, bufSize, length, data)) if (!ValidateReadPixelsBase(context, x, y, width, height, format, type, bufSize, length,
columns, rows, data))
{ {
return false; return false;
} }
......
...@@ -124,6 +124,8 @@ bool ValidateReadPixelsRobustANGLE(ValidationContext *context, ...@@ -124,6 +124,8 @@ bool ValidateReadPixelsRobustANGLE(ValidationContext *context,
GLenum type, GLenum type,
GLsizei bufSize, GLsizei bufSize,
GLsizei *length, GLsizei *length,
GLsizei *columns,
GLsizei *rows,
GLvoid *pixels); GLvoid *pixels);
bool ValidateReadnPixelsEXT(Context *context, bool ValidateReadnPixelsEXT(Context *context,
GLint x, GLint x,
...@@ -143,6 +145,8 @@ bool ValidateReadnPixelsRobustANGLE(ValidationContext *context, ...@@ -143,6 +145,8 @@ bool ValidateReadnPixelsRobustANGLE(ValidationContext *context,
GLenum type, GLenum type,
GLsizei bufSize, GLsizei bufSize,
GLsizei *length, GLsizei *length,
GLsizei *columns,
GLsizei *rows,
GLvoid *data); GLvoid *data);
bool ValidateGenQueriesEXT(gl::Context *context, GLsizei n); bool ValidateGenQueriesEXT(gl::Context *context, GLsizei n);
......
...@@ -2387,20 +2387,24 @@ ANGLE_EXPORT void GL_APIENTRY ReadPixelsRobustANGLE(GLint x, ...@@ -2387,20 +2387,24 @@ ANGLE_EXPORT void GL_APIENTRY ReadPixelsRobustANGLE(GLint x,
GLenum type, GLenum type,
GLsizei bufSize, GLsizei bufSize,
GLsizei *length, GLsizei *length,
GLsizei *columns,
GLsizei *rows,
void *pixels) void *pixels)
{ {
EVENT( EVENT(
"(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, " "(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
"GLenum format = 0x%X, GLenum type = 0x%X, GLsizei bufsize = %d, GLsizei* length = " "GLenum format = 0x%X, GLenum type = 0x%X, GLsizei bufsize = %d, GLsizei* length = "
"0x%0.8p, GLvoid* pixels = 0x%0.8p)", "0x%0.8p, GLsizei* columns = 0x%0.8p, GLsizei* rows = 0x%0.8p, GLvoid* pixels = 0x%0.8p)",
x, y, width, height, format, type, bufSize, length, pixels); x, y, width, height, format, type, bufSize, length, columns, rows, pixels);
Context *context = GetValidGlobalContext(); Context *context = GetValidGlobalContext();
if (context) if (context)
{ {
GLsizei writeLength = 0; GLsizei writeLength = 0;
GLsizei writeColumns = 0;
GLsizei writeRows = 0;
if (!ValidateReadPixelsRobustANGLE(context, x, y, width, height, format, type, bufSize, if (!ValidateReadPixelsRobustANGLE(context, x, y, width, height, format, type, bufSize,
&writeLength, pixels)) &writeLength, &writeColumns, &writeRows, pixels))
{ {
return; return;
} }
...@@ -2408,6 +2412,8 @@ ANGLE_EXPORT void GL_APIENTRY ReadPixelsRobustANGLE(GLint x, ...@@ -2408,6 +2412,8 @@ ANGLE_EXPORT void GL_APIENTRY ReadPixelsRobustANGLE(GLint x,
context->readPixels(x, y, width, height, format, type, pixels); context->readPixels(x, y, width, height, format, type, pixels);
SetRobustLengthParam(length, writeLength); SetRobustLengthParam(length, writeLength);
SetRobustLengthParam(columns, writeColumns);
SetRobustLengthParam(rows, writeRows);
} }
} }
...@@ -3108,20 +3114,24 @@ ANGLE_EXPORT void GL_APIENTRY ReadnPixelsRobustANGLE(GLint x, ...@@ -3108,20 +3114,24 @@ ANGLE_EXPORT void GL_APIENTRY ReadnPixelsRobustANGLE(GLint x,
GLenum type, GLenum type,
GLsizei bufSize, GLsizei bufSize,
GLsizei *length, GLsizei *length,
GLsizei *columns,
GLsizei *rows,
void *data) void *data)
{ {
EVENT( EVENT(
"(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, " "(GLint x = %d, GLint y = %d, GLsizei width = %d, GLsizei height = %d, "
"GLenum format = 0x%X, GLenum type = 0x%X, GLsizei bufsize = %d, GLsizei* length = " "GLenum format = 0x%X, GLenum type = 0x%X, GLsizei bufsize = %d, GLsizei* length = "
"0x%0.8p, GLvoid *data = 0x%0.8p)", "0x%0.8p, GLsizei* columns = 0x%0.8p, GLsizei* rows = 0x%0.8p, GLvoid *data = 0x%0.8p)",
x, y, width, height, format, type, bufSize, length, data); x, y, width, height, format, type, bufSize, length, columns, rows, data);
Context *context = GetValidGlobalContext(); Context *context = GetValidGlobalContext();
if (context) if (context)
{ {
GLsizei writeLength = 0; GLsizei writeLength = 0;
GLsizei writeColumns = 0;
GLsizei writeRows = 0;
if (!ValidateReadnPixelsRobustANGLE(context, x, y, width, height, format, type, bufSize, if (!ValidateReadnPixelsRobustANGLE(context, x, y, width, height, format, type, bufSize,
&writeLength, data)) &writeLength, &writeColumns, &writeRows, data))
{ {
return; return;
} }
...@@ -3129,6 +3139,8 @@ ANGLE_EXPORT void GL_APIENTRY ReadnPixelsRobustANGLE(GLint x, ...@@ -3129,6 +3139,8 @@ ANGLE_EXPORT void GL_APIENTRY ReadnPixelsRobustANGLE(GLint x,
context->readPixels(x, y, width, height, format, type, data); context->readPixels(x, y, width, height, format, type, data);
SetRobustLengthParam(length, writeLength); SetRobustLengthParam(length, writeLength);
SetRobustLengthParam(columns, writeColumns);
SetRobustLengthParam(rows, writeRows);
} }
} }
......
...@@ -353,6 +353,8 @@ ANGLE_EXPORT void GL_APIENTRY ReadPixelsRobustANGLE(GLint x, ...@@ -353,6 +353,8 @@ ANGLE_EXPORT void GL_APIENTRY ReadPixelsRobustANGLE(GLint x,
GLenum type, GLenum type,
GLsizei bufSize, GLsizei bufSize,
GLsizei *length, GLsizei *length,
GLsizei *columns,
GLsizei *rows,
void *pixels); void *pixels);
ANGLE_EXPORT void GL_APIENTRY TexImage2DRobustANGLE(GLenum target, ANGLE_EXPORT void GL_APIENTRY TexImage2DRobustANGLE(GLenum target,
GLint level, GLint level,
...@@ -529,6 +531,8 @@ ANGLE_EXPORT void GL_APIENTRY ReadnPixelsRobustANGLE(GLint x, ...@@ -529,6 +531,8 @@ ANGLE_EXPORT void GL_APIENTRY ReadnPixelsRobustANGLE(GLint x,
GLenum type, GLenum type,
GLsizei bufSize, GLsizei bufSize,
GLsizei *length, GLsizei *length,
GLsizei *columns,
GLsizei *rows,
void *data); void *data);
ANGLE_EXPORT void GL_APIENTRY GetnUniformfvRobustANGLE(GLuint program, ANGLE_EXPORT void GL_APIENTRY GetnUniformfvRobustANGLE(GLuint program,
GLint location, GLint location,
......
...@@ -12,13 +12,16 @@ ...@@ -12,13 +12,16 @@
namespace angle namespace angle
{ {
constexpr GLsizei kWindowSize = 128;
class RobustClientMemoryTest : public ANGLETest class RobustClientMemoryTest : public ANGLETest
{ {
protected: protected:
RobustClientMemoryTest() RobustClientMemoryTest()
{ {
setWindowWidth(128); setWindowWidth(kWindowSize);
setWindowHeight(128); setWindowHeight(kWindowSize);
setConfigRedBits(8); setConfigRedBits(8);
setConfigGreenBits(8); setConfigGreenBits(8);
setConfigBlueBits(8); setConfigBlueBits(8);
...@@ -357,14 +360,29 @@ TEST_P(RobustClientMemoryTest, ReadPixels) ...@@ -357,14 +360,29 @@ TEST_P(RobustClientMemoryTest, ReadPixels)
// Test the regular case // Test the regular case
GLsizei length = 0; GLsizei length = 0;
GLsizei width = 0;
GLsizei height = 0;
glReadPixelsRobustANGLE(0, 0, dataDimension, dataDimension, GL_RGBA, GL_UNSIGNED_BYTE, glReadPixelsRobustANGLE(0, 0, dataDimension, dataDimension, GL_RGBA, GL_UNSIGNED_BYTE,
static_cast<GLsizei>(rgbaData.size()), &length, rgbaData.data()); static_cast<GLsizei>(rgbaData.size()), &length, &width, &height,
rgbaData.data());
EXPECT_GL_NO_ERROR();
EXPECT_EQ(static_cast<GLsizei>(rgbaData.size()), length);
EXPECT_EQ(dataDimension, width);
EXPECT_EQ(dataDimension, height);
// Test a case that would be partially clipped
glReadPixelsRobustANGLE(-1, kWindowSize - dataDimension + 3, dataDimension, dataDimension,
GL_RGBA, GL_UNSIGNED_BYTE, static_cast<GLsizei>(rgbaData.size()),
&length, &width, &height, rgbaData.data());
EXPECT_GL_NO_ERROR(); EXPECT_GL_NO_ERROR();
EXPECT_EQ(static_cast<GLsizei>(rgbaData.size()), length); EXPECT_EQ(static_cast<GLsizei>(rgbaData.size()), length);
EXPECT_EQ(dataDimension - 1, width);
EXPECT_EQ(dataDimension - 3, height);
// Test with a data size that is too small // Test with a data size that is too small
glReadPixelsRobustANGLE(0, 0, dataDimension, dataDimension, GL_RGBA, GL_UNSIGNED_BYTE, glReadPixelsRobustANGLE(0, 0, dataDimension, dataDimension, GL_RGBA, GL_UNSIGNED_BYTE,
static_cast<GLsizei>(rgbaData.size()) - 1, &length, rgbaData.data()); static_cast<GLsizei>(rgbaData.size()) - 1, &length, nullptr, nullptr,
rgbaData.data());
EXPECT_GL_ERROR(GL_INVALID_OPERATION); EXPECT_GL_ERROR(GL_INVALID_OPERATION);
if (getClientMajorVersion() >= 3) if (getClientMajorVersion() >= 3)
...@@ -372,7 +390,8 @@ TEST_P(RobustClientMemoryTest, ReadPixels) ...@@ -372,7 +390,8 @@ TEST_P(RobustClientMemoryTest, ReadPixels)
// Set a pack parameter that would cause the driver to write past the end of the buffer // Set a pack parameter that would cause the driver to write past the end of the buffer
glPixelStorei(GL_PACK_ROW_LENGTH, dataDimension + 1); glPixelStorei(GL_PACK_ROW_LENGTH, dataDimension + 1);
glReadPixelsRobustANGLE(0, 0, dataDimension, dataDimension, GL_RGBA, GL_UNSIGNED_BYTE, glReadPixelsRobustANGLE(0, 0, dataDimension, dataDimension, GL_RGBA, GL_UNSIGNED_BYTE,
static_cast<GLsizei>(rgbaData.size()), &length, rgbaData.data()); static_cast<GLsizei>(rgbaData.size()), &length, nullptr, nullptr,
rgbaData.data());
EXPECT_GL_ERROR(GL_INVALID_OPERATION); EXPECT_GL_ERROR(GL_INVALID_OPERATION);
} }
} }
......
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