Improve glCopyTexSubImage2D and glReadPixels validation

glCopyTexSubImage2d and glReadPixels should generate a
GL_INVALID_OPERATION when GL_NONE is specified as a color buffer.
There are two tests added which cover glCopyTexSubImage2D and
glReadPixels.

BUG=angleproject:1445

TEST=angle_end2end_tests

Change-Id: I3ab1428aad7eee96ca2330909e2b6f765f539705
Reviewed-on: https://chromium-review.googlesource.com/360860
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
diff --git a/src/libANGLE/validationES.cpp b/src/libANGLE/validationES.cpp
index 2a8c61b..f574e22 100644
--- a/src/libANGLE/validationES.cpp
+++ b/src/libANGLE/validationES.cpp
@@ -1103,6 +1103,13 @@
 
     const Framebuffer *framebuffer = context->getGLState().getReadFramebuffer();
     ASSERT(framebuffer);
+
+    if (framebuffer->getReadBufferState() == GL_NONE)
+    {
+        context->handleError(Error(GL_INVALID_OPERATION, "Read buffer is GL_NONE"));
+        return false;
+    }
+
     const FramebufferAttachment *readBuffer = framebuffer->getReadColorbuffer();
     if (!readBuffer)
     {
@@ -1599,6 +1606,13 @@
 
             const Framebuffer *framebuffer = context->getGLState().getReadFramebuffer();
             ASSERT(framebuffer);
+
+            if (framebuffer->getReadBufferState() == GL_NONE)
+            {
+                context->handleError(Error(GL_INVALID_OPERATION, "Read buffer is GL_NONE"));
+                return false;
+            }
+
             const FramebufferAttachment *attachment = framebuffer->getReadColorbuffer();
             if (!attachment)
             {
@@ -1674,6 +1688,12 @@
         return false;
     }
 
+    if (readFramebuffer->getReadBufferState() == GL_NONE)
+    {
+        context->handleError(Error(GL_INVALID_OPERATION, "Read buffer is GL_NONE"));
+        return false;
+    }
+
     const gl::Caps &caps = context->getCaps();
 
     GLuint maxDimension = 0;