summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBenjamin Franzke <[email protected]>2011-03-02 21:23:04 +0100
committerBenjamin Franzke <[email protected]>2011-03-02 20:41:38 +0100
commit4ca075ac4f047141d5e5ef865991650e0ac488e4 (patch)
tree7c8c8ff9ed3ca3efd7a4accd4cc8ade79bd1c227 /src
parent648a16d079282a33289d9b1d91108a665bd84547 (diff)
egl_dri2 x11: Workaround device_name xcb-dri2 bug
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."
Diffstat (limited to 'src')
-rw-r--r--src/egl/drivers/dri2/platform_x11.c18
1 files changed, 13 insertions, 5 deletions
diff --git a/src/egl/drivers/dri2/platform_x11.c b/src/egl/drivers/dri2/platform_x11.c
index c7bdfa62876..b3e60b8a115 100644
--- a/src/egl/drivers/dri2/platform_x11.c
+++ b/src/egl/drivers/dri2/platform_x11.c
@@ -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);