gdk_wayland_display_init_gl: use GLES API if required

gdk_wayland_gl_context_realize properly checks for GLES and uses
eglBindAPI with the proper API, but before that init is always called
with regular GL interface which is not implemented for many embedded
devices.

This was fixed in GTK 4 with commit 482845b027 ("wayland: Remove
initial GL API bind"), but that commit cannot easily be applied because
the current version queries some GL properties during init so we would
need to backport more for it to be applicable.

This patch takes the minimal approach of initializing GLES context,
allowing the gtk3 demo OpenGL test (and real applications) to work
when GDK_GL=gles is set.

Fixes https://gitlab.gnome.org/GNOME/gtk/-/issues/3028
This commit is contained in:
Dominique Martinet
2022-09-28 14:18:31 +09:00
parent 812b3930d0
commit 0e5fe45ea2
2 changed files with 10 additions and 5 deletions

View File

@@ -309,11 +309,13 @@ gdk_wayland_get_display (GdkWaylandDisplay *display_wayland)
}
gboolean
gdk_wayland_display_init_gl (GdkDisplay *display)
gdk_wayland_display_init_gl (GdkDisplay *display,
GdkGLContext *share)
{
GdkWaylandDisplay *display_wayland = GDK_WAYLAND_DISPLAY (display);
EGLint major, minor;
EGLDisplay dpy;
gboolean use_es;
if (display_wayland->have_egl)
return TRUE;
@@ -326,8 +328,10 @@ gdk_wayland_display_init_gl (GdkDisplay *display)
if (!eglInitialize (dpy, &major, &minor))
return FALSE;
if (!eglBindAPI (EGL_OPENGL_API))
return FALSE;
use_es = (_gdk_gl_flags & GDK_GL_GLES) != 0 ||
(share != NULL && gdk_gl_context_get_use_es (share));
if (!eglBindAPI (use_es ? EGL_OPENGL_ES_API : EGL_OPENGL_API))
return FALSE;
display_wayland->egl_display = dpy;
display_wayland->egl_major_version = major;
@@ -461,7 +465,7 @@ gdk_wayland_window_create_gl_context (GdkWindow *window,
GdkWaylandGLContext *context;
EGLConfig config;
if (!gdk_wayland_display_init_gl (display))
if (!gdk_wayland_display_init_gl (display, share))
{
g_set_error_literal (error, GDK_GL_ERROR,
GDK_GL_ERROR_NOT_AVAILABLE,

View File

@@ -47,7 +47,8 @@ struct _GdkWaylandGLContextClass
GdkGLContextClass parent_class;
};
gboolean gdk_wayland_display_init_gl (GdkDisplay *display);
gboolean gdk_wayland_display_init_gl (GdkDisplay *display,
GdkGLContext *share);
GdkGLContext * gdk_wayland_window_create_gl_context (GdkWindow *window,
gboolean attach,
GdkGLContext *share,