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/renderer/d3d/FramebufferD3D.cpp b/src/libANGLE/renderer/d3d/FramebufferD3D.cpp
index 44e7851..69e3505 100644
--- a/src/libANGLE/renderer/d3d/FramebufferD3D.cpp
+++ b/src/libANGLE/renderer/d3d/FramebufferD3D.cpp
@@ -207,18 +207,25 @@
     return clear(state, clearParams);
 }
 
+const gl::FramebufferAttachment *FramebufferD3D::getReadAttachment() const
+{
+    ASSERT(mReadBuffer == GL_BACK || (mReadBuffer >= GL_COLOR_ATTACHMENT0 && mReadBuffer <= GL_COLOR_ATTACHMENT15));
+    size_t readIndex = (mReadBuffer == GL_BACK ? 0 : static_cast<size_t>(mReadBuffer - GL_COLOR_ATTACHMENT0));
+    ASSERT(readIndex < mColorBuffers.size());
+    return mColorBuffers[readIndex];
+}
+
 GLenum FramebufferD3D::getImplementationColorReadFormat() const
 {
-    // Will require more logic if glReadBuffers is supported
-    ASSERT(mReadBuffer == GL_COLOR_ATTACHMENT0 || mReadBuffer == GL_BACK);
+    const gl::FramebufferAttachment *readAttachment = getReadAttachment();
 
-    if (mColorBuffers[0] == nullptr)
+    if (readAttachment == nullptr)
     {
         return GL_NONE;
     }
 
     RenderTargetD3D *attachmentRenderTarget = NULL;
-    gl::Error error = GetAttachmentRenderTarget(mColorBuffers[0], &attachmentRenderTarget);
+    gl::Error error = GetAttachmentRenderTarget(readAttachment, &attachmentRenderTarget);
     if (error.isError())
     {
         return GL_NONE;
@@ -232,16 +239,15 @@
 
 GLenum FramebufferD3D::getImplementationColorReadType() const
 {
-    // Will require more logic if glReadBuffers is supported
-    ASSERT(mReadBuffer == GL_COLOR_ATTACHMENT0 || mReadBuffer == GL_BACK);
+    const gl::FramebufferAttachment *readAttachment = getReadAttachment();
 
-    if (mColorBuffers[0] == nullptr)
+    if (readAttachment == nullptr)
     {
         return GL_NONE;
     }
 
     RenderTargetD3D *attachmentRenderTarget = NULL;
-    gl::Error error = GetAttachmentRenderTarget(mColorBuffers[0], &attachmentRenderTarget);
+    gl::Error error = GetAttachmentRenderTarget(readAttachment, &attachmentRenderTarget);
     if (error.isError())
     {
         return GL_NONE;