void piglit_wfl_framework_teardown(struct piglit_wfl_framework *wfl_fw) { waffle_window_destroy(wfl_fw->window); waffle_context_destroy(wfl_fw->context); waffle_config_destroy(wfl_fw->config); waffle_display_disconnect(wfl_fw->display); piglit_gl_framework_teardown(&wfl_fw->gl_fw); }
static bool make_context_current_singlepass(struct piglit_wfl_framework *wfl_fw, const struct piglit_gl_test_config *test_config, enum context_flavor flavor, const int32_t partial_config_attrib_list[]) { bool ok; int32_t *attrib_list = NULL; char ctx_desc[1024]; assert(wfl_fw->config == NULL); assert(wfl_fw->context == NULL); assert(wfl_fw->window == NULL); parse_test_config(test_config, flavor, ctx_desc, sizeof(ctx_desc), partial_config_attrib_list, &attrib_list); assert(attrib_list); wfl_fw->config = waffle_config_choose(wfl_fw->display, attrib_list); free(attrib_list); if (!wfl_fw->config) { wfl_log_error("waffle_config_choose"); fprintf(stderr, "piglit: error: Failed to create " "waffle_config for %s\n", ctx_desc); goto fail; } wfl_fw->context = waffle_context_create(wfl_fw->config, NULL); if (!wfl_fw->context) { wfl_log_error("waffle_context_create"); fprintf(stderr, "piglit: error: Failed to create " "waffle_context for %s\n", ctx_desc); goto fail; } wfl_fw->window = wfl_checked_window_create(wfl_fw->config, test_config->window_width, test_config->window_height); wfl_checked_make_current(wfl_fw->display, wfl_fw->window, wfl_fw->context); #ifdef PIGLIT_USE_OPENGL piglit_dispatch_default_init(PIGLIT_DISPATCH_GL); #elif defined(PIGLIT_USE_OPENGL_ES1) piglit_dispatch_default_init(PIGLIT_DISPATCH_ES1); #elif defined(PIGLIT_USE_OPENGL_ES2) || defined(PIGLIT_USE_OPENGL_ES3) piglit_dispatch_default_init(PIGLIT_DISPATCH_ES2); #else # error #endif ok = check_gl_version(test_config, flavor, ctx_desc); if (!ok) goto fail; ok = special_case_gl31(wfl_fw, test_config, flavor, ctx_desc, partial_config_attrib_list); if (!ok) goto fail; return true; fail: waffle_make_current(wfl_fw->display, NULL, NULL); waffle_window_destroy(wfl_fw->window); waffle_context_destroy(wfl_fw->context); waffle_config_destroy(wfl_fw->config); wfl_fw->window = NULL; wfl_fw->context = NULL; wfl_fw->config = NULL; piglit_gl_reinitialize_extensions(); return false; }
/** * \brief Handle requests for OpenGL 3.1 profiles. * * Strictly speaking, an OpenGL 3.1 context has no profile. (See the * EGL_KHR_create_context spec for the ugly details [1]). If the user does * request a specific OpenGL 3.1 profile, though, then let's do what the user * wants. * * If the user requests a OpenGL 3.1 Core Context, and the returned context is * exactly an OpenGL 3.1 context but it exposes GL_ARB_compatibility, then * fallback to requesting an OpenGL 3.2 Core Context because, if context * creation succeeds, then Waffle guarantees that an OpenGL 3.2 Context will * have the requested profile. Likewise for OpenGL 3.1 Compatibility Contexts. * * [1] http://www.khronos.org/registry/egl/extensions/KHR/EGL_KHR_create_context.txt */ static bool special_case_gl31(struct piglit_wfl_framework *wfl_fw, const struct piglit_gl_test_config *test_config, enum context_flavor flavor, const char *context_description, const int32_t partial_config_attrib_list[]) { int requested_gl_version, actual_gl_version; bool has_core_profile; struct piglit_gl_test_config fallback_config = *test_config; const char *error_verb = NULL; switch (flavor) { case CONTEXT_GL_CORE: requested_gl_version = test_config->supports_gl_core_version; fallback_config.supports_gl_core_version = 32; error_verb = "exposes"; break; case CONTEXT_GL_COMPAT: requested_gl_version = test_config->supports_gl_compat_version; fallback_config.supports_gl_compat_version = 32; error_verb = "lacks"; break; case CONTEXT_GL_ES: return true; default: assert(false); return false; } if (requested_gl_version < 31) { /* For context versions < 3.1, the GLX, EGL, and CGL specs * promise that the returned context will have the * compatibility profile. So Piglit has no need to check the * profile here. */ assert(flavor == CONTEXT_GL_COMPAT); return true; } actual_gl_version = piglit_get_gl_version(); assert(actual_gl_version >= 31); if (actual_gl_version >= 32) { /* For context versions >= 3.2, the GLX, EGL, and CGL specs * promise that the returned context will have the requested * profile. So Piglit has no need to check the profile here. */ piglit_logd("Requested an %s, and received a matching " "%d.%d context\n", context_description, actual_gl_version / 10, actual_gl_version % 10); return true; } has_core_profile = !piglit_is_extension_supported("GL_ARB_compatibility"); if (flavor == CONTEXT_GL_CORE && has_core_profile) { return true; } else if (flavor == CONTEXT_GL_COMPAT && !has_core_profile) { return true; } piglit_logd("Requested an %s, and the returned context is exactly a 3.1 " "context. But it has the wrong profile because it %s the " "GL_ARB_compatibility extension. Fallback to requesting a " "3.2 context, which is guaranteed to have the correct " "profile if context creation succeeds.", context_description, error_verb); waffle_make_current(wfl_fw->display, NULL, NULL); waffle_window_destroy(wfl_fw->window); waffle_context_destroy(wfl_fw->context); waffle_config_destroy(wfl_fw->config); wfl_fw->window = NULL; wfl_fw->context = NULL; wfl_fw->config = NULL; return make_context_current_singlepass( wfl_fw, &fallback_config, flavor, partial_config_attrib_list); }
~WaffleVisual() { if (this->config != NULL) { waffle_config_destroy(this->config); this->config = NULL; } }