summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEmmanuel Gil Peyrot <linkmauve@linkmauve.fr>2021-03-21 20:02:08 +0000
committerEmmanuel Gil Peyrot <linkmauve@linkmauve.fr>2021-03-21 20:37:04 +0000
commitaced6030eed169f9c5df2fe9748cb10d8f4cd2cb (patch)
tree507eb1c766c5b397ce20dc597782050d7944afd9
parent1a3f2acb9529396d7f26fe93bc5bd31fbc11cf93 (diff)
downloadgtk+-aced6030eed169f9c5df2fe9748cb10d8f4cd2cb.tar.gz
gdkglcontext-wayland: Fallback to GLESĀ 2.0 after legacy failed
This lets the NGL backend be selected instead of the Cairo backend on devices which expose both GL and GLES, but have better support of GLES. Tested on a PinePhone.
-rw-r--r--gdk/wayland/gdkglcontext-wayland.c46
1 files changed, 40 insertions, 6 deletions
diff --git a/gdk/wayland/gdkglcontext-wayland.c b/gdk/wayland/gdkglcontext-wayland.c
index 1667117e7f..9e2572f5be 100644
--- a/gdk/wayland/gdkglcontext-wayland.c
+++ b/gdk/wayland/gdkglcontext-wayland.c
@@ -126,14 +126,48 @@ gdk_wayland_gl_context_realize (GdkGLContext *context,
: EGL_NO_CONTEXT,
context_attribs);
+ /* If context creation failed without the ES bit, let's try again with it */
+ if (ctx == NULL)
+ {
+ i = 0;
+ context_attribs[i++] = EGL_CONTEXT_MAJOR_VERSION;
+ context_attribs[i++] = 2;
+ context_attribs[i++] = EGL_CONTEXT_MINOR_VERSION;
+ context_attribs[i++] = 0;
+ context_attribs[i++] = EGL_CONTEXT_FLAGS_KHR;
+ context_attribs[i++] = flags & ~EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR;
+ context_attribs[i++] = EGL_NONE;
+ g_assert (i < N_EGL_ATTRS);
+
+ eglBindAPI (EGL_OPENGL_ES_API);
+
+ legacy_bit = FALSE;
+ use_es = TRUE;
+
+ GDK_DISPLAY_NOTE (display, OPENGL,
+ g_message ("eglCreateContext failed, switching to OpenGLĀ ES"));
+ ctx = eglCreateContext (display_wayland->egl_display,
+ context_wayland->egl_config,
+ share != NULL ? GDK_WAYLAND_GL_CONTEXT (share)->egl_context
+ : shared_data_context != NULL ? GDK_WAYLAND_GL_CONTEXT (shared_data_context)->egl_context
+ : EGL_NO_CONTEXT,
+ context_attribs);
+ }
+
/* If context creation failed without the legacy bit, let's try again with it */
- if (ctx == NULL && !legacy_bit)
+ if (ctx == NULL)
{
- /* Ensure that re-ordering does not break the offsets */
- g_assert (context_attribs[0] == EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR);
- context_attribs[1] = EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT_KHR;
- context_attribs[3] = 3;
- context_attribs[5] = 0;
+ i = 0;
+ context_attribs[i++] = EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR;
+ context_attribs[i++] = EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT_KHR;
+ context_attribs[i++] = EGL_CONTEXT_MAJOR_VERSION;
+ context_attribs[i++] = 3;
+ context_attribs[i++] = EGL_CONTEXT_MINOR_VERSION;
+ context_attribs[i++] = 0;
+ context_attribs[i++] = EGL_CONTEXT_FLAGS_KHR;
+ context_attribs[i++] = flags & ~EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR;
+ context_attribs[i++] = EGL_NONE;
+ g_assert (i < N_EGL_ATTRS);
eglBindAPI (EGL_OPENGL_API);