From: Grigori Goronzy <g...@chown.ath.cx> This test verifies context creation with the EGL_KHR_create_context_no_error extension, which includes interaction with debug and robustness flags. The test also verifies that the KHR_no_error mode is successfully enabled with a check of context flags and glGetError() behavior.
Both GL 2.0 and GLES2 are tested. --- .../CMakeLists.gles2.txt | 3 + .../spec/egl_khr_create_context/no-error.c | 216 ++++++++++++++++++ 2 files changed, 219 insertions(+) create mode 100644 tests/egl/spec/egl_khr_create_context/no-error.c diff --git a/tests/egl/spec/egl_khr_create_context/CMakeLists.gles2.txt b/tests/egl/spec/egl_khr_create_context/CMakeLists.gles2.txt index 23bf145f2..a27ef2da2 100644 --- a/tests/egl/spec/egl_khr_create_context/CMakeLists.gles2.txt +++ b/tests/egl/spec/egl_khr_create_context/CMakeLists.gles2.txt @@ -19,4 +19,7 @@ piglit_add_executable (egl-create-context-invalid-gl-version invalid-gl-version. piglit_add_executable (egl-create-context-verify-gl-flavor verify-gl-flavor.c common.c) piglit_add_executable (egl-create-context-valid-flag-debug-gles valid-flag-debug.c common.c) +# Tests that use ES 2 and Desktop GL. +piglit_add_executable (egl-create-context-no-error no-error.c common.c) + # vim: ft=cmake: diff --git a/tests/egl/spec/egl_khr_create_context/no-error.c b/tests/egl/spec/egl_khr_create_context/no-error.c new file mode 100644 index 000000000..12536ece1 --- /dev/null +++ b/tests/egl/spec/egl_khr_create_context/no-error.c @@ -0,0 +1,216 @@ +/* Copyright 2017 Grigori Goronzy <g...@chown.ath.cx> + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include <stdio.h> +#include <stdbool.h> + +#include "piglit-util-gl.h" +#include "piglit-util-egl.h" +#include "common.h" + +#define BOOLSTR(x) ((x) ? "yes" : "no") + +static void +fold_results(enum piglit_result *a, enum piglit_result b) +{ + if (*a == PIGLIT_FAIL || b == PIGLIT_FAIL) + *a = PIGLIT_FAIL; + else if (*a == PIGLIT_PASS || b == PIGLIT_PASS) + *a = PIGLIT_PASS; + else + *a = PIGLIT_SKIP; +} + +static void +check_extension(EGLint mask) +{ + if (!EGL_KHR_create_context_setup(mask)) + piglit_report_result(PIGLIT_SKIP); + + piglit_require_egl_extension(egl_dpy, "EGL_KHR_create_context_no_error"); + + EGL_KHR_create_context_teardown(); +} + +static enum piglit_result +check_no_error(EGLenum api, bool no_error, bool debug, bool robust) +{ + static bool is_dispatch_init = false; + enum piglit_result pass = PIGLIT_SKIP; + EGLContext ctx; + EGLint attribs[11]; + size_t ai = 0; + GLint context_flags = 0; + EGLint mask = (api == EGL_OPENGL_API) ? EGL_OPENGL_BIT : EGL_OPENGL_ES2_BIT; + + printf("info: %s no_error=%s debug=%s robustness=%s\n", + (api == EGL_OPENGL_API) ? "OpenGL" : "OpenGL ES", + BOOLSTR(no_error), BOOLSTR(debug), BOOLSTR(robust)); + + if (!EGL_KHR_create_context_setup(mask)) + goto out; + + if (eglBindAPI(api) != EGL_TRUE) + goto out; + + if (api == EGL_OPENGL_ES_API) { + attribs[ai++] = EGL_CONTEXT_CLIENT_VERSION; + attribs[ai++] = 2; + } + if (debug || robust) { + EGLint flags = 0; + flags |= debug ? EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR : 0; + flags |= robust ? EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR : 0; + attribs[ai++] = EGL_CONTEXT_FLAGS_KHR; + attribs[ai++] = flags; + } + /* Always use OpenGL 2.0 or OpenGL ES 2.0 to keep this test reasonably + * simple; there are enough variants as-is. + */ + attribs[ai++] = EGL_CONTEXT_MAJOR_VERSION_KHR; + attribs[ai++] = 2; + attribs[ai++] = EGL_CONTEXT_MINOR_VERSION_KHR; + attribs[ai++] = 0; + attribs[ai++] = EGL_CONTEXT_OPENGL_NO_ERROR_KHR; + attribs[ai++] = no_error ? EGL_TRUE : EGL_FALSE; + attribs[ai++] = EGL_NONE; + + ctx = eglCreateContext(egl_dpy, cfg, EGL_NO_CONTEXT, attribs); + if (ctx == NULL) { + if (eglGetError() == EGL_BAD_MATCH) { + if ((debug || robust) && no_error) { + /* KHR_no_error doesn't allow the no error mode to be enabled + * with KHR_debug or ARB_robustness, so context creation is + * expected to fail in these cases. + */ + pass = PIGLIT_PASS; + goto out; + } + + /* Most likely the API/version is not supported. */ + pass = PIGLIT_SKIP; + goto out; + } + + printf("error: context creation failed\n"); + pass = PIGLIT_FAIL; + goto out; + } + + if (!piglit_check_egl_error(EGL_SUCCESS)) { + printf("error: unexpected EGL error\n"); + pass = PIGLIT_FAIL; + goto out; + } + + if (eglMakeCurrent(egl_dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, + ctx) != EGL_TRUE) { + printf("error: failed to make context current\n"); + pass = PIGLIT_FAIL; + goto out; + } + + if (!is_dispatch_init) { + /* We must postpone initialization of piglit-dispatch until + * a context is current. + */ + piglit_dispatch_default_init(PIGLIT_DISPATCH_GL); + is_dispatch_init = true; + } + + /* The EGL_KHR_create_context_no_error extension unfortunately allows + * "no-op" implementations. That is, the EGL extension can be supported + * without any support on the GL side of things. This means we can't + * fail if KHR_no_error turns out to be not enabled at this point. + */ + if (no_error) { + /* Verify that the KHR_no_error extension is available in the + * extension list. + */ + if (!piglit_is_extension_supported("GL_KHR_no_error")) { + printf("error: context does not report GL_KHR_no_error " + "availability\n"); + pass = PIGLIT_SKIP; + goto out; + } + + /* Verify that constant flags report KHR_no_error to be enabled. + * Unfortunately, OpenGL ES does not support the necessary flag until + * OpenGL ES 3.2, so the check is skipped for ES. We just have to + * assume that it is supported when the extension appears to be + * available in the context, according to extension list. + */ + if (api == EGL_OPENGL_API) { + glGetIntegerv(GL_CONTEXT_FLAGS, &context_flags); + if (!(context_flags & GL_CONTEXT_FLAG_NO_ERROR_BIT_KHR)) { + printf("error: context does not have GL_KHR_no_error " + "enabled\n"); + pass = PIGLIT_SKIP; + goto out; + } + } + } + + /* The number of texture units is a small, unsigned number. Craft an + * illegal call by using a very large number that should fail on any + * OpenGL implementation in practice. + */ + glActiveTexture(-1); + if (glGetError() != 0 && no_error) { + printf("error: error observed with KHR_no_error enabled\n"); + pass = PIGLIT_FAIL; + goto out; + } + + /* Everything turned out to be fine */ + pass = PIGLIT_PASS; +out: + printf("info: %s\n", piglit_result_to_string(pass)); + EGL_KHR_create_context_teardown(); + return pass; +} + +int main(int argc, char **argv) +{ + enum piglit_result pass = PIGLIT_SKIP; + + check_extension(EGL_OPENGL_BIT); + check_extension(EGL_OPENGL_ES2_BIT); + + /* "Control group": Check that errors are indeed generated without + * KHR_no_error enabled. */ + fold_results(&pass, check_no_error(EGL_OPENGL_API, false, false, false)); + fold_results(&pass, check_no_error(EGL_OPENGL_ES_API, false, false, false)); + fold_results(&pass, check_no_error(EGL_OPENGL_API, false, true, false)); + fold_results(&pass, check_no_error(EGL_OPENGL_ES_API, false, true, false)); + + /* Check that KHR_no_error gets enabled and its interaction with debug and + * robustness context flags. */ + fold_results(&pass, check_no_error(EGL_OPENGL_API, true, false, false)); + fold_results(&pass, check_no_error(EGL_OPENGL_ES_API, true, false, false)); + fold_results(&pass, check_no_error(EGL_OPENGL_API, true, true, false)); + fold_results(&pass, check_no_error(EGL_OPENGL_ES_API, true, true, false)); + fold_results(&pass, check_no_error(EGL_OPENGL_API, true, false, true)); + fold_results(&pass, check_no_error(EGL_OPENGL_API, true, true, true)); + + piglit_report_result(pass); +} -- 2.19.1 _______________________________________________ Piglit mailing list Piglit@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/piglit