static EGLContext create_context(EGLDisplay dpy) { bool ok = false; EGLConfig config = 0; EGLint num_configs = 0; EGLContext ctx = 0; static const EGLint config_attribs[] = { EGL_RED_SIZE, EGL_DONT_CARE, EGL_GREEN_SIZE, EGL_DONT_CARE, EGL_BLUE_SIZE, EGL_DONT_CARE, EGL_ALPHA_SIZE, EGL_DONT_CARE, EGL_DEPTH_SIZE, EGL_DONT_CARE, EGL_STENCIL_SIZE, EGL_DONT_CARE, EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT, EGL_SURFACE_TYPE, 0, EGL_NONE, }; static const EGLint context_attribs[] = { EGL_CONTEXT_MAJOR_VERSION, 3, EGL_CONTEXT_MINOR_VERSION, 2, EGL_NONE, }; ok = eglChooseConfig(dpy, config_attribs, &config, 1, &num_configs); if (!ok || !config || num_configs == 0) { EGLint egl_error = eglGetError(); piglit_loge("failed to get EGLConfig: %s(0x%x)", piglit_get_egl_error_name(egl_error), egl_error); piglit_report_result(PIGLIT_SKIP); } ok = piglit_egl_bind_api(EGL_OPENGL_API); if (!ok) { piglit_loge("failed to bind EGL_OPENGL_API"); piglit_report_result(PIGLIT_FAIL); } ctx = eglCreateContext(dpy, config, EGL_NO_CONTEXT, context_attribs); if (!ctx) { EGLint egl_error = eglGetError(); piglit_loge("failed to create EGLContext: %s(0x%x)", piglit_get_egl_error_name(egl_error), egl_error); piglit_report_result(PIGLIT_FAIL); } return ctx; }
/** * Create OpenGL ES 2.0 context, make it current, and verify that it supports * GL_OES_EGL_sync. */ static enum piglit_result init_context(EGLDisplay dpy, EGLContext *out_ctx) { enum piglit_result result = PIGLIT_PASS; bool ok = false; EGLConfig config = 0; EGLint num_configs = 0; EGLContext ctx = 0; /* Create OpenGL ES 2.0 or backwards-compatible context. */ static const EGLint config_attribs[] = { EGL_RED_SIZE, EGL_DONT_CARE, EGL_GREEN_SIZE, EGL_DONT_CARE, EGL_BLUE_SIZE, EGL_DONT_CARE, EGL_ALPHA_SIZE, EGL_DONT_CARE, EGL_DEPTH_SIZE, EGL_DONT_CARE, EGL_STENCIL_SIZE, EGL_DONT_CARE, EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT | EGL_OPENGL_ES3_BIT_KHR, EGL_NONE, }; static const EGLint context_attribs[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE, }; ok = eglChooseConfig(dpy, config_attribs, &config, 1, &num_configs); if (!ok || !config || num_configs == 0) { EGLint egl_error = eglGetError(); piglit_loge("failed to get EGLConfig: %s(0x%x)", piglit_get_egl_error_name(egl_error), egl_error); result = PIGLIT_SKIP; goto error; } ok = piglit_egl_bind_api(EGL_OPENGL_ES_API); if (!ok) { piglit_loge("failed to bind EGL_OPENGL_ES_API"); result = PIGLIT_FAIL; goto error; } ctx = eglCreateContext(dpy, config, EGL_NO_CONTEXT, context_attribs); if (!ctx) { EGLint egl_error = eglGetError(); piglit_loge("failed to create EGLContext: %s(0x%x)", piglit_get_egl_error_name(egl_error), egl_error); result = PIGLIT_FAIL; goto error; } ok = eglMakeCurrent(dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, ctx); if (!ok) { /* Skip, don't fail. Assume the context doesn't support * GL_OES_surfaceless_context or equivalent. */ piglit_loge("failed to make context current without surface"); result = PIGLIT_SKIP; goto error; } piglit_dispatch_default_init(PIGLIT_DISPATCH_ES2); /* From the EGL_KHR_fence_sync spec: * * Each client API which supports fence commands indicates this * support in the form of a client API extension. If the * GL_OES_EGL_sync extension is supported by OpenGL ES (either * version 1.x or 2.0), a fence sync object may be created when the * currently bound API is OpenGL ES. */ if (!piglit_is_extension_supported("GL_OES_EGL_sync")) { piglit_loge("context does not support GL_OES_EGL_sync; " "skipping test"); result = PIGLIT_SKIP; goto error; } *out_ctx = ctx; return result; error: if (ctx) { eglMakeCurrent(dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); eglDestroyContext(dpy, ctx); } return result; }
static void try_debug_flag(EGLenum context_api, EGLenum context_bit) { GLint actual_flags = 0; piglit_dispatch_api dispatch_api; EGLint attribs[64]; int i = 0; if (!EGL_KHR_create_context_setup(context_bit)) piglit_report_result(PIGLIT_SKIP); if (!piglit_egl_bind_api(context_api)) piglit_report_result(PIGLIT_SKIP); attribs[i++] = EGL_CONTEXT_FLAGS_KHR; attribs[i++] = EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR; switch (context_bit) { case EGL_OPENGL_BIT: break; case EGL_OPENGL_ES_BIT: attribs[i++] = EGL_CONTEXT_MAJOR_VERSION_KHR; attribs[i++] = 1; break; case EGL_OPENGL_ES2_BIT: attribs[i++] = EGL_CONTEXT_MAJOR_VERSION_KHR; attribs[i++] = 2; break; case EGL_OPENGL_ES3_BIT_KHR: attribs[i++] = EGL_CONTEXT_MAJOR_VERSION_KHR; attribs[i++] = 3; break; default: assert(0); break; } attribs[i++] = EGL_NONE; ctx = eglCreateContext(egl_dpy, cfg, EGL_NO_CONTEXT, attribs); if (!ctx) { if (piglit_check_egl_error(EGL_BAD_MATCH)) { piglit_report_result(PIGLIT_SKIP); } else { piglit_report_result(PIGLIT_FAIL); } } if (!eglMakeCurrent(egl_dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, ctx)) { fprintf(stderr, "eglMakeCurrent() failed\n"); piglit_report_result(PIGLIT_FAIL); } switch (context_bit) { case EGL_OPENGL_BIT: dispatch_api = PIGLIT_DISPATCH_GL; break; case EGL_OPENGL_ES_BIT: /* Piglit doesn't yet have ES1 dispatch, so just initialize * with ES2 dispatch. This should be safe because the only * GL functions called by this test are glGetString() and * glGetIntegerv(). */ dispatch_api = PIGLIT_DISPATCH_ES2; break; case EGL_OPENGL_ES2_BIT: case EGL_OPENGL_ES3_BIT_KHR: dispatch_api = PIGLIT_DISPATCH_ES2; break; default: dispatch_api = 0; assert(0); break; } piglit_dispatch_default_init(dispatch_api); switch (context_bit) { case EGL_OPENGL_BIT: if (piglit_get_gl_version() < 31 && !piglit_is_extension_supported("GL_KHR_debug")) { fprintf(stderr, "In OpenGL, either OpenGL 3.1 or " "GL_KHR_debug is required to query " "GL_CONTEXT_FLAGS\n"); piglit_report_result(PIGLIT_SKIP); } break; case EGL_OPENGL_ES_BIT: case EGL_OPENGL_ES2_BIT: case EGL_OPENGL_ES3_BIT_KHR: if (!piglit_is_extension_supported("GL_KHR_debug")) { fprintf(stderr, "In OpenGL ES, GL_KHR_debug is " "required to query GL_CONTEXT_FLAGS\n"); piglit_report_result(PIGLIT_SKIP); } break; default: assert(0); break; } 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); } eglDestroyContext(egl_dpy, ctx); EGL_KHR_create_context_teardown(); piglit_report_result(PIGLIT_PASS); }