x11: Use EGL instead of GLX when drawing using GLES

When running as a X11 CM we shouldn't use the GLX winsys when the
driver doesn't support it, i.e. OpenGL ES drivers.

https://bugzilla.gnome.org/show_bug.cgi?id=771636
This commit is contained in:
Jonas Ådahl 2016-09-23 11:49:10 +08:00
parent 5d3e7d6ffd
commit ac813d5285
5 changed files with 26 additions and 11 deletions

View File

@ -42,7 +42,7 @@
#include <cogl/winsys/cogl-winsys-egl-private.h> #include <cogl/winsys/cogl-winsys-egl-private.h>
#include <cogl/winsys/cogl-winsys-private.h> #include <cogl/winsys/cogl-winsys-private.h>
void cogl_renderer_set_custom_winsys (CoglRenderer *renderer, void cogl_renderer_set_custom_winsys (CoglRenderer *renderer,
CoglWinsysVtableGetter winsys_vtable_getter); CoglCustomWinsysVtableGetter winsys_vtable_getter);
#endif /* __COGL_MUTTER_H___ */ #endif /* __COGL_MUTTER_H___ */

View File

@ -39,12 +39,13 @@
#include "cogl-texture-driver.h" #include "cogl-texture-driver.h"
#include "cogl-context.h" #include "cogl-context.h"
#include "cogl-closure-list-private.h" #include "cogl-closure-list-private.h"
#include "cogl-mutter.h"
#ifdef COGL_HAS_XLIB_SUPPORT #ifdef COGL_HAS_XLIB_SUPPORT
#include <X11/Xlib.h> #include <X11/Xlib.h>
#endif #endif
typedef const CoglWinsysVtable *(*CoglCustomWinsysVtableGetter) (CoglRenderer *renderer);
struct _CoglRenderer struct _CoglRenderer
{ {
CoglObject _parent; CoglObject _parent;
@ -53,7 +54,7 @@ struct _CoglRenderer
const CoglDriverVtable *driver_vtable; const CoglDriverVtable *driver_vtable;
const CoglTextureDriver *texture_driver; const CoglTextureDriver *texture_driver;
const CoglWinsysVtable *winsys_vtable; const CoglWinsysVtable *winsys_vtable;
CoglWinsysVtableGetter custom_winsys_vtable_getter; CoglCustomWinsysVtableGetter custom_winsys_vtable_getter;
CoglWinsysID winsys_id_override; CoglWinsysID winsys_id_override;
GList *constraints; GList *constraints;

View File

@ -565,8 +565,8 @@ _cogl_renderer_choose_driver (CoglRenderer *renderer,
/* Final connection API */ /* Final connection API */
void void
cogl_renderer_set_custom_winsys (CoglRenderer *renderer, cogl_renderer_set_custom_winsys (CoglRenderer *renderer,
CoglWinsysVtableGetter winsys_vtable_getter) CoglCustomWinsysVtableGetter winsys_vtable_getter)
{ {
renderer->custom_winsys_vtable_getter = winsys_vtable_getter; renderer->custom_winsys_vtable_getter = winsys_vtable_getter;
} }
@ -575,10 +575,11 @@ static CoglBool
connect_custom_winsys (CoglRenderer *renderer, connect_custom_winsys (CoglRenderer *renderer,
CoglError **error) CoglError **error)
{ {
const CoglWinsysVtable *winsys = renderer->custom_winsys_vtable_getter(); const CoglWinsysVtable *winsys;
CoglError *tmp_error = NULL; CoglError *tmp_error = NULL;
GString *error_message; GString *error_message;
winsys = renderer->custom_winsys_vtable_getter (renderer);
renderer->winsys_vtable = winsys; renderer->winsys_vtable = winsys;
error_message = g_string_new (""); error_message = g_string_new ("");

View File

@ -1563,7 +1563,7 @@ meta_renderer_native_set_legacy_view_size (MetaRendererNative *renderer_native,
} }
static const CoglWinsysVtable * static const CoglWinsysVtable *
get_native_cogl_winsys_vtable (void) get_native_cogl_winsys_vtable (CoglRenderer *cogl_renderer)
{ {
static gboolean vtable_inited = FALSE; static gboolean vtable_inited = FALSE;
static CoglWinsysVtable vtable; static CoglWinsysVtable vtable;

View File

@ -48,12 +48,25 @@ struct _MetaRendererX11
G_DEFINE_TYPE (MetaRendererX11, meta_renderer_x11, META_TYPE_RENDERER) G_DEFINE_TYPE (MetaRendererX11, meta_renderer_x11, META_TYPE_RENDERER)
static const CoglWinsysVtable * static const CoglWinsysVtable *
get_x11_cogl_winsys_vtable (void) get_x11_cogl_winsys_vtable (CoglRenderer *renderer)
{ {
if (meta_is_wayland_compositor ()) if (meta_is_wayland_compositor ())
return _cogl_winsys_egl_xlib_get_vtable (); return _cogl_winsys_egl_xlib_get_vtable ();
else
return _cogl_winsys_glx_get_vtable (); switch (renderer->driver)
{
case COGL_DRIVER_GLES1:
case COGL_DRIVER_GLES2:
return _cogl_winsys_egl_xlib_get_vtable ();
case COGL_DRIVER_GL:
case COGL_DRIVER_GL3:
return _cogl_winsys_glx_get_vtable ();
case COGL_DRIVER_ANY:
case COGL_DRIVER_NOP:
case COGL_DRIVER_WEBGL:
break;
}
g_assert_not_reached ();
} }
static CoglRenderer * static CoglRenderer *