[Piglit] [PATCH] egl_khr_create_context: Don't expect GL_CONTEXT_FLAGS query to work when it cannot

Ian Romanick idr at freedesktop.org
Fri May 26 04:38:35 UTC 2017


From: Ian Romanick <ian.d.romanick at intel.com>

The GL_KHR_spec is quite clear that you cannot examine the state of the
GL_CONTEXT_FLAG_DEBUG_BIT in OpenGL ES < 3.2 contexts because you cannot
glGetIntegerv(GL_CONTEXT_FLAGS).  This is also true, though not stated
in the extension spec, on desktop OpenGL < 3.0.

This should fix this test on any drivers that only support desktop
OpenGL < 3.0 or OpenGL ES < 3.2.  Tested on Intel BDW (OpenGL ES 3.1).

Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
---
 .../spec/egl_khr_create_context/valid-flag-debug.c | 62 +++++++++++++++++++---
 1 file changed, 54 insertions(+), 8 deletions(-)

diff --git a/tests/egl/spec/egl_khr_create_context/valid-flag-debug.c b/tests/egl/spec/egl_khr_create_context/valid-flag-debug.c
index 31f7398..000a7fe 100644
--- a/tests/egl/spec/egl_khr_create_context/valid-flag-debug.c
+++ b/tests/egl/spec/egl_khr_create_context/valid-flag-debug.c
@@ -69,6 +69,7 @@ try_debug_flag(EGLenum context_api, EGLenum context_bit)
 
 	EGLint attribs[64];
 	int i = 0;
+	GLboolean debug_output;
 
 	if (!EGL_KHR_create_context_setup(context_bit))
 		piglit_report_result(PIGLIT_SKIP);
@@ -158,19 +159,64 @@ try_debug_flag(EGLenum context_api, EGLenum context_bit)
 		break;
 	}
 
-	glGetIntegerv(GL_CONTEXT_FLAGS, &actual_flags);
+	/* The "Interactions with OpenGL ES" section of the GL_KHR_debug spec
+	 * says:
+	 *
+	 *    In OpenGL ES versions prior to and including ES 3.1 there is no
+	 *    CONTEXT_FLAGS state and therefore the CONTEXT_FLAG_DEBUG_BIT
+	 *    cannot be queried. GLES contexts must act as if this state
+	 *    existed as described in this specification even if the state
+	 *    itself is not visible to applications. For example, DEBUG_OUTPUT
+	 *    must still be enabled by default if the context was created with
+	 *    debug enabled.
+	 *
+	 * Nothing is explicitly said about versions of desktop OpenGL before
+	 * 3.0 which also lack the ability to query GL_CONTEXT_FLAGS.  We will
+	 * assume that the behavior should be the same.  It is likely that
+	 * Mesa is the only existent such implementation.
+	 */
+	if ((context_bit == EGL_OPENGL_BIT && piglit_get_gl_version() < 30) ||
+	    (context_bit != EGL_OPENGL_BIT && piglit_get_gl_version() < 32)) {
+		glGetIntegerv(GL_CONTEXT_FLAGS, &actual_flags);
+
+		if (!piglit_check_gl_error(GL_INVALID_ENUM)) {
+			fprintf(stderr,
+				"glGetIntegerv(GL_CONTEXT_FLAGS) should not "
+				"be possible in this context\n");
+			piglit_report_result(PIGLIT_FAIL);
+		}
+	} else {
+		glGetIntegerv(GL_CONTEXT_FLAGS, &actual_flags);
+
+		if (!piglit_check_gl_error(GL_NO_ERROR)) {
+			fprintf(stderr,
+				"glGetIntegerv(GL_CONTEXT_FLAGS) failed\n");
+			piglit_report_result(PIGLIT_FAIL);
+		}
+
+		/* Verify that this is actually a debug context. */
+		if (!(actual_flags & GL_CONTEXT_FLAG_DEBUG_BIT)) {
+			fprintf(stderr,
+				"GL_CONTEXT_FLAGS=0x%x does not contain "
+				"GL_CONTEXT_FLAG_DEBUG_BIT=0x%x\n",
+				actual_flags, GL_CONTEXT_FLAG_DEBUG_BIT);
+			piglit_report_result(PIGLIT_FAIL);
+		}
+	}
+
+	/* Since we may not have been able to query GL_CONTEXT_FLAGS above,
+	 * query GL_DEBUG_OUTPUT just so that we can check something.
+	 */
+	debug_output = glIsEnabled(GL_DEBUG_OUTPUT);
 
 	if (!piglit_check_gl_error(GL_NO_ERROR)) {
-		fprintf(stderr, "glGetIntegerv(GL_CONTEXT_FLAGS) failed\n");
+		fprintf(stderr, "glIsEnabled(GL_DEBUG_OUTPUT) failed\n");
 		piglit_report_result(PIGLIT_FAIL);
 	}
 
-	/* Verify that this is actually a debug context. */
-	if (!(actual_flags & GL_CONTEXT_FLAG_DEBUG_BIT)) {
-		fprintf(stderr,
-			"GL_CONTEXT_FLAGS=0x%x does not contain "
-			"GL_CONTEXT_FLAG_DEBUG_BIT=0x%x\n",
-			actual_flags, GL_CONTEXT_FLAG_DEBUG_BIT);
+	if (!debug_output) {
+		fprintf(stderr, "GL_DEBUG_OUTPUT should be enabled by "
+			"default, but it was not.\n");
 		piglit_report_result(PIGLIT_FAIL);
 	}
 
-- 
2.7.4



More information about the Piglit mailing list