summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2015-02-16 21:37:35 +0000
committerChris Wilson <chris@chris-wilson.co.uk>2015-02-16 21:48:41 +0000
commit127aae5a72a69df325fed0b63d345e81583d5ca1 (patch)
tree95575c4a65356e9ddf576b98415bb91b7ef6ea0e /tools
parent53c435c6cd74fcd06e3f0d393295798f5af864c0 (diff)
tools/intel-virtual-output: Check for DRI3 more carefully
Using xcb, we cannot simply call xcb_dri3_query_version() without it terminating the connection if DRI3 is not enabled on the target display. Oops. Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=89172 Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Diffstat (limited to 'tools')
-rw-r--r--tools/virtual.c19
1 files changed, 18 insertions, 1 deletions
diff --git a/tools/virtual.c b/tools/virtual.c
index 8e2b4a22..3bcd0576 100644
--- a/tools/virtual.c
+++ b/tools/virtual.c
@@ -218,6 +218,13 @@ static inline XRRScreenResources *_XRRGetScreenResourcesCurrent(Display *dpy, Wi
static int _x_error_occurred;
static int
+_io_error_handler(Display *display)
+{
+ fprintf(stderr, "XIO error on display %s\n", DisplayString(display));
+ abort();
+}
+
+static int
_check_error_handler(Display *display,
XErrorEvent *event)
{
@@ -320,6 +327,7 @@ can_use_shm(Display *dpy,
#include <X11/Xlib-xcb.h>
#include <X11/xshmfence.h>
#include <xcb/xcb.h>
+#include <xcb/xcbext.h>
#include <xcb/dri3.h>
#include <xcb/sync.h>
static Pixmap dri3_create_pixmap(Display *dpy,
@@ -357,6 +365,7 @@ static int dri3_query_version(Display *dpy, int *major, int *minor)
{
xcb_connection_t *c = XGetXCBConnection(dpy);
xcb_dri3_query_version_reply_t *reply;
+ xcb_generic_error_t *error;
*major = *minor = -1;
@@ -364,7 +373,8 @@ static int dri3_query_version(Display *dpy, int *major, int *minor)
xcb_dri3_query_version(c,
XCB_DRI3_MAJOR_VERSION,
XCB_DRI3_MINOR_VERSION),
- NULL);
+ &error);
+ free(error);
if (reply == NULL)
return -1;
@@ -377,8 +387,14 @@ static int dri3_query_version(Display *dpy, int *major, int *minor)
static int dri3_exists(Display *dpy)
{
+ xcb_extension_t dri3 = { "DRI3", 0 };
+ const xcb_query_extension_reply_t *ext;
int major, minor;
+ ext = xcb_get_extension_data(XGetXCBConnection(dpy), &dri3);
+ if (ext == NULL || !ext->present)
+ return 0;
+
if (dri3_query_version(dpy, &major, &minor) < 0)
return 0;
@@ -3228,6 +3244,7 @@ int main(int argc, char **argv)
return -ret;
XSetErrorHandler(_check_error_handler);
+ XSetIOErrorHandler(_io_error_handler);
ret = add_fd(&ctx, display_open(&ctx, src_name));
if (ret) {