Disallow timer queries with multi-view draw framebuffers

According to the ANGLE_multiview spec Draw* commands should generate
an INVALID_OPERATION error if there is an active query object for
target TIME_ELAPSED_EXT and the number of views in the active draw
framebuffer is greater than 1.

BUG=angleproject:2062
TEST=angle_end2end_tests

Change-Id: I8a4434784ecec753a39c5ef82fa3ee46255a0851
Reviewed-on: https://chromium-review.googlesource.com/593315
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Commit-Queue: Martin Radev <mradev@nvidia.com>
diff --git a/src/tests/gl_tests/MultiviewDrawTest.cpp b/src/tests/gl_tests/MultiviewDrawTest.cpp
index 8448da4..2c0aef1 100644
--- a/src/tests/gl_tests/MultiviewDrawTest.cpp
+++ b/src/tests/gl_tests/MultiviewDrawTest.cpp
@@ -289,4 +289,59 @@
     glEndTransformFeedback();
 }
 
+// The test verifies that glDraw*:
+// 1) generates an INVALID_OPERATION error if the number of views in the active draw framebuffer is
+// greater than 1 and there is an active query for target GL_TIME_ELAPSED_EXT.
+// 2) does not generate any error if the number of views in the draw framebuffer is 1.
+TEST_P(MultiviewDrawValidationTest, ActiveTimeElapsedQuery)
+{
+    if (!requestMultiviewExtension())
+    {
+        return;
+    }
+
+    if (!extensionEnabled("GL_EXT_disjoint_timer_query"))
+    {
+        std::cout << "Test skipped because GL_EXT_disjoint_timer_query is not available."
+                  << std::endl;
+        return;
+    }
+
+    const GLint viewportOffsets[4] = {0, 0, 2, 0};
+    const std::string &vsSource =
+        "#version 300 es\n"
+        "void main()\n"
+        "{}\n";
+    const std::string &fsSource =
+        "#version 300 es\n"
+        "precision mediump float;\n"
+        "void main()\n"
+        "{}\n";
+    ANGLE_GL_PROGRAM(program, vsSource, fsSource);
+    glUseProgram(program);
+
+    GLuint query = 0u;
+    glGenQueriesEXT(1, &query);
+    glBeginQueryEXT(GL_TIME_ELAPSED_EXT, query);
+
+    // Check first case.
+    {
+        glFramebufferTextureMultiviewSideBySideANGLE(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, mTex2d,
+                                                     0, 2, &viewportOffsets[0]);
+        glDrawArrays(GL_TRIANGLES, 0, 3);
+        EXPECT_GL_ERROR(GL_INVALID_OPERATION);
+    }
+
+    // Check second case.
+    {
+        glFramebufferTextureMultiviewSideBySideANGLE(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, mTex2d,
+                                                     0, 1, &viewportOffsets[0]);
+        glDrawArrays(GL_TRIANGLES, 0, 3);
+        EXPECT_GL_NO_ERROR();
+    }
+
+    glEndQueryEXT(GL_TIME_ELAPSED_EXT);
+    glDeleteQueries(1, &query);
+}
+
 ANGLE_INSTANTIATE_TEST(MultiviewDrawValidationTest, ES31_OPENGL());
\ No newline at end of file