Refactor ReadPixels validation.
Move ReadPixels error generation out of the implementation and into
the API level.
BUG=angle:571
Change-Id: I0b32294f359fedd13d1af2c95baf37a3e5ac1d5b
Reviewed-on: https://chromium-review.googlesource.com/188014
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Reviewed-by: Shannon Woods <shannonwoods@chromium.org>
Tested-by: Jamie Madill <jmadill@chromium.org>
diff --git a/src/libGLESv2/Context.cpp b/src/libGLESv2/Context.cpp
index 3199f95..0fe10c5 100644
--- a/src/libGLESv2/Context.cpp
+++ b/src/libGLESv2/Context.cpp
@@ -2933,31 +2933,11 @@
void Context::readPixels(GLint x, GLint y, GLsizei width, GLsizei height,
GLenum format, GLenum type, GLsizei *bufSize, void* pixels)
{
- Framebuffer *framebuffer = getReadFramebuffer();
+ gl::Framebuffer *framebuffer = getReadFramebuffer();
- if (framebuffer->completeness() != GL_FRAMEBUFFER_COMPLETE)
- {
- return gl::error(GL_INVALID_FRAMEBUFFER_OPERATION);
- }
-
- if (getReadFramebufferHandle() != 0 && framebuffer->getSamples() != 0)
- {
- return gl::error(GL_INVALID_OPERATION);
- }
-
- GLenum sizedInternalFormat = IsSizedInternalFormat(format, mClientVersion) ? format
- : GetSizedInternalFormat(format, type, mClientVersion);
-
- GLsizei outputPitch = GetRowPitch(sizedInternalFormat, type, mClientVersion, width, getPackAlignment());
- // sized query sanity check
- if (bufSize)
- {
- int requiredSize = outputPitch * height;
- if (requiredSize > *bufSize)
- {
- return gl::error(GL_INVALID_OPERATION);
- }
- }
+ bool isSized = IsSizedInternalFormat(format, mClientVersion);
+ GLenum sizedInternalFormat = (isSized ? format : GetSizedInternalFormat(format, type, mClientVersion));
+ GLuint outputPitch = GetRowPitch(sizedInternalFormat, type, mClientVersion, width, getPackAlignment());
mRenderer->readPixels(framebuffer, x, y, width, height, format, type, outputPitch, getPackReverseRowOrder(), getPackAlignment(), pixels);
}