Index | Thread | Search

From:
Jonathan Gray <jsg@jsg.id.au>
Subject:
Re: fail early in mesa/eglInitialize when on wayland
To:
Landry Breuil <landry@openbsd.org>
Cc:
tech@openbsd.org
Date:
Mon, 3 Nov 2025 16:24:08 +1100

Download raw body.

Thread
On Sat, Nov 01, 2025 at 06:33:19PM +0100, Landry Breuil wrote:
> hi,
> 
> currently mesa isnt built with wayland support (which is a topic in itself).
> When running on wayland, starting any gtk+4 app will crash early when
> initializing, because we end up taking a libxcb codepath, eg run gtk+4-demo:
> 
> Program terminated with signal SIGSEGV, Segmentation fault.
> #0  0x00000316d2ae48aa in XGetXCBConnection () from /usr/X11R6/lib/libX11-xcb.so.2.0
> [Current thread is 1 (process 381892)]
> (gdb) bt
> #0  0x00000316d2ae48aa in XGetXCBConnection () from /usr/X11R6/lib/libX11-xcb.so.2.0
> #1  0x00000316849f7ff4 in dri2_get_xcb_connection (disp=0x31632dbc5a0, dri2_dpy=0x3161541bcc0) at /usr/xenocara/lib/mesa/mk/libEGL/../../src/egl/drivers/dri2/platform_x11.c:1720
> #2  0x00000316849f7ad8 in dri2_initialize_x11_dri3 (disp=0x31632dbc5a0) at /usr/xenocara/lib/mesa/mk/libEGL/../../src/egl/drivers/dri2/platform_x11.c:1926
> #3  dri2_initialize_x11 (disp=0x31632dbc5a0) at /usr/xenocara/lib/mesa/mk/libEGL/../../src/egl/drivers/dri2/platform_x11.c:2095
> #4  0x00000316849e3ee5 in dri2_initialize (disp=0x31632dbc5a0) at /usr/xenocara/lib/mesa/mk/libEGL/../../src/egl/drivers/dri2/egl_dri2.c:891
> #5  0x00000316849e79b1 in eglInitialize (dpy=<optimized out>, major=0x7eac247c3468, minor=0x7eac247c346c) at /usr/xenocara/lib/mesa/mk/libEGL/../../src/egl/main/eglapi.c:705
> #6  0x000003163bf7675e in gdk_display_init_egl () from /usr/local/lib/libgtk-4.so.5.5
> #7  0x000003163bf0c073 in gdk_wayland_display_init_gl () from /usr/local/lib/libgtk-4.so.5.5
> #8  0x000003163bf76399 in gdk_display_prepare_gl () from /usr/local/lib/libgtk-4.so.5.5
> #9  0x000003163bfe1217 in get_renderer_for_gl () from /usr/local/lib/libgtk-4.so.5.5
> #10 0x000003163bfe0880 in gsk_renderer_new_for_surface_full () from /usr/local/lib/libgtk-4.so.5.5
> #11 0x000003163bd2b543 in gtk_window_realize () from /usr/local/lib/libgtk-4.so.5.5
> 
> it can also be seen with /usr/local/lib/firefox/glxtest -w, which also calls
> eglIinitialize:
> https://searchfox.org/firefox-main/source/toolkit/xre/glxtest/glxtest.cpp#612
> 
> looking at the code, display->Platform is X11, since wayland support isnt
> builtin:
> 
> #4  0x00000316849e3ee5 in dri2_initialize (disp=0x31632dbc5a0) at /usr/xenocara/lib/mesa/mk/libEGL/../../src/egl/drivers/dri2/egl_dri2.c:891
> (gdb) p disp->Platform
> $3 = _EGL_PLATFORM_X11

Do you see this because XGetXCBConnection() is passed a NULL argument?

Can't tell from the trace.

Index: lib/mesa/src/egl/drivers/dri2/platform_x11.c
===================================================================
RCS file: /cvs/xenocara/lib/mesa/src/egl/drivers/dri2/platform_x11.c,v
diff -u -p -r1.21 platform_x11.c
--- lib/mesa/src/egl/drivers/dri2/platform_x11.c	5 Jun 2025 14:19:04 -0000	1.21
+++ lib/mesa/src/egl/drivers/dri2/platform_x11.c	3 Nov 2025 05:18:08 -0000
@@ -1717,6 +1717,10 @@ dri2_get_xcb_connection(_EGLDisplay *dis
       screen = dri2_find_screen_for_display(disp, screen);
    } else if (disp->Platform == _EGL_PLATFORM_X11) {
       Display *dpy = disp->PlatformDisplay;
+      if (dpy == NULL) {
+         msg = "failed to get platform display";
+         goto disconnect;
+      }
       dri2_dpy->conn = XGetXCBConnection(dpy);
       screen = DefaultScreen(dpy);
    } else {