summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam Jackson <ajax@redhat.com>2016-10-11 15:12:54 -0400
committerAdam Jackson <ajax@redhat.com>2016-10-11 15:12:54 -0400
commita93c5b05594ea095bdbc1bcdcc2ca79a27bdbff3 (patch)
tree505840bfe10fa2a9ecff81c4f76d150c91cfa999
parentDrop an unused file (diff)
downloadgtk3-classic-build-gtk3-a93c5b05594ea095bdbc1bcdcc2ca79a27bdbff3.tar.gz
gtk3-classic-build-gtk3-a93c5b05594ea095bdbc1bcdcc2ca79a27bdbff3.tar.bz2
gtk3-classic-build-gtk3-a93c5b05594ea095bdbc1bcdcc2ca79a27bdbff3.zip
Prefer eglGetPlatformDisplay to eglGetDisplay
-rw-r--r--0001-Fix-some-EGLDisplay-abuse.patch52
-rw-r--r--0002-Use-eglGetPlatformDisplay-EXT-if-available.patch130
-rw-r--r--gtk3.spec11
3 files changed, 192 insertions, 1 deletions
diff --git a/0001-Fix-some-EGLDisplay-abuse.patch b/0001-Fix-some-EGLDisplay-abuse.patch
new file mode 100644
index 0000000..5071d8c
--- /dev/null
+++ b/0001-Fix-some-EGLDisplay-abuse.patch
@@ -0,0 +1,52 @@
+From dc0e3f9d949723856dde43b7ee3a8aa87b320c88 Mon Sep 17 00:00:00 2001
+From: Adam Jackson <ajax@redhat.com>
+Date: Mon, 10 Oct 2016 14:10:38 -0400
+Subject: [PATCH 1/2] Fix some EGLDisplay * abuse
+
+EGLDisplays are already opaque pointers, and eglGetDisplay returns an
+EGLDisplay not a pointer to one.
+
+Signed-off-by: Adam Jackson <ajax@redhat.com>
+---
+ gdk/wayland/gdkglcontext-wayland.c | 2 +-
+ gtk/inspector/general.c | 4 ++--
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/gdk/wayland/gdkglcontext-wayland.c b/gdk/wayland/gdkglcontext-wayland.c
+index 7733188..ae1354e 100644
+--- a/gdk/wayland/gdkglcontext-wayland.c
++++ b/gdk/wayland/gdkglcontext-wayland.c
+@@ -279,7 +279,7 @@ gdk_wayland_display_init_gl (GdkDisplay *display)
+ {
+ GdkWaylandDisplay *display_wayland = GDK_WAYLAND_DISPLAY (display);
+ EGLint major, minor;
+- EGLDisplay *dpy;
++ EGLDisplay dpy;
+
+ if (display_wayland->have_egl)
+ return TRUE;
+diff --git a/gtk/inspector/general.c b/gtk/inspector/general.c
+index 31dd6aa..77d0a76 100644
+--- a/gtk/inspector/general.c
++++ b/gtk/inspector/general.c
+@@ -209,7 +209,7 @@ append_glx_extension_row (GtkInspectorGeneral *gen,
+ #ifdef GDK_WINDOWING_WAYLAND
+ static void
+ append_egl_extension_row (GtkInspectorGeneral *gen,
+- EGLDisplay *dpy,
++ EGLDisplay dpy,
+ const gchar *ext)
+ {
+ add_check_row (gen, GTK_LIST_BOX (gen->priv->gl_box), ext, epoxy_has_egl_extension (dpy, ext), 0);
+@@ -250,7 +250,7 @@ init_gl (GtkInspectorGeneral *gen)
+ if (GDK_IS_WAYLAND_DISPLAY (gdk_display_get_default ()))
+ {
+ GdkDisplay *display = gdk_display_get_default ();
+- EGLDisplay *dpy;
++ EGLDisplay dpy;
+ EGLint major, minor;
+ gchar *version;
+
+--
+2.9.3
+
diff --git a/0002-Use-eglGetPlatformDisplay-EXT-if-available.patch b/0002-Use-eglGetPlatformDisplay-EXT-if-available.patch
new file mode 100644
index 0000000..c337f7c
--- /dev/null
+++ b/0002-Use-eglGetPlatformDisplay-EXT-if-available.patch
@@ -0,0 +1,130 @@
+From 1a9c35461dc93979dbc45a201a6670eb049bb285 Mon Sep 17 00:00:00 2001
+From: Adam Jackson <ajax@redhat.com>
+Date: Mon, 10 Oct 2016 14:12:40 -0400
+Subject: [PATCH 2/2] Use eglGetPlatformDisplay{,EXT} if available
+
+Calling eglGetDisplay forces libEGL to guess what kind of pointer you
+passed it. Different EGL libraries will do different things here, and in
+particular glvnd will do something different than Mesa. Since we do have
+an API that allows us to explicitly type the display, use it.
+
+The explicit call to eglGetProcAddress is working around a bug in
+libepoxy 1.3, which does not understand the EGL concept of client
+extensions. Since it does not, the normal epoxy resolver for
+eglGetPlatformDisplayEXT would not find any provider for that entry
+point, and crash when you attempted to call it.
+
+Signed-off-by: Adam Jackson <ajax@redhat.com>
+---
+ gdk/wayland/gdkglcontext-wayland.c | 37 ++++++++++++++++++++++++++++++++++++-
+ gtk/inspector/general.c | 32 +++++++++++++++++++++++++++++++-
+ 2 files changed, 67 insertions(+), 2 deletions(-)
+
+diff --git a/gdk/wayland/gdkglcontext-wayland.c b/gdk/wayland/gdkglcontext-wayland.c
+index ae1354e..6573688 100644
+--- a/gdk/wayland/gdkglcontext-wayland.c
++++ b/gdk/wayland/gdkglcontext-wayland.c
+@@ -274,6 +274,40 @@ gdk_wayland_gl_context_init (GdkWaylandGLContext *self)
+ {
+ }
+
++static EGLDisplay
++gdk_wayland_get_display (GdkWaylandDisplay *display_wayland)
++{
++ EGLDisplay dpy = NULL;
++
++ if (epoxy_has_egl_extension (NULL, "EGL_KHR_platform_base"))
++ {
++ PFNEGLGETPLATFORMDISPLAYPROC getPlatformDisplay =
++ (void *) eglGetProcAddress ("eglGetPlatformDisplay");
++
++ if (getPlatformDisplay)
++ dpy = getPlatformDisplay (EGL_PLATFORM_WAYLAND_EXT,
++ display_wayland->wl_display,
++ NULL);
++ if (dpy)
++ return dpy;
++ }
++
++ if (epoxy_has_egl_extension (NULL, "EGL_EXT_platform_base"))
++ {
++ PFNEGLGETPLATFORMDISPLAYEXTPROC getPlatformDisplay =
++ (void *) eglGetProcAddress ("eglGetPlatformDisplayEXT");
++
++ if (getPlatformDisplay)
++ dpy = getPlatformDisplay (EGL_PLATFORM_WAYLAND_EXT,
++ display_wayland->wl_display,
++ NULL);
++ if (dpy)
++ return dpy;
++ }
++
++ return eglGetDisplay ((EGLNativeDisplayType) display_wayland->wl_display);
++}
++
+ gboolean
+ gdk_wayland_display_init_gl (GdkDisplay *display)
+ {
+@@ -284,7 +318,8 @@ gdk_wayland_display_init_gl (GdkDisplay *display)
+ if (display_wayland->have_egl)
+ return TRUE;
+
+- dpy = eglGetDisplay ((EGLNativeDisplayType)display_wayland->wl_display);
++ dpy = gdk_wayland_get_display (display_wayland);
++
+ if (dpy == NULL)
+ return FALSE;
+
+diff --git a/gtk/inspector/general.c b/gtk/inspector/general.c
+index 77d0a76..f32f7fe 100644
+--- a/gtk/inspector/general.c
++++ b/gtk/inspector/general.c
+@@ -214,6 +214,36 @@ append_egl_extension_row (GtkInspectorGeneral *gen,
+ {
+ add_check_row (gen, GTK_LIST_BOX (gen->priv->gl_box), ext, epoxy_has_egl_extension (dpy, ext), 0);
+ }
++
++static EGLDisplay
++wayland_get_display (struct wl_display *wl_dpy)
++{
++ EGLDisplay dpy = NULL;
++
++ if (epoxy_has_egl_extension (NULL, "EGL_KHR_platform_base"))
++ {
++ PFNEGLGETPLATFORMDISPLAYPROC getPlatformDisplay =
++ (void *) eglGetProcAddress ("eglGetPlatformDisplay");
++
++ if (getPlatformDisplay)
++ dpy = getPlatformDisplay (EGL_PLATFORM_WAYLAND_EXT, wl_dpy, NULL);
++ if (dpy)
++ return dpy;
++ }
++
++ if (epoxy_has_egl_extension (NULL, "EGL_EXT_platform_base"))
++ {
++ PFNEGLGETPLATFORMDISPLAYEXTPROC getPlatformDisplay =
++ (void *) eglGetProcAddress ("eglGetPlatformDisplayEXT");
++
++ if (getPlatformDisplay)
++ dpy = getPlatformDisplay (EGL_PLATFORM_WAYLAND_EXT, wl_dpy, NULL);
++ if (dpy)
++ return dpy;
++ }
++
++ return eglGetDisplay ((EGLNativeDisplayType) wl_dpy);
++}
+ #endif
+
+
+@@ -254,7 +284,7 @@ init_gl (GtkInspectorGeneral *gen)
+ EGLint major, minor;
+ gchar *version;
+
+- dpy = eglGetDisplay ((EGLNativeDisplayType)gdk_wayland_display_get_wl_display (display));
++ dpy = wayland_get_display (gdk_wayland_display_get_wl_display (display));
+
+ if (!eglInitialize (dpy, &major, &minor))
+ return;
+--
+2.9.3
+
diff --git a/gtk3.spec b/gtk3.spec
index 2b0977e..868d9a8 100644
--- a/gtk3.spec
+++ b/gtk3.spec
@@ -18,13 +18,17 @@
Name: gtk3
Version: 3.22.1
-Release: 1%{?dist}
+Release: 2%{?dist}
Summary: The GIMP ToolKit (GTK+), a library for creating GUIs for X
License: LGPLv2+
URL: http://www.gtk.org
Source0: http://download.gnome.org/sources/gtk+/3.22/gtk+-%{version}.tar.xz
+# backport, will be in 3.22.2
+Patch1: 0001-Fix-some-EGLDisplay-abuse.patch
+Patch2: 0002-Use-eglGetPlatformDisplay-EXT-if-available.patch
+
BuildRequires: pkgconfig(atk) >= %{atk_version}
BuildRequires: pkgconfig(atk-bridge-2.0)
BuildRequires: pkgconfig(glib-2.0) >= %{glib2_version}
@@ -157,6 +161,8 @@ the functionality of the installed %{name} package.
%prep
%setup -q -n gtk+-%{version}
+%patch1 -p1
+%patch2 -p1
%build
@@ -330,6 +336,9 @@ gtk-query-immodules-3.0-%{__isa_bits} --update-cache
%{_datadir}/installed-tests
%changelog
+* Tue Oct 11 2016 Adam Jackson <ajax@redhat.com> - 3.22.1-2
+- Prefer eglGetPlatformDisplay to eglGetDisplay
+
* Sat Oct 01 2016 David King <amigadave@amigadave.com> - 3.22.1-1
- Update to 3.22.1
bgstack15