mirror of
https://github.com/brl/mutter.git
synced 2025-01-12 04:34:40 +00:00
wayland: don't require the surfaceless extensions
Just create a one-pixel dummy surface for eglMakeCurrent().
This commit is contained in:
parent
ffd7197dd6
commit
7e4a8fd907
@ -275,6 +275,31 @@ clutter_backend_wayland_post_parse (ClutterBackend *backend,
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
make_dummy_surface (ClutterBackendWayland *backend_wayland)
|
||||||
|
{
|
||||||
|
static const EGLint attrs[] = {
|
||||||
|
EGL_WIDTH, 1,
|
||||||
|
EGL_HEIGHT, 1,
|
||||||
|
EGL_NONE };
|
||||||
|
EGLint num_configs;
|
||||||
|
|
||||||
|
eglGetConfigs(backend_wayland->edpy,
|
||||||
|
&backend_wayland->egl_config, 1, &num_configs);
|
||||||
|
if (num_configs < 1)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
backend_wayland->egl_surface =
|
||||||
|
eglCreatePbufferSurface(backend_wayland->edpy,
|
||||||
|
backend_wayland->egl_config,
|
||||||
|
attrs);
|
||||||
|
|
||||||
|
if (backend_wayland->egl_surface == EGL_NO_SURFACE)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
#if defined(HAVE_COGL_GLES2)
|
#if defined(HAVE_COGL_GLES2)
|
||||||
#define _COGL_GLES_VERSION 2
|
#define _COGL_GLES_VERSION 2
|
||||||
#elif defined(HAVE_COGL_GLES)
|
#elif defined(HAVE_COGL_GLES)
|
||||||
@ -289,11 +314,6 @@ try_create_context (ClutterBackend *backend,
|
|||||||
{
|
{
|
||||||
ClutterBackendWayland *backend_wayland = CLUTTER_BACKEND_WAYLAND (backend);
|
ClutterBackendWayland *backend_wayland = CLUTTER_BACKEND_WAYLAND (backend);
|
||||||
const char *error_message;
|
const char *error_message;
|
||||||
#if defined(HAVE_COGL_GL)
|
|
||||||
eglBindAPI (EGL_OPENGL_API);
|
|
||||||
#else
|
|
||||||
eglBindAPI (EGL_OPENGL_ES_API);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (backend_wayland->egl_context == EGL_NO_CONTEXT)
|
if (backend_wayland->egl_context == EGL_NO_CONTEXT)
|
||||||
{
|
{
|
||||||
@ -306,7 +326,7 @@ try_create_context (ClutterBackend *backend,
|
|||||||
|
|
||||||
backend_wayland->egl_context =
|
backend_wayland->egl_context =
|
||||||
eglCreateContext (backend_wayland->edpy,
|
eglCreateContext (backend_wayland->edpy,
|
||||||
NULL,
|
backend_wayland->egl_config,
|
||||||
EGL_NO_CONTEXT,
|
EGL_NO_CONTEXT,
|
||||||
attribs);
|
attribs);
|
||||||
if (backend_wayland->egl_context == EGL_NO_CONTEXT)
|
if (backend_wayland->egl_context == EGL_NO_CONTEXT)
|
||||||
@ -319,13 +339,13 @@ try_create_context (ClutterBackend *backend,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!eglMakeCurrent (backend_wayland->edpy,
|
if (!eglMakeCurrent (backend_wayland->edpy,
|
||||||
EGL_NO_SURFACE,
|
backend_wayland->egl_surface,
|
||||||
EGL_NO_SURFACE,
|
backend_wayland->egl_surface,
|
||||||
backend_wayland->egl_context))
|
backend_wayland->egl_context))
|
||||||
{
|
{
|
||||||
g_set_error (error, CLUTTER_INIT_ERROR,
|
g_set_error (error, CLUTTER_INIT_ERROR,
|
||||||
CLUTTER_INIT_ERROR_BACKEND,
|
CLUTTER_INIT_ERROR_BACKEND,
|
||||||
"Unable to MakeCurrent with NULL drawables");
|
"Unable to MakeCurrent");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -363,15 +383,29 @@ clutter_backend_wayland_create_context (ClutterBackend *backend,
|
|||||||
if (backend_wayland->egl_context != EGL_NO_CONTEXT)
|
if (backend_wayland->egl_context != EGL_NO_CONTEXT)
|
||||||
return TRUE;
|
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);
|
egl_extensions = eglQueryString (backend_wayland->edpy, EGL_EXTENSIONS);
|
||||||
|
|
||||||
if (!_cogl_check_extension (_COGL_SURFACELESS_EXTENSION, egl_extensions))
|
if (!_cogl_check_extension (_COGL_SURFACELESS_EXTENSION, egl_extensions))
|
||||||
{
|
{
|
||||||
g_set_error (error, CLUTTER_INIT_ERROR,
|
g_debug("Could not find the " _COGL_SURFACELESS_EXTENSION
|
||||||
CLUTTER_INIT_ERROR_BACKEND,
|
" extension; falling back to binding a dummy surface");
|
||||||
"Wayland clients require the "
|
if (!make_dummy_surface(backend_wayland))
|
||||||
_COGL_SURFACELESS_EXTENSION " extension");
|
{
|
||||||
return FALSE;
|
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;
|
retry_cookie = 0;
|
||||||
|
@ -57,6 +57,7 @@ struct _ClutterBackendWayland
|
|||||||
EGLDisplay edpy;
|
EGLDisplay edpy;
|
||||||
EGLContext egl_context;
|
EGLContext egl_context;
|
||||||
EGLConfig egl_config;
|
EGLConfig egl_config;
|
||||||
|
EGLSurface egl_surface;
|
||||||
|
|
||||||
gint egl_version_major;
|
gint egl_version_major;
|
||||||
gint egl_version_minor;
|
gint egl_version_minor;
|
||||||
|
Loading…
Reference in New Issue
Block a user