Package: release.debian.org Severity: normal Tags: bullseye User: release.debian....@packages.debian.org Usertags: pu X-Debbugs-Cc: gtk+...@packages.debian.org, Dominique Martinet <dominique.marti...@atmark-techno.com> Control: affects -1 + src:gtk+3.0
[ Reason ] User request via #1020937: make it possible to run GTK 3 apps in native Wayland on some proprietary GLES-only graphics drivers (Raspberry Pi video core, iMX/Vivante). [ Impact ] If not accepted, GTK 3 apps on the affected hardware/driver combination can only be run if forced to use X11. [ Tests ] The proposed change has been in testing and unstable since November as part of version 3.24.34-4. The version proposed for bullseye is a straightforward cherry-pick. For the affected GLES-only graphics drivers, the user requesting the change has confirmed that a functionally equivalent prerelease package has the desired effect. For ordinary "desktop GL" drivers, I used the same prerelease package on a bullseye/NVIDIA system (with NVIDIA proprietary drivers) for several weeks without incident, and my partner's bullseye/Intel/Mesa system now has the proposed package, again without obvious regressions. [ Risks ] It's a minimal change, cherry-picked from newer GTK 3 without modification. The affected code runs whenever GL is initialized for a window, which should mean that any regressions would be very obvious, since many (all?) GTK 3 apps use GL. The version of this change in GTK 4 is much more intrusive and did not seem suitable for backporting. [ Checklist ] [x] *all* changes are documented in the d/changelog [x] I reviewed all changes and I approve them [x] attach debdiff against the package in (old)stable [x] the issue is verified as fixed in unstable [ Changes ] All changes are part of solving #1020937.
diffstat for gtk+3.0-3.24.24 gtk+3.0-3.24.24 debian/changelog | 12 + debian/patches/gdk_wayland_display_init_gl-use-GLES-API-if-required.patch | 82 ++++++++++ debian/patches/series | 1 gdk/wayland/gdkglcontext-wayland.c | 12 - gdk/wayland/gdkglcontext-wayland.h | 3 5 files changed, 105 insertions(+), 5 deletions(-) diff -Nru gtk+3.0-3.24.24/debian/changelog gtk+3.0-3.24.24/debian/changelog --- gtk+3.0-3.24.24/debian/changelog 2022-03-10 10:30:09.000000000 +0000 +++ gtk+3.0-3.24.24/debian/changelog 2023-02-24 19:07:01.000000000 +0000 @@ -1,3 +1,15 @@ +gtk+3.0 (3.24.24-4+deb11u3) bullseye; urgency=medium + + * d/p/gdk_wayland_display_init_gl-use-GLES-API-if-required.patch: + Apply patch from 3.24.35 to fix Wayland + EGL on GLES-only platforms. + Previously, GTK assumed that EGL could use the OpenGL API everywhere, + but some proprietary drivers like those for Raspberry Pi and Vivante + only support OpenGL ES. Allow use of OpenGL ES to be forced via + environment variable GDK_GL=gles. + Thanks to Dominique Martinet (Closes: #1020937) + + -- Simon McVittie <s...@debian.org> Fri, 24 Feb 2023 19:07:01 +0000 + gtk+3.0 (3.24.24-4+deb11u2) bullseye; urgency=medium [ Jian-Hong Pan ] diff -Nru gtk+3.0-3.24.24/debian/patches/gdk_wayland_display_init_gl-use-GLES-API-if-required.patch gtk+3.0-3.24.24/debian/patches/gdk_wayland_display_init_gl-use-GLES-API-if-required.patch --- gtk+3.0-3.24.24/debian/patches/gdk_wayland_display_init_gl-use-GLES-API-if-required.patch 1970-01-01 01:00:00.000000000 +0100 +++ gtk+3.0-3.24.24/debian/patches/gdk_wayland_display_init_gl-use-GLES-API-if-required.patch 2023-02-24 19:07:01.000000000 +0000 @@ -0,0 +1,82 @@ +From: Dominique Martinet <dominique.marti...@atmark-techno.com> +Date: Wed, 28 Sep 2022 14:18:31 +0900 +Subject: 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 482845b02705 ("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. + +Bug: https://gitlab.gnome.org/GNOME/gtk/-/issues/3028 +Bug-Debian: https://bugs.debian.org/1020937 +Forwarded: https://gitlab.gnome.org/GNOME/gtk/-/merge_requests/5062 +Applied-upstream: 3.24.35, commit:0e5fe45ea20cce074a128911949dbedf4f8265bf +--- + gdk/wayland/gdkglcontext-wayland.c | 12 ++++++++---- + gdk/wayland/gdkglcontext-wayland.h | 3 ++- + 2 files changed, 10 insertions(+), 5 deletions(-) + +diff --git a/gdk/wayland/gdkglcontext-wayland.c b/gdk/wayland/gdkglcontext-wayland.c +index a221025..296e5e0 100644 +--- a/gdk/wayland/gdkglcontext-wayland.c ++++ b/gdk/wayland/gdkglcontext-wayland.c +@@ -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, +diff --git a/gdk/wayland/gdkglcontext-wayland.h b/gdk/wayland/gdkglcontext-wayland.h +index bd2bb88..88a319e 100644 +--- a/gdk/wayland/gdkglcontext-wayland.h ++++ b/gdk/wayland/gdkglcontext-wayland.h +@@ -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, diff -Nru gtk+3.0-3.24.24/debian/patches/series gtk+3.0-3.24.24/debian/patches/series --- gtk+3.0-3.24.24/debian/patches/series 2022-03-10 10:30:09.000000000 +0000 +++ gtk+3.0-3.24.24/debian/patches/series 2023-02-24 19:07:01.000000000 +0000 @@ -26,3 +26,4 @@ printing-Show-all-Avahi-advertised-printers.patch Don-t-try-to-create-local-cups-printers-before-CUPS-2.2.patch debian/cups-Use-the-same-name-mangling-as-Debian-11-s-cups-brows.patch +gdk_wayland_display_init_gl-use-GLES-API-if-required.patch diff -Nru gtk+3.0-3.24.24/gdk/wayland/gdkglcontext-wayland.c gtk+3.0-3.24.24/gdk/wayland/gdkglcontext-wayland.c --- gtk+3.0-3.24.24/gdk/wayland/gdkglcontext-wayland.c 2020-12-02 22:21:55.000000000 +0000 +++ gtk+3.0-3.24.24/gdk/wayland/gdkglcontext-wayland.c 2023-02-25 11:30:29.000000000 +0000 @@ -309,11 +309,13 @@ } 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 @@ 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 @@ 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, diff -Nru gtk+3.0-3.24.24/gdk/wayland/gdkglcontext-wayland.h gtk+3.0-3.24.24/gdk/wayland/gdkglcontext-wayland.h --- gtk+3.0-3.24.24/gdk/wayland/gdkglcontext-wayland.h 2020-12-02 22:21:55.000000000 +0000 +++ gtk+3.0-3.24.24/gdk/wayland/gdkglcontext-wayland.h 2023-02-25 11:30:29.000000000 +0000 @@ -47,7 +47,8 @@ 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,