egl_dri2 x11: Workaround device_name xcb-dri2 bug
authorBenjamin Franzke <benjaminfranzke@googlemail.com>
Wed, 2 Mar 2011 20:23:04 +0000 (21:23 +0100)
committerBenjamin Franzke <benjaminfranzke@googlemail.com>
Wed, 2 Mar 2011 19:41:38 +0000 (20:41 +0100)
This commit is basically a copy-over of the fix
Chia-I Wu's commited to wayland:
   http://cgit.freedesktop.org/wayland/wayland-demos/commit/?id=1b6c0ed95
   "Workaround an xcb-dri2 bug.
    xcb_dri2_connect_device_name generated by xcb-proto 1.6 is broken.
    It only works when the length of the driver name is a multiple of 4."

configure.ac
src/egl/drivers/dri2/platform_x11.c

index 9fa5eeea18699de04442a164bc850229e3681cac..d33ca301f965c7378420ba59603d8bd0a1d9c773 100644 (file)
@@ -1162,6 +1162,9 @@ if test "x$enable_egl" = xyes; then
                 if test "$have_libudev" = yes; then
                     DEFINES="$DEFINES -DHAVE_LIBUDEV"
                 fi
+                # workaround a bug in xcb-dri2 generated by xcb-proto 1.6
+                AC_CHECK_LIB(xcb-dri2, xcb_dri2_connect_alignment_pad, [],
+                          [DEFINES="$DEFINES -DXCB_DRI2_CONNECT_DEVICE_NAME_BROKEN"])
             fi
        fi
 
index c7bdfa628765c04c016290788a639d0be9270e3d..b3e60b8a1153f8227503e402555d854aebc99ce4 100644 (file)
@@ -478,6 +478,7 @@ dri2_connect(struct dri2_egl_display *dri2_dpy)
    xcb_dri2_connect_cookie_t connect_cookie;
    xcb_generic_error_t *error;
    xcb_screen_iterator_t s;
+   char *driver_name, *device_name;
 
    xcb_prefetch_extension_data (dri2_dpy->conn, &xcb_xfixes_id);
    xcb_prefetch_extension_data (dri2_dpy->conn, &xcb_dri2_id);
@@ -524,14 +525,21 @@ dri2_connect(struct dri2_egl_display *dri2_dpy)
       return EGL_FALSE;
    }
 
-   dri2_dpy->device_name =
-      dri2_strndup(xcb_dri2_connect_device_name (connect),
-                  xcb_dri2_connect_device_name_length (connect));
-
+   driver_name = xcb_dri2_connect_driver_name (connect);
    dri2_dpy->driver_name =
-      dri2_strndup(xcb_dri2_connect_driver_name (connect),
+      dri2_strndup(driver_name,
                   xcb_dri2_connect_driver_name_length (connect));
 
+#if XCB_DRI2_CONNECT_DEVICE_NAME_BROKEN
+   device_name = driver_name + ((connect->driver_name_length + 3) & ~3);
+#else
+   device_name = xcb_dri2_connect_device_name (connect);
+#endif
+
+   dri2_dpy->device_name =
+      dri2_strndup(device_name,
+                  xcb_dri2_connect_device_name_length (connect));
+
    if (dri2_dpy->device_name == NULL || dri2_dpy->driver_name == NULL) {
       free(dri2_dpy->device_name);
       free(dri2_dpy->driver_name);