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