Implement ReadBuffer functionality.
This enables ReadPixels from non-0 FBO attachments.
Tested with:
dEQP-GLES3.functional.negative_api.buffer.read_buffer
(fails due to a possible error in dEQP)
dEQP-GLES3.functional.shaders.fragdata.draw_buffers
(passes)
BUG=angle:903
Change-Id: Ib095e1d50b8fbbc6f197de25f19ec0993309145a
Reviewed-on: https://chromium-review.googlesource.com/244841
Tested-by: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Zhenyao Mo <zmo@chromium.org>
diff --git a/src/libANGLE/Framebuffer.cpp b/src/libANGLE/Framebuffer.cpp
index c4d8f38..54c0894 100644
--- a/src/libANGLE/Framebuffer.cpp
+++ b/src/libANGLE/Framebuffer.cpp
@@ -132,14 +132,15 @@
FramebufferAttachment *Framebuffer::getReadColorbuffer() const
{
- // Will require more logic if glReadBuffers is supported
- return mColorbuffers[0];
+ size_t readIndex = (mReadBufferState == GL_BACK ? 0 : static_cast<size_t>(mReadBufferState - GL_COLOR_ATTACHMENT0));
+ ASSERT(readIndex < IMPLEMENTATION_MAX_DRAW_BUFFERS);
+ return mColorbuffers[readIndex];
}
GLenum Framebuffer::getReadColorbufferType() const
{
- // Will require more logic if glReadBuffers is supported
- return (mColorbuffers[0] ? mColorbuffers[0]->type() : GL_NONE);
+ FramebufferAttachment *readAttachment = getReadColorbuffer();
+ return (readAttachment ? readAttachment->type() : GL_NONE);
}
FramebufferAttachment *Framebuffer::getFirstColorbuffer() const
@@ -204,6 +205,9 @@
void Framebuffer::setReadBuffer(GLenum buffer)
{
+ ASSERT(buffer == GL_BACK || buffer == GL_NONE ||
+ (buffer >= GL_COLOR_ATTACHMENT0 &&
+ (buffer - GL_COLOR_ATTACHMENT0) < IMPLEMENTATION_MAX_DRAW_BUFFERS));
mReadBufferState = buffer;
mImpl->setReadBuffer(buffer);
}