Handle ANGLE_multiview state queries

The patch extends glGetIntegerv and glGetFramebufferAttachmentParameteriv
logic to handle the new tokens from the ANGLE_multiview extension.

BUG=angleproject:2062
TEST=angle_end2end_tests

Change-Id: Ide145279cd7b58cd03502458d7d3a1a0f5e9e86d
Reviewed-on: https://chromium-review.googlesource.com/573780
Reviewed-by: Olli Etuaho <oetuaho@nvidia.com>
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 5b2dc8e..eb6bfd2 100644
--- a/src/libANGLE/validationES.cpp
+++ b/src/libANGLE/validationES.cpp
@@ -3954,12 +3954,6 @@
                                                      GLenum pname,
                                                      GLsizei *numParams)
 {
-    // Only one parameter is returned from glGetFramebufferAttachmentParameteriv
-    if (numParams)
-    {
-        *numParams = 1;
-    }
-
     if (!ValidFramebufferTarget(target))
     {
         context->handleError(InvalidEnum());
@@ -3976,6 +3970,17 @@
         case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE:
             break;
 
+        case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_ANGLE:
+        case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_MULTIVIEW_LAYOUT_ANGLE:
+        case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_ANGLE:
+        case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_VIEWPORT_OFFSETS_ANGLE:
+            if (clientVersion < 3 || !context->getExtensions().multiview)
+            {
+                ANGLE_VALIDATION_ERR(context, InvalidEnum(), EnumNotSupported);
+                return false;
+            }
+            break;
+
         case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
             if (clientVersion < 3 && !context->getExtensions().sRGB)
             {
@@ -4178,6 +4183,22 @@
         }
     }
 
+    if (numParams)
+    {
+        if (pname == GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_VIEWPORT_OFFSETS_ANGLE)
+        {
+            // Only when the viewport offsets are queried we can have a varying number of output
+            // parameters.
+            const int numViews = attachmentObject ? attachmentObject->getNumViews() : 1;
+            *numParams         = numViews * 2;
+        }
+        else
+        {
+            // For all other queries we can have only one output parameter.
+            *numParams = 1;
+        }
+    }
+
     return true;
 }