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);
 }