static gboolean clutter_backend_wayland_create_context (ClutterBackend *backend, GError **error) { ClutterBackendWayland *backend_wayland = CLUTTER_BACKEND_WAYLAND (backend); const gchar *egl_extensions = NULL; gboolean status; int retry_cookie; gboolean try_fallback; GError *try_error = NULL; if (backend_wayland->egl_context != EGL_NO_CONTEXT) return TRUE; #if defined(HAVE_COGL_GL) eglBindAPI (EGL_OPENGL_API); #else eglBindAPI (EGL_OPENGL_ES_API); #endif egl_extensions = eglQueryString (backend_wayland->edpy, EGL_EXTENSIONS); if (!_cogl_check_extension (_COGL_SURFACELESS_EXTENSION, egl_extensions)) { g_debug("Could not find the " _COGL_SURFACELESS_EXTENSION " extension; falling back to binding a dummy surface"); if (!make_dummy_surface(backend_wayland)) { g_set_error (error, CLUTTER_INIT_ERROR, CLUTTER_INIT_ERROR_BACKEND, "Could not create dummy surface"); return FALSE; } } else { backend_wayland->egl_config = NULL; backend_wayland->egl_surface = EGL_NO_SURFACE; } retry_cookie = 0; while (!(status = try_create_context (backend, retry_cookie, &try_fallback, &try_error)) && try_fallback) { g_warning ("Failed to create context: %s\nWill try fallback...", try_error->message); g_error_free (try_error); try_error = NULL; retry_cookie++; } if (!status) g_propagate_error (error, try_error); return status; }
static gboolean create_context (CoglDisplay *display, GError **error) { CoglDisplayEGL *egl_display = display->winsys; /* Note: we don't just rely on eglChooseConfig to correctly * report that the driver doesn't support a stencil buffer * because we've seen PVR drivers that claim stencil buffer * support according to the EGLConfig but then later fail * when trying to create a context with such a config. */ if (try_create_context (display, TRUE, error)) { egl_display->stencil_disabled = FALSE; return TRUE; } else { g_clear_error (error); cleanup_context (display); egl_display->stencil_disabled = TRUE; return try_create_context (display, FALSE, error); } }
static bool _cg_winsys_display_setup(cg_display_t *display, cg_error_t **error) { cg_display_egl_t *egl_display; cg_renderer_t *renderer = display->renderer; cg_renderer_egl_t *egl_renderer = renderer->winsys; c_return_val_if_fail(display->winsys == NULL, false); egl_display = c_slice_new0(cg_display_egl_t); display->winsys = egl_display; #ifdef CG_HAS_WAYLAND_EGL_SERVER_SUPPORT if (display->wayland_compositor_display) { struct wl_display *wayland_display = display->wayland_compositor_display; cg_renderer_egl_t *egl_renderer = display->renderer->winsys; if (egl_renderer->pf_eglBindWaylandDisplay) egl_renderer->pf_eglBindWaylandDisplay(egl_renderer->edpy, wayland_display); } #endif if (egl_renderer->platform_vtable->display_setup && !egl_renderer->platform_vtable->display_setup(display, error)) goto error; if (!try_create_context(display, error)) goto error; egl_display->found_egl_config = true; return true; error: _cg_winsys_display_destroy(display); return false; }
static CoglBool _cogl_winsys_display_setup (CoglDisplay *display, CoglError **error) { CoglDisplayEGL *egl_display; CoglRenderer *renderer = display->renderer; CoglRendererEGL *egl_renderer = renderer->winsys; _COGL_RETURN_VAL_IF_FAIL (display->winsys == NULL, FALSE); egl_display = g_slice_new0 (CoglDisplayEGL); display->winsys = egl_display; #ifdef COGL_HAS_WAYLAND_EGL_SERVER_SUPPORT if (display->wayland_compositor_display) { struct wl_display *wayland_display = display->wayland_compositor_display; CoglRendererEGL *egl_renderer = display->renderer->winsys; egl_renderer->pf_eglBindWaylandDisplay (egl_renderer->edpy, wayland_display); } #endif if (egl_renderer->platform_vtable->display_setup && !egl_renderer->platform_vtable->display_setup (display, error)) goto error; if (!try_create_context (display, error)) goto error; egl_display->found_egl_config = TRUE; return TRUE; error: _cogl_winsys_display_destroy (display); return FALSE; }