xf86-video-intel: 3 commits - src/sna/sna_accel.c tools/virtual.c

Chris Wilson ickle at kemper.freedesktop.org
Sun Jun 29 07:30:10 PDT 2014


 src/sna/sna_accel.c |    4 
 tools/virtual.c     |  369 ++++++++++++++++++++++++++++------------------------
 2 files changed, 206 insertions(+), 167 deletions(-)

New commits:
commit a8b0ba0ed5f27e0d671b650d6f4bfe2fd86a0f3f
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sun Jun 29 15:25:19 2014 +0100

    intel-virtual-output: Cleanup singleton on failure
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/tools/virtual.c b/tools/virtual.c
index ad96a9b..5bc050b 100644
--- a/tools/virtual.c
+++ b/tools/virtual.c
@@ -3205,7 +3205,8 @@ int main(int argc, char **argv)
 	if (ret) {
 		fprintf(stderr, "Unable to connect to \"%s\".\n", src_name ?: getenv("DISPLAY") ?:
 			"<unspecified>, set either the DISPLAY environment variable or pass -d <display name> on the commandline");
-		return -ret;
+		ret = -ret;
+		goto out;
 	}
 
 	if (singleton) {
@@ -3214,8 +3215,10 @@ int main(int argc, char **argv)
 			DBG(X11, ("%s: pinging singleton\n", DisplayString(ctx.display->dpy)));
 			ret = first_display_send_command(&ctx, 2000, "P");
 			if (ret) {
-				if (ret != -ETIME)
-					return -ret;
+				if (ret != -ETIME) {
+					ret = -ret;
+					goto out;
+				}
 				DBG(X11, ("No reply from singleton; assuming control\n"));
 			} else {
 				DBG(X11, ("%s: singleton active, sending open commands\n", DisplayString(ctx.display->dpy)));
@@ -3247,21 +3250,25 @@ int main(int argc, char **argv)
 					} else
 						open++;
 				}
-				return open || !fail ? 0 : ECONNREFUSED;
+				ret = open || !fail ? 0 : ECONNREFUSED;
+				goto out;
 			}
 		}
 		ret = first_display_register_as_singleton(&ctx);
 		if (ret)
-			return ret;
+			goto out;
 	}
 
 	ret = display_init_damage(ctx.display);
-	if (ret)
-		return ret;
+	if (ret) {
+		context_cleanup(&ctx);
+		goto out;
+	}
 
 	if ((ctx.display->rr_event | ctx.display->rr_error) == 0) {
 		fprintf(stderr, "RandR extension not supported by %s\n", DisplayString(ctx.display->dpy));
-		return EINVAL;
+		ret = EINVAL;
+		goto out;
 	}
 	XRRSelectInput(ctx.display->dpy, ctx.display->root, RRScreenChangeNotifyMask);
 	XFixesSelectCursorInput(ctx.display->dpy, ctx.display->root, XFixesDisplayCursorNotifyMask);
@@ -3269,7 +3276,8 @@ int main(int argc, char **argv)
 	ret = add_fd(&ctx, record_mouse(&ctx));
 	if (ret) {
 		fprintf(stderr, "XTEST extension not supported by display \"%s\"\n", DisplayString(ctx.display->dpy));
-		return -ret;
+		ret = -ret;
+		goto out;
 	}
 
 	open = fail = 0;
@@ -3299,11 +3307,15 @@ int main(int argc, char **argv)
 		} else
 			open++;
 	}
-	if (open == 0)
-		return fail ? ECONNREFUSED : 0;
+	if (open == 0) {
+		ret = fail ? ECONNREFUSED : 0;
+		goto out;
+	}
 
-	if (daemonize && daemon(0, 0))
-		return EINVAL;
+	if (daemonize && daemon(0, 0)) {
+		ret = EINVAL;
+		goto out;
+	}
 
 	signal(SIGHUP, signal_handler);
 	signal(SIGINT, signal_handler);
@@ -3445,6 +3457,8 @@ int main(int argc, char **argv)
 		}
 	}
 
+	ret = 0;
+out:
 	context_cleanup(&ctx);
-	return 0;
+	return ret;
 }
commit 81889664851e3a2218d1ac5d39ebd2bd3b6a4954
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sun Jun 29 08:29:36 2014 +0100

    intel-virtual-output: Convert debugging messages to verbosity
    
    Original patch by main.haarp:
    "A verbose switch is quite useful for debugging, it shouldn't require
    editing and recompilation to gain more useful output. I added it."
    
    Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=80664
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/tools/virtual.c b/tools/virtual.c
index a4263ae..ad96a9b 100644
--- a/tools/virtual.c
+++ b/tools/virtual.c
@@ -65,17 +65,19 @@
 #include <fcntl.h>
 #include <assert.h>
 
-#if 0
-#define DBG(x) printf x
-#define EXTRA_DBG 1
-#else
-#define DBG(x)
-#define EXTRA_DBG 0
-#endif
-
 #define FORCE_FULL_REDRAW 0
 #define FORCE_16BIT_XFER 0
 
+#define DBG(v, x) if (verbose & v) printf x
+static int verbose;
+#define X11 0x1
+#define XRR 0x1
+#define TIMER 0x4
+#define DRAW 0x8
+#define DAMAGE 0x10
+#define CURSOR 0x20
+#define POLL 0x40
+
 struct display {
 	Display *dpy;
 	struct clone *clone;
@@ -216,7 +218,7 @@ static int
 _check_error_handler(Display     *display,
 		     XErrorEvent *event)
 {
-	DBG(("X11 error from display %s, serial=%ld, error=%d, req=%d.%d\n",
+	DBG(X11, ("X11 error from display %s, serial=%ld, error=%d, req=%d.%d\n",
 	     DisplayString(display),
 	     event->serial,
 	     event->error_code,
@@ -504,7 +506,7 @@ static void context_enable_timer(struct context *ctx)
 {
 	uint64_t count;
 
-	DBG(("%s timer active? %d\n", __func__, ctx->timer_active));
+	DBG(TIMER, ("%s timer active? %d\n", __func__, ctx->timer_active));
 
 	if (ctx->timer_active)
 		return;
@@ -536,7 +538,7 @@ static int add_fd(struct context *ctx, int fd)
 
 static void display_mark_flush(struct display *display)
 {
-	DBG(("%s mark flush (flush=%d)\n",
+	DBG(DRAW, ("%s mark flush (flush=%d)\n",
 	     DisplayString(display->dpy), display->flush));
 
 	if (display->flush)
@@ -601,14 +603,14 @@ static int disable_crtc(Display *dpy, XRRScreenResources *res, RRCrtc crtc)
 			return 0;
 
 		if (XRRSetPanning(dpy, res, crtc, memset(&panning, 0, sizeof(panning))) != Success) {
-			DBG(("%s failed to clear panning on CRTC:%ld\n", DisplayString(dpy), (long)crtc));
-			if (EXTRA_DBG) {
+			DBG(XRR, ("%s failed to clear panning on CRTC:%ld\n", DisplayString(dpy), (long)crtc));
+			if (verbose) {
 				XRRCrtcInfo *c;
 				XRRPanning *p;
 
 				c = XRRGetCrtcInfo(dpy, res, crtc);
 				if (c) {
-					DBG(("%s CRTC:%ld x=%d, y=%d, rotation=%d, mode=%ld\n",
+					DBG(XRR, ("%s CRTC:%ld x=%d, y=%d, rotation=%d, mode=%ld\n",
 					     DisplayString(dpy), (long)crtc,
 					     c->x, c->y, c->rotation, c->mode));
 					XRRFreeCrtcInfo(c);
@@ -616,7 +618,7 @@ static int disable_crtc(Display *dpy, XRRScreenResources *res, RRCrtc crtc)
 
 				p = XRRGetPanning(dpy, res, crtc);
 				if (p) {
-					DBG(("%s CRTC:%ld panning (%d, %d)x(%d, %d), tracking (%d, %d)x(%d, %d), border (%d, %d),(%d, %d)\n",
+					DBG(XRR, ("%s CRTC:%ld panning (%d, %d)x(%d, %d), tracking (%d, %d)x(%d, %d), border (%d, %d),(%d, %d)\n",
 					     DisplayString(dpy), (long)crtc,
 					     p->left, p->top, p->width, p->height,
 					     p->track_left, p->track_top, p->track_width, p->track_height,
@@ -648,7 +650,7 @@ static int clone_update_modes__randr(struct clone *clone)
 	if (from_info == NULL)
 		goto err;
 
-	DBG(("%s(%s-%s <- %s-%s): timestamp %ld (last %ld)\n", __func__,
+	DBG(XRR, ("%s(%s-%s <- %s-%s): timestamp %ld (last %ld)\n", __func__,
 	     DisplayString(clone->src.dpy), clone->src.name,
 	     DisplayString(clone->dst.dpy), clone->dst.name,
 	     from_info->timestamp, clone->timestamp));
@@ -661,7 +663,7 @@ static int clone_update_modes__randr(struct clone *clone)
 	if (to_info == NULL)
 		goto err;
 
-	DBG(("%s: dst.rr_crtc=%ld, now %ld\n",
+	DBG(XRR, ("%s: dst.rr_crtc=%ld, now %ld\n",
 	     __func__, (long)clone->dst.rr_crtc, (long)from_info->crtc));
 	if (clone->dst.rr_crtc == from_info->crtc) {
 		for (i = 0; i < to_info->nmode; i++) {
@@ -671,7 +673,7 @@ static int clone_update_modes__randr(struct clone *clone)
 			if (mode == NULL)
 				break;
 
-			DBG(("%s(%s-%s): lookup mode %s\n", __func__,
+			DBG(XRR, ("%s(%s-%s): lookup mode %s\n", __func__,
 			     DisplayString(clone->src.dpy), clone->src.name,
 			     mode->name));
 
@@ -683,14 +685,14 @@ static int clone_update_modes__randr(struct clone *clone)
 				}
 			}
 			if (mode) {
-				DBG(("%s(%s-%s): unknown mode %s\n", __func__,
+				DBG(XRR, ("%s(%s-%s): unknown mode %s\n", __func__,
 				     DisplayString(clone->src.dpy), clone->src.name,
 				     mode->name));
 				break;
 			}
 		}
 		if (i == from_info->nmode && i == to_info->nmode) {
-			DBG(("%s(%s-%s): no change in output\n", __func__,
+			DBG(XRR, ("%s(%s-%s): no change in output\n", __func__,
 			     DisplayString(clone->src.dpy), clone->src.name));
 			goto done;
 		}
@@ -698,7 +700,7 @@ static int clone_update_modes__randr(struct clone *clone)
 
 	/* Disable the remote output */
 	if (from_info->crtc != clone->dst.rr_crtc) {
-		DBG(("%s(%s-%s): disabling active CRTC\n", __func__,
+		DBG(XRR, ("%s(%s-%s): disabling active CRTC\n", __func__,
 		     DisplayString(clone->dst.dpy), clone->dst.name));
 		if (disable_crtc(clone->dst.dpy, from_res, from_info->crtc)) {
 			clone->dst.rr_crtc = 0;
@@ -720,12 +722,12 @@ static int clone_update_modes__randr(struct clone *clone)
 
 	/* Clear all current UserModes on the output, including any active ones */
 	if (to_info->crtc) {
-		DBG(("%s(%s-%s): disabling active CRTC\n", __func__,
+		DBG(XRR, ("%s(%s-%s): disabling active CRTC\n", __func__,
 		     DisplayString(clone->src.dpy), clone->src.name));
 		disable_crtc(clone->src.dpy, to_res, to_info->crtc);
 	}
 	for (i = 0; i < to_info->nmode; i++) {
-		DBG(("%s(%s-%s): deleting mode %ld\n", __func__,
+		DBG(XRR, ("%s(%s-%s): deleting mode %ld\n", __func__,
 		     DisplayString(clone->src.dpy), clone->src.name, (long)to_info->modes[i]));
 		XRRDeleteOutputMode(clone->src.dpy, clone->src.rr_output, to_info->modes[i]);
 	}
@@ -754,7 +756,7 @@ static int clone_update_modes__randr(struct clone *clone)
 			old = &to_res->modes[j];
 			if (mode_equal(mode, old)) {
 				id = old->id;
-				DBG(("%s(%s-%s): reusing mode %ld: %s\n", __func__,
+				DBG(XRR, ("%s(%s-%s): reusing mode %ld: %s\n", __func__,
 				     DisplayString(clone->src.dpy), clone->src.name, id, mode->name));
 				break;
 			}
@@ -770,7 +772,7 @@ static int clone_update_modes__randr(struct clone *clone)
 			m.name = buf;
 
 			id = XRRCreateMode(clone->src.dpy, clone->src.window, &m);
-			DBG(("%s(%s-%s): adding mode %ld: %s\n", __func__,
+			DBG(XRR, ("%s(%s-%s): adding mode %ld: %s\n", __func__,
 			     DisplayString(clone->src.dpy), clone->src.name, id, mode->name));
 		}
 
@@ -818,12 +820,12 @@ static int clone_update_modes__fixed(struct clone *clone)
 
 	/* Clear all current UserModes on the output, including any active ones */
 	if (info->crtc) {
-		DBG(("%s(%s-%s): disabling active CRTC\n", __func__,
+		DBG(XRR, ("%s(%s-%s): disabling active CRTC\n", __func__,
 		     DisplayString(clone->src.dpy), clone->src.name));
 		disable_crtc(clone->src.dpy, res, info->crtc);
 	}
 	for (i = 0; i < info->nmode; i++) {
-		DBG(("%s(%s-%s): deleting mode %ld\n", __func__,
+		DBG(XRR, ("%s(%s-%s): deleting mode %ld\n", __func__,
 		     DisplayString(clone->src.dpy), clone->src.name, (long)info->modes[i]));
 		XRRDeleteOutputMode(clone->src.dpy, clone->src.rr_output, info->modes[i]);
 	}
@@ -871,7 +873,7 @@ static RROutput claim_virtual(struct display *display, char *output_name, int nc
 	RROutput rr_output = 0;
 	int i;
 
-	DBG(("%s(%d)\n", __func__, nclone));
+	DBG(X11, ("%s(%d)\n", __func__, nclone));
 	XGrabServer(dpy);
 
 	res = _XRRGetScreenResourcesCurrent(dpy, display->root);
@@ -896,7 +898,7 @@ static RROutput claim_virtual(struct display *display, char *output_name, int nc
 	}
 	XRRFreeScreenResources(res);
 
-	DBG(("%s(%s): rr_output=%ld\n", __func__, output_name, (long)rr_output));
+	DBG(XRR, ("%s(%s): rr_output=%ld\n", __func__, output_name, (long)rr_output));
 	if (rr_output == 0)
 		goto out;
 
@@ -1012,7 +1014,7 @@ static int mode_width(const XRRModeInfo *mode, Rotation rotation)
 static void output_init_xfer(struct clone *clone, struct output *output)
 {
 	if (output->pixmap == None && output->use_shm_pixmap) {
-		DBG(("%s-%s: creating shm pixmap\n", DisplayString(output->dpy), output->name));
+		DBG(DRAW, ("%s-%s: creating shm pixmap\n", DisplayString(output->dpy), output->name));
 		XSync(output->dpy, False);
 		_x_error_occurred = 0;
 
@@ -1032,7 +1034,7 @@ static void output_init_xfer(struct clone *clone, struct output *output)
 		}
 	}
 	if (output->use_render) {
-		DBG(("%s-%s: creating picture\n", DisplayString(output->dpy), output->name));
+		DBG(DRAW, ("%s-%s: creating picture\n", DisplayString(output->dpy), output->name));
 		if (output->win_picture == None)
 			output->win_picture = XRenderCreatePicture(output->dpy, output->window,
 								   output->display->root_format, 0, NULL);
@@ -1047,7 +1049,7 @@ static void output_init_xfer(struct clone *clone, struct output *output)
 	if (output->gc == None) {
 		XGCValues gcv;
 
-		DBG(("%s-%s: creating gc\n", DisplayString(output->dpy), output->name));
+		DBG(DRAW, ("%s-%s: creating gc\n", DisplayString(output->dpy), output->name));
 
 		gcv.graphics_exposures = False;
 		gcv.subwindow_mode = IncludeInferiors;
@@ -1087,7 +1089,7 @@ static int clone_init_xfer(struct clone *clone)
 	if (width == clone->width && height == clone->height)
 		return 0;
 
-	DBG(("%s-%s create xfer, %dx%d\n",
+	DBG(DRAW, ("%s-%s create xfer, %dx%d\n",
 	     DisplayString(clone->dst.dpy), clone->dst.name,
 	     width, height));
 
@@ -1123,14 +1125,14 @@ static int clone_init_xfer(struct clone *clone)
 
 		_x_error_occurred = 0;
 
-		DBG(("%s-%s create xfer, trying DRI3\n",
+		DBG(DRAW, ("%s-%s create xfer, trying DRI3\n",
 		     DisplayString(clone->dst.dpy), clone->dst.name));
 
 		fd = dri3_create_fd(clone->dst.dpy, clone->dst.window, &stride);
 		if (fd < 0)
 			goto disable_dri3;
 
-		DBG(("%s-%s create xfer, DRI3 fd=%d, stride=%d\n",
+		DBG(DRAW, ("%s-%s create xfer, DRI3 fd=%d, stride=%d\n",
 		     DisplayString(clone->dst.dpy), clone->dst.name,
 		     fd, stride));
 
@@ -1151,7 +1153,7 @@ disable_dri3:
 			dri3_fence_free(clone->src.dpy, &clone->dri3);
 			clone->dri3.xid = 0;
 
-			DBG(("%s-%s create xfer, DRI3 failed\n",
+			DBG(DRAW, ("%s-%s create xfer, DRI3 failed\n",
 			     DisplayString(clone->dst.dpy), clone->dst.name));
 		}
 	}
@@ -1160,7 +1162,7 @@ disable_dri3:
 	height = mode_height(&clone->src.mode, clone->src.rotation);
 
 	if (!clone->dri3.xid) {
-		DBG(("%s-%s create xfer, trying SHM\n",
+		DBG(DRAW, ("%s-%s create xfer, trying SHM\n",
 		     DisplayString(clone->dst.dpy), clone->dst.name));
 
 		clone->shm.shmid = shmget(IPC_PRIVATE,
@@ -1213,7 +1215,7 @@ static void clone_update(struct clone *clone)
 	if (!clone->rr_update)
 		return;
 
-	DBG(("%s-%s cloning modes\n",
+	DBG(X11, ("%s-%s cloning modes\n",
 	     DisplayString(clone->dst.dpy), clone->dst.name));
 
 	clone_update_modes__randr(clone);
@@ -1227,13 +1229,13 @@ static int context_update(struct context *ctx)
 	int context_changed = 0;
 	int i, n;
 
-	DBG(("%s\n", __func__));
+	DBG(X11, ("%s\n", __func__));
 
 	res = _XRRGetScreenResourcesCurrent(dpy, ctx->display->root);
 	if (res == NULL)
 		return 0;
 
-	DBG(("%s timestamp %ld (last %ld), config %ld (last %ld)\n",
+	DBG(XRR, ("%s timestamp %ld (last %ld), config %ld (last %ld)\n",
 	     DisplayString(dpy),
 	     res->timestamp, ctx->timestamp,
 	     res->configTimestamp, ctx->configTimestamp));
@@ -1262,7 +1264,7 @@ static int context_update(struct context *ctx)
 		if (o->crtc)
 			c = XRRGetCrtcInfo(dpy, res, o->crtc);
 		if (c) {
-			DBG(("%s-%s: (x=%d, y=%d, rotation=%d, mode=%ld) -> (x=%d, y=%d, rotation=%d, mode=%ld)\n",
+			DBG(XRR, ("%s-%s: (x=%d, y=%d, rotation=%d, mode=%ld) -> (x=%d, y=%d, rotation=%d, mode=%ld)\n",
 			     DisplayString(dpy), output->name,
 			     output->x, output->y, output->rotation, output->mode.id,
 			     c->x, c->y, c->rotation, c->mode));
@@ -1280,14 +1282,14 @@ static int context_update(struct context *ctx)
 			mode = c->mode;
 			XRRFreeCrtcInfo(c);
 		} else {
-			DBG(("%s-%s: (x=%d, y=%d, rotation=%d, mode=%ld) -> off\n",
+			DBG(XRR, ("%s-%s: (x=%d, y=%d, rotation=%d, mode=%ld) -> off\n",
 			     DisplayString(dpy), output->name,
 			     output->x, output->y, output->rotation, output->mode.id));
 		}
 		output->rr_crtc = o->crtc;
 		XRRFreeOutputInfo(o);
 
-		DBG(("%s-%s crtc changed? %d\n",
+		DBG(XRR, ("%s-%s crtc changed? %d\n",
 		     DisplayString(ctx->clones[n].dst.display->dpy), ctx->clones[n].dst.name, changed));
 
 		if (mode) {
@@ -1304,14 +1306,14 @@ static int context_update(struct context *ctx)
 			output->mode.id = 0;
 		}
 
-		DBG(("%s-%s output changed? %d\n",
+		DBG(XRR, ("%s-%s output changed? %d\n",
 		     DisplayString(ctx->clones[n].dst.display->dpy), ctx->clones[n].dst.name, changed));
 
 		context_changed |= changed;
 	}
 	XRRFreeScreenResources(res);
 
-	DBG(("%s changed? %d\n", DisplayString(dpy), context_changed));
+	DBG(XRR, ("%s changed? %d\n", DisplayString(dpy), context_changed));
 	if (!context_changed)
 		return 0;
 
@@ -1335,7 +1337,7 @@ static int context_update(struct context *ctx)
 			if (output->mode.id == 0)
 				continue;
 
-			DBG(("%s: source %s enabled (%d, %d)x(%d, %d)\n",
+			DBG(XRR, ("%s: source %s enabled (%d, %d)x(%d, %d)\n",
 			     DisplayString(clone->dst.dpy), output->name,
 			     output->x, output->y,
 			     mode_width(&output->mode, output->rotation),
@@ -1354,7 +1356,7 @@ static int context_update(struct context *ctx)
 				y2 = v;
 		}
 
-		DBG(("%s fb bounds (%d, %d)x(%d, %d)\n", DisplayString(display->dpy),
+		DBG(XRR, ("%s fb bounds (%d, %d)x(%d, %d)\n", DisplayString(display->dpy),
 		     x1, y1, x2, y2));
 
 		XGrabServer(display->dpy);
@@ -1370,7 +1372,7 @@ static int context_update(struct context *ctx)
 				if (!dst->rr_crtc)
 					continue;
 
-				DBG(("%s: disabling output '%s'\n",
+				DBG(XRR, ("%s: disabling output '%s'\n",
 				     DisplayString(display->dpy), dst->name));
 				assert(clone->dst.display == display);
 				if (disable_crtc(display->dpy, res, dst->rr_crtc)) {
@@ -1383,7 +1385,7 @@ static int context_update(struct context *ctx)
 
 		x2 -= x1;
 		y2 -= y1;
-		DBG(("%s: current size %dx%d, need %dx%d\n",
+		DBG(XRR, ("%s: current size %dx%d, need %dx%d\n",
 		     DisplayString(display->dpy),
 		     display->width, display->height,
 		     x2, y2));
@@ -1396,7 +1398,7 @@ static int context_update(struct context *ctx)
 				if (!dst->rr_crtc)
 					continue;
 
-				DBG(("%s: disabling output '%s'\n",
+				DBG(XRR, ("%s: disabling output '%s'\n",
 				     DisplayString(display->dpy), dst->name));
 				assert(clone->dst.display == display);
 				if (disable_crtc(display->dpy, res, dst->rr_crtc)) {
@@ -1405,7 +1407,7 @@ static int context_update(struct context *ctx)
 				}
 			}
 
-			DBG(("%s: XRRSetScreenSize %dx%d\n", DisplayString(display->dpy), x2, y2));
+			DBG(XRR, ("%s: XRRSetScreenSize %dx%d\n", DisplayString(display->dpy), x2, y2));
 			XRRSetScreenSize(display->dpy, display->root, x2, y2, x2 * 96 / 25.4, y2 * 96 / 25.4);
 			display->width = x2;
 			display->height = y2;
@@ -1420,7 +1422,7 @@ static int context_update(struct context *ctx)
 			RRCrtc rr_crtc;
 			Status ret;
 
-			DBG(("%s: copying configuration from %s (mode=%ld: %dx%d) to %s\n",
+			DBG(XRR, ("%s: copying configuration from %s (mode=%ld: %dx%d) to %s\n",
 			     DisplayString(display->dpy),
 			     src->name, (long)src->mode.id, src->mode.width, src->mode.height,
 			     dst->name));
@@ -1428,7 +1430,7 @@ static int context_update(struct context *ctx)
 			if (src->mode.id == 0) {
 err:
 				if (dst->rr_crtc) {
-					DBG(("%s: disabling unused output '%s'\n",
+					DBG(XRR, ("%s: disabling unused output '%s'\n",
 					     DisplayString(display->dpy), dst->name));
 					assert(clone->dst.display == display);
 					if (disable_crtc(display->dpy, res, dst->rr_crtc)) {
@@ -1467,7 +1469,7 @@ err:
 
 				id = XRRCreateMode(dst->dpy, dst->window, &m);
 				if (id) {
-					DBG(("%s: adding mode %ld: %dx%d to %s, new mode %ld\n",
+					DBG(XRR, ("%s: adding mode %ld: %dx%d to %s, new mode %ld\n",
 					     DisplayString(dst->dpy),
 					     (long)src->mode.id,
 					     src->mode.width,
@@ -1476,7 +1478,7 @@ err:
 					XRRAddOutputMode(dst->dpy, dst->rr_output, id);
 					dst->mode.id = id;
 				} else {
-					DBG(("%s: failed to find suitable mode for %s\n",
+					DBG(XRR, ("%s: failed to find suitable mode for %s\n",
 					     DisplayString(dst->dpy), dst->name));
 					goto err;
 				}
@@ -1486,7 +1488,7 @@ err:
 			if (rr_crtc) {
 				for (set = display->clone; set != clone; set = set->next) {
 					if (set->dst.rr_crtc == rr_crtc) {
-						DBG(("%s: CRTC reassigned from %s\n",
+						DBG(XRR, ("%s: CRTC reassigned from %s\n",
 						     DisplayString(dst->dpy), dst->name));
 						rr_crtc = 0;
 						break;
@@ -1496,11 +1498,11 @@ err:
 			if (rr_crtc == 0) {
 				o = XRRGetOutputInfo(dst->dpy, res, dst->rr_output);
 				for (i = 0; i < o->ncrtc; i++) {
-					DBG(("%s: checking whether CRTC:%ld is available\n",
+					DBG(XRR, ("%s: checking whether CRTC:%ld is available\n",
 					     DisplayString(dst->dpy), (long)o->crtcs[i]));
 					for (set = display->clone; set != clone; set = set->next) {
 						if (set->dst.rr_crtc == o->crtcs[i]) {
-							DBG(("%s: CRTC:%ld already assigned to %s\n",
+							DBG(XRR, ("%s: CRTC:%ld already assigned to %s\n",
 							     DisplayString(dst->dpy), (long)o->crtcs[i], set->dst.name));
 							break;
 						}
@@ -1513,34 +1515,34 @@ err:
 				XRRFreeOutputInfo(o);
 			}
 			if (rr_crtc == 0) {
-				DBG(("%s: failed to find available CRTC for %s\n",
+				DBG(XRR, ("%s: failed to find available CRTC for %s\n",
 				     DisplayString(dst->dpy), dst->name));
 				goto err;
 			}
 
-			DBG(("%s: enabling output '%s' (%d,%d)x(%d,%d), rotation %d, on CRTC:%ld, using mode %ld\n",
+			DBG(XRR, ("%s: enabling output '%s' (%d,%d)x(%d,%d), rotation %d, on CRTC:%ld, using mode %ld\n",
 			     DisplayString(dst->dpy), dst->name,
 			     dst->x, dst->y, dst->mode.width, dst->mode.height,
 			     dst->rotation, (long)rr_crtc, dst->mode.id));
 
 			ret = XRRSetPanning(dst->dpy, res, rr_crtc, memset(&panning, 0, sizeof(panning)));
-			DBG(("%s-%s: XRRSetPanning %s\n", DisplayString(dst->dpy), dst->name, ret ? "failed" : "success"));
+			DBG(XRR, ("%s-%s: XRRSetPanning %s\n", DisplayString(dst->dpy), dst->name, ret ? "failed" : "success"));
 			(void)ret;
 
 			ret = XRRSetCrtcConfig(dst->dpy, res, rr_crtc, CurrentTime,
 					       dst->x, dst->y, dst->mode.id, dst->rotation,
 					       &dst->rr_output, 1);
-			DBG(("%s-%s: XRRSetCrtcConfig %s\n", DisplayString(dst->dpy), dst->name, ret ? "failed" : "success"));
+			DBG(XRR, ("%s-%s: XRRSetCrtcConfig %s\n", DisplayString(dst->dpy), dst->name, ret ? "failed" : "success"));
 			if (ret)
 				goto err;
 
-			if (EXTRA_DBG) {
+			if (verbose & XRR) {
 				XRRCrtcInfo *c;
 				XRRPanning *p;
 
 				c = XRRGetCrtcInfo(dst->dpy, res, rr_crtc);
 				if (c) {
-					DBG(("%s-%s: x=%d, y=%d, rotation=%d, mode=%ld\n",
+					DBG(XRR, ("%s-%s: x=%d, y=%d, rotation=%d, mode=%ld\n",
 					     DisplayString(dst->dpy), dst->name,
 					     c->x, c->y, c->rotation, c->mode));
 					XRRFreeCrtcInfo(c);
@@ -1548,7 +1550,7 @@ err:
 
 				p = XRRGetPanning(dst->dpy, res, rr_crtc);
 				if (p) {
-					DBG(("%s-%s: panning (%d, %d)x(%d, %d), tracking (%d, %d)x(%d, %d), border (%d, %d),(%d, %d)\n",
+					DBG(XRR, ("%s-%s: panning (%d, %d)x(%d, %d), tracking (%d, %d)x(%d, %d), border (%d, %d),(%d, %d)\n",
 					     DisplayString(dst->dpy), dst->name,
 					     p->left, p->top, p->width, p->height,
 					     p->track_left, p->track_top, p->track_width, p->track_height,
@@ -1574,7 +1576,7 @@ ungrab:
 		if (clone->dst.rr_crtc == 0)
 			continue;
 
-		DBG(("%s-%s: added to active list\n",
+		DBG(XRR, ("%s-%s: added to active list\n",
 		     DisplayString(clone->dst.display->dpy), clone->dst.name));
 
 		clone->active = ctx->active;
@@ -1595,7 +1597,7 @@ static Cursor display_load_invisible_cursor(struct display *display)
 static Cursor display_get_visible_cursor(struct display *display)
 {
 	if (display->cursor_serial != display->cursor_image.size) {
-		DBG(("%s updating cursor\n", DisplayString(display->dpy)));
+		DBG(CURSOR, ("%s updating cursor\n", DisplayString(display->dpy)));
 
 		if (display->visible_cursor)
 			XFreeCursor(display->dpy, display->visible_cursor);
@@ -1632,7 +1634,7 @@ static void display_load_visible_cursor(struct display *display, XFixesCursorIma
 	while (n--)
 		*dst++ = *src++;
 
-	DBG(("%s marking cursor changed\n", DisplayString(display->dpy)));
+	DBG(CURSOR, ("%s marking cursor changed\n", DisplayString(display->dpy)));
 	display->cursor_moved++;
 	if (display->cursor != display->invisible_cursor) {
 		display->cursor_visible++;
@@ -1642,7 +1644,7 @@ static void display_load_visible_cursor(struct display *display, XFixesCursorIma
 
 static void display_cursor_move(struct display *display, int x, int y, int visible)
 {
-	DBG(("%s cursor moved (visible=%d, (%d, %d))\n",
+	DBG(CURSOR, ("%s cursor moved (visible=%d, (%d, %d))\n",
 	     DisplayString(display->dpy), visible, x, y));
 	display->cursor_moved++;
 	display->cursor_visible += visible;
@@ -1670,7 +1672,7 @@ static void display_flush_cursor(struct display *display)
 		y = display->cursor_y++ & 31;
 	}
 
-	DBG(("%s setting cursor position (%d, %d), visible? %d\n",
+	DBG(CURSOR, ("%s setting cursor position (%d, %d), visible? %d\n",
 	     DisplayString(display->dpy), x, y, display->cursor_visible));
 	XWarpPointer(display->dpy, None, display->root, 0, 0, 0, 0, x, y);
 
@@ -1694,7 +1696,7 @@ static void clone_move_cursor(struct clone *c, int x, int y)
 {
 	int visible;
 
-	DBG(("%s-%s moving cursor (%d, %d) [(%d, %d), (%d, %d)]\n",
+	DBG(CURSOR, ("%s-%s moving cursor (%d, %d) [(%d, %d), (%d, %d)]\n",
 	     DisplayString(c->dst.dpy), c->dst.name,
 	     x, y,
 	     c->src.x, c->src.y,
@@ -1716,7 +1718,7 @@ static int clone_output_init(struct clone *clone, struct output *output,
 	Display *dpy = display->dpy;
 	int depth;
 
-	DBG(("%s(%s, %s)\n", __func__, DisplayString(dpy), name));
+	DBG(X11, ("%s(%s, %s)\n", __func__, DisplayString(dpy), name));
 
 	output->name = strdup(name);
 	if (output->name == NULL)
@@ -1732,7 +1734,7 @@ static int clone_output_init(struct clone *clone, struct output *output,
 	output->use_shm = display->has_shm;
 	output->use_shm_pixmap = display->has_shm_pixmap;
 
-	DBG(("%s-%s use shm? %d (use shm pixmap? %d)\n",
+	DBG(X11, ("%s-%s use shm? %d (use shm pixmap? %d)\n",
 	     DisplayString(dpy), name, display->has_shm, display->has_shm_pixmap));
 
 	depth = output->use_shm && !FORCE_16BIT_XFER ? display->depth : 16;
@@ -1751,7 +1753,7 @@ static void ximage_prepare(XImage *image, int width, int height)
 
 static void get_src(struct clone *c, const XRectangle *clip)
 {
-	DBG(("%s-%s get_src(%d,%d)x(%d,%d)\n", DisplayString(c->dst.dpy), c->dst.name,
+	DBG(DRAW,("%s-%s get_src(%d,%d)x(%d,%d)\n", DisplayString(c->dst.dpy), c->dst.name,
 	     clip->x, clip->y, clip->width, clip->height));
 
 	c->image.obdata = (char *)&c->src.shm;
@@ -1798,17 +1800,17 @@ static void get_src(struct clone *c, const XRectangle *clip)
 
 static void put_dst(struct clone *c, const XRectangle *clip)
 {
-	DBG(("%s-%s put_dst(%d,%d)x(%d,%d)\n", DisplayString(c->dst.dpy), c->dst.name,
+	DBG(DRAW, ("%s-%s put_dst(%d,%d)x(%d,%d)\n", DisplayString(c->dst.dpy), c->dst.name,
 	     clip->x, clip->y, clip->width, clip->height));
 
 	c->image.obdata = (char *)&c->dst.shm;
 
 	if (c->dst.use_render) {
 		if (c->dst.use_shm_pixmap) {
-			DBG(("%s-%s using SHM pixmap composite\n",
+			DBG(DRAW, ("%s-%s using SHM pixmap composite\n",
 			     DisplayString(c->dst.dpy), c->dst.name));
 		} else if (c->dst.use_shm) {
-			DBG(("%s-%s using SHM image composite\n",
+			DBG(DRAW, ("%s-%s using SHM image composite\n",
 			     DisplayString(c->dst.dpy), c->dst.name));
 			XShmPutImage(c->dst.dpy, c->dst.pixmap, c->dst.gc, &c->image,
 				     0, 0,
@@ -1816,7 +1818,7 @@ static void put_dst(struct clone *c, const XRectangle *clip)
 				     clip->width, clip->height,
 				     False);
 		} else {
-			DBG(("%s-%s using composite\n",
+			DBG(DRAW, ("%s-%s using composite\n",
 			     DisplayString(c->dst.dpy), c->dst.name));
 			XPutImage(c->dst.dpy, c->dst.pixmap, c->dst.gc, &c->image,
 				  0, 0,
@@ -1833,7 +1835,7 @@ static void put_dst(struct clone *c, const XRectangle *clip)
 				 clip->width, clip->height);
 		c->dst.display->send |= c->dst.use_shm;
 	} else if (c->dst.pixmap) {
-		DBG(("%s-%s using SHM pixmap\n",
+		DBG(DRAW, ("%s-%s using SHM pixmap\n",
 		     DisplayString(c->dst.dpy), c->dst.name));
 		c->dst.serial = NextRequest(c->dst.dpy);
 		XCopyArea(c->dst.dpy, c->dst.pixmap, c->dst.window, c->dst.gc,
@@ -1842,7 +1844,7 @@ static void put_dst(struct clone *c, const XRectangle *clip)
 			  clip->x, clip->y);
 		c->dst.display->send = 1;
 	} else if (c->dst.use_shm) {
-		DBG(("%s-%s using SHM image\n",
+		DBG(DRAW, ("%s-%s using SHM image\n",
 		     DisplayString(c->dst.dpy), c->dst.name));
 		c->dst.serial = NextRequest(c->dst.dpy);
 		XShmPutImage(c->dst.dpy, c->dst.window, c->dst.gc, &c->image,
@@ -1851,7 +1853,7 @@ static void put_dst(struct clone *c, const XRectangle *clip)
 			     clip->width, clip->height,
 			     True);
 	} else {
-		DBG(("%s-%s using image\n",
+		DBG(DRAW, ("%s-%s using image\n",
 		     DisplayString(c->dst.dpy), c->dst.name));
 		XPutImage(c->dst.dpy, c->dst.window, c->dst.gc, &c->image,
 			  0, 0,
@@ -1865,7 +1867,7 @@ static int clone_paint(struct clone *c)
 {
 	XRectangle clip;
 
-	DBG(("%s-%s paint clone, damaged (%d, %d), (%d, %d) [(%d, %d), (%d,  %d)]\n",
+	DBG(DRAW, ("%s-%s paint clone, damaged (%d, %d), (%d, %d) [(%d, %d), (%d,  %d)]\n",
 	     DisplayString(c->dst.dpy), c->dst.name,
 	     c->damaged.x1, c->damaged.y1,
 	     c->damaged.x2, c->damaged.y2,
@@ -1886,7 +1888,7 @@ static int clone_paint(struct clone *c)
 	if (c->damaged.y2 <= c->damaged.y1)
 		goto done;
 
-	DBG(("%s-%s is damaged, last SHM serial: %ld, now %ld\n",
+	DBG(DRAW, ("%s-%s is damaged, last SHM serial: %ld, now %ld\n",
 	     DisplayString(c->dst.dpy), c->dst.name,
 	     (long)c->dst.serial, (long)LastKnownRequestProcessed(c->dst.dpy)));
 	if (c->dst.serial > LastKnownRequestProcessed(c->dst.dpy)) {
@@ -1964,7 +1966,7 @@ static void clone_damage(struct clone *c, const XRectangle *rec)
 	if ((v = (int)rec->y + rec->height) > c->damaged.y2)
 		c->damaged.y2 = v;
 
-	DBG(("%s-%s damaged: (%d, %d), (%d, %d)\n",
+	DBG(DAMAGE, ("%s-%s damaged: (%d, %d), (%d, %d)\n",
 	     DisplayString(c->dst.display->dpy), c->dst.name,
 	     c->damaged.x1, c->damaged.y1,
 	     c->damaged.x2, c->damaged.y2));
@@ -1972,19 +1974,30 @@ static void clone_damage(struct clone *c, const XRectangle *rec)
 
 static void usage(const char *arg0)
 {
-	printf("usage: %s [-d <source display>] [-b] [<target display>]...\n", arg0);
+	printf("Usage: %s [OPTION]... [TARGET_DISPLAY]...\n", arg0);
+	printf("  -d <source display>  source display\n");
+	printf("  -f                   keep in foreground (do not detach from console and daemonize)\n");
+	printf("  -b                   start bumblebee\n");
+	printf("  -a                   connect to all local displays (e.g. :1, :2, etc)\n");
+	printf("  -S                   disable use of a singleton and launch a fresh intel-virtual-output process\n");
+	printf("  -v                   all verbose output, implies -f\n");
+	printf("  -V <category>        specific verbose output, implies -f\n");
+	printf("  -h                   this help\n");
+	printf("If no target displays are parsed on the commandline, \n");
+	printf("intel-virtual-output will attempt to connect to any local display\n");
+	printf("and then start bumblebee.\n");
 }
 
 static void record_callback(XPointer closure, XRecordInterceptData *data)
 {
 	struct context *ctx = (struct context *)closure;
 
-	DBG(("%s\n", __func__));
+	DBG(X11, ("%s\n", __func__));
 
 	if (data->category == XRecordFromServer) {
 		const xEvent *e = (const xEvent *)data->data;
 
-		DBG(("%s -- from server, event type %d, root %ld (ours? %d)\n",
+		DBG(X11, ("%s -- from server, event type %d, root %ld (ours? %d)\n",
 		     __func__, e->u.u.type, (long)e->u.keyButtonPointer.root,
 		     ctx->display->root == e->u.keyButtonPointer.root));
 
@@ -2009,7 +2022,7 @@ static int record_mouse(struct context *ctx)
 	XRecordClientSpec rcs;
 	XRecordContext rc;
 
-	DBG(("%s(%s)\n", __func__, DisplayString(ctx->display->dpy)));
+	DBG(X11, ("%s(%s)\n", __func__, DisplayString(ctx->display->dpy)));
 
 	dpy = XOpenDisplay(DisplayString(ctx->display->dpy));
 	if (dpy == NULL)
@@ -2035,7 +2048,7 @@ static int record_mouse(struct context *ctx)
 
 static int bad_visual(Visual *visual, int depth)
 {
-	DBG(("%s? depth=%d, visual: class=%d, bits_per_rgb=%d, red_mask=%08lx, green_mask=%08lx, blue_mask=%08lx\n",
+	DBG(X11, ("%s? depth=%d, visual: class=%d, bits_per_rgb=%d, red_mask=%08lx, green_mask=%08lx, blue_mask=%08lx\n",
 	     __func__, depth,
 	     visual->class,
 	     visual->bits_per_rgb,
@@ -2074,7 +2087,7 @@ find_xrender_format(Display *dpy, pixman_format_code_t format)
     tmpl.depth = PIXMAN_FORMAT_DEPTH(format);
     mask = PictFormatType | PictFormatDepth;
 
-    DBG(("%s(0x%08lx)\n", __func__, (long)format));
+    DBG(X11, ("%s(0x%08lx)\n", __func__, (long)format));
 
     switch (PIXMAN_FORMAT_TYPE(format)) {
     case PIXMAN_TYPE_ARGB:
@@ -2181,7 +2194,7 @@ static int display_init_render(struct display *display, int depth, XRenderPictFo
 	Display *dpy = display->dpy;
 	int major, minor;
 
-	DBG(("%s is depth %d, want %d\n", DisplayString(dpy), display->depth, depth));
+	DBG(X11, ("%s is depth %d, want %d\n", DisplayString(dpy), display->depth, depth));
 
 	*use_render = 0;
 	if (depth == display->depth && !bad_visual(display->visual, depth))
@@ -2197,7 +2210,7 @@ static int display_init_render(struct display *display, int depth, XRenderPictFo
 		display->rgb16_format = find_xrender_format(dpy, PIXMAN_r5g6b5);
 		display->rgb24_format = XRenderFindStandardFormat(dpy, PictStandardRGB24);
 
-		DBG(("%s: root format=%lx, rgb16 format=%lx, rgb24 format=%lx\n",
+		DBG(X11, ("%s: root format=%lx, rgb16 format=%lx, rgb24 format=%lx\n",
 		     DisplayString(dpy),
 		     (long)display->root_format,
 		     (long)display->rgb16_format,
@@ -2218,7 +2231,7 @@ static int clone_init_depth(struct clone *clone)
 {
 	int ret, depth;
 
-	DBG(("%s-%s wants depth %d\n",
+	DBG(X11,("%s-%s wants depth %d\n",
 	     DisplayString(clone->dst.dpy), clone->dst.name, clone->depth));
 
 	ret = -1;
@@ -2236,7 +2249,7 @@ static int clone_init_depth(struct clone *clone)
 	if (ret)
 		return ret;
 
-	DBG(("%s-%s using depth %d, requires xrender for src? %d, for dst? %d\n",
+	DBG(X11, ("%s-%s using depth %d, requires xrender for src? %d, for dst? %d\n",
 	     DisplayString(clone->dst.dpy), clone->dst.name,
 	     clone->depth,
 	     clone->src.use_render != NULL,
@@ -2288,7 +2301,7 @@ static int add_display(struct context *ctx, Display *dpy)
 				       &display->shm_event,
 				       &display->shm_opcode,
 				       &display->has_shm_pixmap);
-	DBG(("%s: has_shm?=%d, event=%d, opcode=%d, has_pixmap?=%d\n",
+	DBG(X11, ("%s: has_shm?=%d, event=%d, opcode=%d, has_pixmap?=%d\n",
 	     DisplayString(dpy),
 	     display->has_shm,
 	     display->shm_event,
@@ -2296,7 +2309,7 @@ static int add_display(struct context *ctx, Display *dpy)
 	     display->has_shm_pixmap));
 
 	display->rr_active = XRRQueryExtension(dpy, &display->rr_event, &display->rr_error);
-	DBG(("%s: randr_active?=%d, event=%d, error=%d\n",
+	DBG(X11, ("%s: randr_active?=%d, event=%d, error=%d\n",
 	     DisplayString(dpy),
 	     display->rr_active,
 	     display->rr_event,
@@ -2304,14 +2317,14 @@ static int add_display(struct context *ctx, Display *dpy)
 
 	if (XineramaQueryExtension(dpy, &display->xinerama_event, &display->xinerama_error))
 		display->xinerama_active = XineramaIsActive(dpy);
-	DBG(("%s: xinerama_active?=%d, event=%d, error=%d\n",
+	DBG(X11, ("%s: xinerama_active?=%d, event=%d, error=%d\n",
 	     DisplayString(dpy),
 	     display->xinerama_active,
 	     display->xinerama_event,
 	     display->xinerama_error));
 
 	display->dri3_active = dri3_exists(dpy);
-	DBG(("%s: dri3_active?=%d\n",
+	DBG(X11, ("%s: dri3_active?=%d\n",
 	     DisplayString(dpy),
 	     display->dri3_active));
 
@@ -2329,7 +2342,7 @@ static int display_open(struct context *ctx, const char *name)
 	Display *dpy;
 	int n;
 
-	DBG(("%s(%s)\n", __func__, name));
+	DBG(X11, ("%s(%s)\n", __func__, name));
 
 	dpy = XOpenDisplay(name);
 	if (dpy == NULL)
@@ -2338,7 +2351,7 @@ static int display_open(struct context *ctx, const char *name)
 	/* Prevent cloning the same display twice */
 	for (n = 0; n < ctx->ndisplay; n++) {
 		if (strcmp(DisplayString(dpy), DisplayString(ctx->display[n].dpy)) == 0) {
-			DBG(("%s %s is already connected\n", __func__, name));
+			DBG(X11, ("%s %s is already connected\n", __func__, name));
 			XCloseDisplay(dpy);
 			return -EBUSY;
 		}
@@ -2355,21 +2368,21 @@ static int bumblebee_open(struct context *ctx)
 
 	fd = socket(PF_UNIX, SOCK_STREAM, 0);
 	if (fd < 0) {
-		DBG(("%s unable to create a socket: %d\n", __func__, errno));
+		DBG(X11, ("%s unable to create a socket: %d\n", __func__, errno));
 		return -ECONNREFUSED;
 	}
 
 	addr.sun_family = AF_UNIX;
 	strcpy(addr.sun_path, optarg && *optarg ? optarg : "/var/run/bumblebee.socket");
 	if (connect(fd, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
-		DBG(("%s unable to create a socket: %d\n", __func__, errno));
+		DBG(X11, ("%s unable to create a socket: %d\n", __func__, errno));
 		goto err;
 	}
 
 	/* Ask bumblebee to start the second server */
 	buf[0] = 'C';
 	if (send(fd, &buf, 1, 0) != 1 || (len = recv(fd, &buf, 255, 0)) <= 0) {
-		DBG(("%s startup send/recv failed: %d\n", __func__, errno));
+		DBG(X11, ("%s startup send/recv failed: %d\n", __func__, errno));
 		goto err;
 	}
 	buf[len] = '\0';
@@ -2377,12 +2390,12 @@ static int bumblebee_open(struct context *ctx)
 	/* Query the display name */
 	strcpy(buf, "Q VirtualDisplay");
 	if (send(fd, buf, 17, 0) != 17 || (len = recv(fd, buf, 255, 0)) <= 0) {
-		DBG(("%s query send/recv failed: %d\n", __func__, errno));
+		DBG(X11, ("%s query send/recv failed: %d\n", __func__, errno));
 		goto err;
 	}
 	buf[len] = '\0';
 
-	DBG(("%s query result '%s'\n", __func__, buf));
+	DBG(X11, ("%s query result '%s'\n", __func__, buf));
 
 	if (strncmp(buf, "Value: ", 7))
 		goto err;
@@ -2408,7 +2421,7 @@ err:
 
 static int display_init_damage(struct display *display)
 {
-	DBG(("%s(%s)\n", __func__, DisplayString(display->dpy)));
+	DBG(X11, ("%s(%s)\n", __func__, DisplayString(display->dpy)));
 
 	if (!XDamageQueryExtension(display->dpy, &display->damage_event, &display->damage_error) ||
 	    !XFixesQueryExtension(display->dpy, &display->xfixes_event, &display->xfixes_error)) {
@@ -2440,12 +2453,12 @@ static void display_init_randr_hpd(struct display *display)
 {
 	int major, minor;
 
-	DBG(("%s(%s)\n", __func__, DisplayString(display->dpy)));
+	DBG(X11,("%s(%s)\n", __func__, DisplayString(display->dpy)));
 
 	if (!XRRQueryVersion(display->dpy, &major, &minor))
 		return;
 
-	DBG(("%s - randr version %d.%d\n", DisplayString(display->dpy), major, minor));
+	DBG(X11, ("%s - randr version %d.%d\n", DisplayString(display->dpy), major, minor));
 	if (major > 1 || (major == 1 && minor >= 2))
 		XRRSelectInput(display->dpy, display->root, RROutputChangeNotifyMask);
 }
@@ -2514,7 +2527,7 @@ static int last_display_add_clones__randr(struct context *ctx)
 	char buf[80];
 	int i, ret;
 
-	DBG(("%s(%s)\n", __func__, DisplayString(display->dpy)));
+	DBG(X11, ("%s(%s)\n", __func__, DisplayString(display->dpy)));
 
 	display_init_randr_hpd(display);
 
@@ -2523,7 +2536,7 @@ static int last_display_add_clones__randr(struct context *ctx)
 	if (res == NULL)
 		return -ENOMEM;
 
-	DBG(("%s - noutputs=%d\n", DisplayString(display->dpy), res->noutput));
+	DBG(X11, ("%s - noutputs=%d\n", DisplayString(display->dpy), res->noutput));
 	for (i = 0; i < res->noutput; i++) {
 		XRROutputInfo *o = XRRGetOutputInfo(display->dpy, res, res->outputs[i]);
 		struct clone *clone = add_clone(ctx);
@@ -2573,7 +2586,7 @@ static int last_display_add_clones__randr(struct context *ctx)
 
 
 		if (o->crtc) {
-			DBG(("%s - disabling active output\n", DisplayString(display->dpy)));
+			DBG(X11, ("%s - disabling active output\n", DisplayString(display->dpy)));
 			disable_crtc(display->dpy, res, o->crtc);
 		}
 
@@ -2593,7 +2606,7 @@ static int last_display_add_clones__xinerama(struct context *ctx)
 	char buf[80];
 	int n, count, ret;
 
-	DBG(("%s(%s)\n", __func__, DisplayString(display->dpy)));
+	DBG(X11, ("%s(%s)\n", __func__, DisplayString(display->dpy)));
 
 	count = 0;
 	xi = XineramaQueryScreens(dpy, &count);
@@ -2671,7 +2684,7 @@ static int last_display_add_clones__display(struct context *ctx)
 	RROutput id;
 
 
-	DBG(("%s(%s)\n", __func__, DisplayString(dpy)));
+	DBG(X11, ("%s(%s)\n", __func__, DisplayString(dpy)));
 	clone = add_clone(ctx);
 	if (clone == NULL)
 		return -ENOMEM;
@@ -2733,7 +2746,7 @@ static int last_display_add_clones(struct context *ctx)
 
 	display->width = DisplayWidth(display->dpy, DefaultScreen(display->dpy));
 	display->height = DisplayHeight(display->dpy, DefaultScreen(display->dpy));
-	DBG(("%s - initial size %dx%d\n", DisplayString(display->dpy), display->width, display->height));
+	DBG(X11, ("%s - initial size %dx%d\n", DisplayString(display->dpy), display->width, display->height));
 
 	if (display->rr_active)
 		return last_display_add_clones__randr(ctx);
@@ -2769,7 +2782,7 @@ static int first_display_has_singleton(struct context *ctx)
 
 	XGetWindowProperty(display->dpy, display->root, ctx->singleton,
 			   0, 0, 0, AnyPropertyType, &type, &format, &nitems, &bytes, &prop);
-	DBG(("%s: singleton registered? %d\n", DisplayString(display->dpy), type != None));
+	DBG(X11, ("%s: singleton registered? %d\n", DisplayString(display->dpy), type != None));
 	return type != None;
 }
 
@@ -2780,7 +2793,7 @@ static int first_display_wait_for_ack(struct context *ctx, int timeout, int id)
 	char expect[6]; /* "1234R\0" */
 
 	sprintf(expect, "%04xR", id);
-	DBG(("%s: wait for act '%c%c%c%c%c'\n",
+	DBG(X11, ("%s: wait for act '%c%c%c%c%c'\n",
 	     DisplayString(display->dpy),
 	     expect[0], expect[1], expect[2], expect[3], expect[4]));
 
@@ -2797,7 +2810,7 @@ static int first_display_wait_for_ack(struct context *ctx, int timeout, int id)
 			XClientMessageEvent *cme;
 
 			XNextEvent(display->dpy, &e);
-			DBG(("%s: reading event type %d\n", DisplayString(display->dpy), e.type));
+			DBG(X11, ("%s: reading event type %d\n", DisplayString(display->dpy), e.type));
 
 			if (e.type != ClientMessage)
 				continue;
@@ -2808,7 +2821,7 @@ static int first_display_wait_for_ack(struct context *ctx, int timeout, int id)
 			if (cme->format != 8)
 				continue;
 
-			DBG(("%s: client message '%c%c%c%c%c'\n",
+			DBG(X11, ("%s: client message '%c%c%c%c%c'\n",
 			     DisplayString(display->dpy),
 			     cme->data.b[0],
 			     cme->data.b[1],
@@ -2842,7 +2855,7 @@ static int first_display_send_command(struct context *ctx, int timeout,
 	va_end(va);
 	assert(len < sizeof(buf));
 
-	DBG(("%s: send command '%s'\n", DisplayString(display->dpy), buf));
+	DBG(X11, ("%s: send command '%s'\n", DisplayString(display->dpy), buf));
 
 	b = buf;
 	while (len) {
@@ -2877,7 +2890,7 @@ static void first_display_reply(struct context *ctx, int result)
 	     ctx->command[3],
 	     -result);
 
-	DBG(("%s: send reply '%s'\n", DisplayString(display->dpy), msg.data.b));
+	DBG(X11, ("%s: send reply '%s'\n", DisplayString(display->dpy), msg.data.b));
 
 	msg.type = ClientMessage;
 	msg.serial = 0;
@@ -2893,7 +2906,7 @@ static void first_display_handle_command(struct context *ctx,
 {
 	int len;
 
-	DBG(("client message!\n"));
+	DBG(X11, ("client message!\n"));
 
 	for (len = 0; len < 20 && msg[len]; len++)
 		;
@@ -2908,7 +2921,7 @@ static void first_display_handle_command(struct context *ctx,
 
 	if (len < 20) {
 		ctx->command[ctx->command_continuation] = 0;
-		DBG(("client command complete! '%s'\n", ctx->command));
+		DBG(X11, ("client command complete! '%s'\n", ctx->command));
 		switch (ctx->command[4]) {
 		case 'B':
 			first_display_reply(ctx, last_display_clone(ctx, bumblebee_open(ctx)));
@@ -2950,7 +2963,7 @@ static int first_display_register_as_singleton(struct context *ctx)
 			XEvent e;
 
 			XNextEvent(display->dpy, &e);
-			DBG(("%s: reading event type %d\n", DisplayString(display->dpy), e.type));
+			DBG(X11, ("%s: reading event type %d\n", DisplayString(display->dpy), e.type));
 
 			if (e.type == PropertyNotify &&
 			    ((XPropertyEvent *)&e)->atom == ctx->singleton)
@@ -2966,7 +2979,7 @@ static void display_flush_send(struct display *display)
 	if (!display->send)
 		return;
 
-	DBG(("%s flushing send (serial now %ld) (has shm send? %d)\n",
+	DBG(X11, ("%s flushing send (serial now %ld) (has shm send? %d)\n",
 	     DisplayString(display->dpy),
 	     (long)NextRequest(display->dpy),
 	     display->shm_event));
@@ -2998,7 +3011,7 @@ static void display_sync(struct display *display)
 	if (display->skip_frame++ < 2)
 		return;
 
-	DBG(("%s forcing sync\n", DisplayString(display->dpy)));
+	DBG(X11, ("%s forcing sync\n", DisplayString(display->dpy)));
 	XSync(display->dpy, False);
 
 	display->flush = 0;
@@ -3018,7 +3031,7 @@ static void display_flush(struct display *display)
 	if (!display->flush)
 		return;
 
-	DBG(("%s(%s)\n", __func__, DisplayString(display->dpy)));
+	DBG(X11, ("%s(%s)\n", __func__, DisplayString(display->dpy)));
 
 	XFlush(display->dpy);
 	display->flush = 0;
@@ -3145,12 +3158,12 @@ int main(int argc, char **argv)
 	struct context ctx;
 	const char *src_name = NULL;
 	uint64_t count;
-	int daemonize = !EXTRA_DBG, bumblebee = 0, all = 0, singleton = 1;
+	int daemonize = 1, bumblebee = 0, siblings = 0, singleton = 1;
 	int i, ret, open, fail;
 
 	signal(SIGPIPE, SIG_IGN);
 
-	while ((i = getopt(argc, argv, "abd:fhS")) != -1) {
+	while ((i = getopt(argc, argv, "abd:fhSvV:")) != -1) {
 		switch (i) {
 		case 'd':
 			src_name = optarg;
@@ -3161,12 +3174,20 @@ int main(int argc, char **argv)
 		case 'b':
 			bumblebee = 1;
 			break;
-		case 'a':
-			all = 1;
+		case 's':
+			siblings = 1;
 			break;
 		case 'S':
 			singleton = 0;
 			break;
+		case 'v':
+			verbose = ~0;
+			daemonize = 0;
+			break;
+		case 'V':
+			verbose = strtol(optarg, NULL, 0);
+			daemonize = 0;
+			break;
 		case 'h':
 		default:
 			usage(argv[0]);
@@ -3190,14 +3211,14 @@ int main(int argc, char **argv)
 	if (singleton) {
 		XSelectInput(ctx.display->dpy, ctx.display->root, PropertyChangeMask);
 		if (first_display_has_singleton(&ctx)) {
-			DBG(("%s: pinging singleton\n", DisplayString(ctx.display->dpy)));
+			DBG(X11, ("%s: pinging singleton\n", DisplayString(ctx.display->dpy)));
 			ret = first_display_send_command(&ctx, 2000, "P");
 			if (ret) {
 				if (ret != -ETIME)
 					return -ret;
-				DBG(("No reply from singleton; assuming control\n"));
+				DBG(X11, ("No reply from singleton; assuming control\n"));
 			} else {
-				DBG(("%s: singleton active, sending open commands\n", DisplayString(ctx.display->dpy)));
+				DBG(X11, ("%s: singleton active, sending open commands\n", DisplayString(ctx.display->dpy)));
 
 				open = fail = 0;
 				for (i = optind; i < argc; i++) {
@@ -3208,7 +3229,7 @@ int main(int argc, char **argv)
 					} else
 						open++;
 				}
-				if (all || (optind == argc && !bumblebee)) {
+				if (siblings || (optind == argc && !bumblebee)) {
 					first_display_for_each_sibling(&ctx, i) {
 						ret = first_display_send_command(&ctx, 5000, "C%s", ctx.command);
 						if (ret && ret != -EBUSY)
@@ -3217,7 +3238,7 @@ int main(int argc, char **argv)
 							open++;
 					}
 				}
-				if (bumblebee || (optind == argc && !all)) {
+				if (bumblebee || (optind == argc && !siblings)) {
 					ret = first_display_send_command(&ctx, 5000, "B");
 					if (ret && ret != -EBUSY) {
 						if (bumblebee)
@@ -3260,7 +3281,7 @@ int main(int argc, char **argv)
 		} else
 			open++;
 	}
-	if (all || (optind == argc && !bumblebee)) {
+	if (siblings || (optind == argc && !bumblebee)) {
 		first_display_for_each_sibling(&ctx, i) {
 			ret = last_display_clone(&ctx, display_open(&ctx, ctx.command));
 			if (ret && ret != -EBUSY)
@@ -3269,7 +3290,7 @@ int main(int argc, char **argv)
 				open++;
 		}
 	}
-	if (bumblebee || (optind == argc && !all)) {
+	if (bumblebee || (optind == argc && !siblings)) {
 		ret = last_display_clone(&ctx, bumblebee_open(&ctx));
 		if (ret && ret != -EBUSY) {
 			if (bumblebee)
@@ -3294,16 +3315,16 @@ int main(int argc, char **argv)
 		int reconfigure = 0;
 		int rr_update = 0;
 
-		DBG(("polling - enable timer? %d, nfd=%d, ndisplay=%d\n", ctx.timer_active, ctx.nfd, ctx.ndisplay));
+		DBG(POLL, ("polling - enable timer? %d, nfd=%d, ndisplay=%d\n", ctx.timer_active, ctx.nfd, ctx.ndisplay));
 		ret = poll(ctx.pfd + !ctx.timer_active, ctx.nfd - !ctx.timer_active, -1);
 		if (ret <= 0)
 			break;
 
 		/* pfd[0] is the timer, pfd[1] is the local display, pfd[2] is the mouse, pfd[3+] are the remotes */
 
-		DBG(("poll reports %d fd awake\n", ret));
+		DBG(POLL, ("poll reports %d fd awake\n", ret));
 		if (ctx.pfd[1].revents || XPending(ctx.display[0].dpy)) {
-			DBG(("%s woken up\n", DisplayString(ctx.display[0].dpy)));
+			DBG(POLL,("%s woken up\n", DisplayString(ctx.display[0].dpy)));
 			do {
 				XNextEvent(ctx.display->dpy, &e);
 
@@ -3311,7 +3332,7 @@ int main(int argc, char **argv)
 					const XDamageNotifyEvent *de = (const XDamageNotifyEvent *)&e;
 					struct clone *clone;
 
-					DBG(("%s damaged: (%d, %d)x(%d, %d)\n",
+					DBG(DAMAGE, ("%s damaged: (%d, %d)x(%d, %d)\n",
 					     DisplayString(ctx.display->dpy),
 					     de->area.x, de->area.y, de->area.width, de->area.height));
 
@@ -3323,7 +3344,7 @@ int main(int argc, char **argv)
 				} else if (e.type == ctx.display->xfixes_event + XFixesCursorNotify) {
 					XFixesCursorImage *cur;
 
-					DBG(("%s cursor changed\n",
+					DBG(CURSOR, ("%s cursor changed\n",
 					     DisplayString(ctx.display->dpy)));
 
 					cur = XFixesGetCursorImage(ctx.display->dpy);
@@ -3335,19 +3356,19 @@ int main(int argc, char **argv)
 
 					XFree(cur);
 				} else if (e.type == ctx.display->rr_event + RRScreenChangeNotify) {
-					DBG(("%s screen changed (reconfigure pending? %d)\n",
+					DBG(XRR, ("%s screen changed (reconfigure pending? %d)\n",
 					     DisplayString(ctx.display->dpy), reconfigure));
 					reconfigure = 1;
 				} else if (e.type == PropertyNotify) {
 					XPropertyEvent *pe = (XPropertyEvent *)&e;
 					if (pe->atom == ctx.singleton) {
-						DBG(("lost control of singleton\n"));
+						DBG(X11, ("lost control of singleton\n"));
 						return 0;
 					}
 				} else if (e.type == ClientMessage) {
 					XClientMessageEvent *cme;
 
-					DBG(("%s client message\n",
+					DBG(X11, ("%s client message\n",
 					     DisplayString(ctx.display->dpy)));
 
 					cme = (XClientMessageEvent *)&e;
@@ -3358,7 +3379,7 @@ int main(int argc, char **argv)
 
 					first_display_handle_command(&ctx, cme->data.b);
 				} else {
-					DBG(("unknown event %d\n", e.type));
+					DBG(X11, ("unknown event %d\n", e.type));
 				}
 			} while (XEventsQueued(ctx.display->dpy, QueuedAfterReading));
 		}
@@ -3367,20 +3388,20 @@ int main(int argc, char **argv)
 			if (ctx.pfd[i+2].revents == 0 && !XPending(ctx.display[i].dpy))
 				continue;
 
-			DBG(("%s woken up\n", DisplayString(ctx.display[i].dpy)));
+			DBG(POLL, ("%s woken up\n", DisplayString(ctx.display[i].dpy)));
 			do {
 				XNextEvent(ctx.display[i].dpy, &e);
 
-				DBG(("%s received event %d\n", DisplayString(ctx.display[i].dpy), e.type));
+				DBG(POLL, ("%s received event %d\n", DisplayString(ctx.display[i].dpy), e.type));
 				if (ctx.display[i].rr_active && e.type == ctx.display[i].rr_event + RRNotify) {
 					XRRNotifyEvent *re = (XRRNotifyEvent *)&e;
 
-					DBG(("%s received RRNotify, type %d\n", DisplayString(ctx.display[i].dpy), re->subtype));
+					DBG(XRR, ("%s received RRNotify, type %d\n", DisplayString(ctx.display[i].dpy), re->subtype));
 					if (re->subtype == RRNotify_OutputChange) {
 						XRROutputPropertyNotifyEvent *ro = (XRROutputPropertyNotifyEvent *)re;
 						struct clone *clone;
 
-						DBG(("%s RRNotify_OutputChange, timestamp %ld\n", DisplayString(ctx.display[i].dpy), ro->timestamp));
+						DBG(XRR, ("%s RRNotify_OutputChange, timestamp %ld\n", DisplayString(ctx.display[i].dpy), ro->timestamp));
 						for (clone = ctx.display[i].clone; clone; clone = clone->next) {
 							if (clone->dst.rr_output == ro->output)
 								rr_update = clone->rr_update = 1;
@@ -3404,11 +3425,11 @@ int main(int argc, char **argv)
 		if (ctx.timer_active && read(ctx.timer, &count, sizeof(count)) > 0) {
 			struct clone *clone;
 
-			DBG(("%s timer expired (count=%ld)\n", DisplayString(ctx.display->dpy), (long)count));
+			DBG(TIMER, ("%s timer expired (count=%ld)\n", DisplayString(ctx.display->dpy), (long)count));
 			ret = 0;
 
 			if (ctx.active) {
-				DBG(("%s clearing damage\n", DisplayString(ctx.display->dpy)));
+				DBG(DAMAGE, ("%s clearing damage\n", DisplayString(ctx.display->dpy)));
 				XDamageSubtract(ctx.display->dpy, ctx.display->damage, None, None);
 				ctx.display->flush = 1;
 			}
@@ -3419,7 +3440,7 @@ int main(int argc, char **argv)
 			for (i = 0; i < ctx.ndisplay; i++)
 				display_flush(&ctx.display[i]);
 
-			DBG(("%s timer still active? %d\n", DisplayString(ctx.display->dpy), ret != 0));
+			DBG(TIMER, ("%s timer still active? %d\n", DisplayString(ctx.display->dpy), ret != 0));
 			ctx.timer_active = ret != 0;
 		}
 	}
commit 665d012b8e1b9666e535a3081404406f31b8a3ef
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Sun Jun 29 09:26:10 2014 +0100

    sna: Ensure CPU bo is synchronized before writing
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_accel.c b/src/sna/sna_accel.c
index 54fece4..fe10bf2 100644
--- a/src/sna/sna_accel.c
+++ b/src/sna/sna_accel.c
@@ -1528,6 +1528,7 @@ static inline bool has_coherent_ptr(struct sna *sna, struct sna_pixmap *priv, un
 		if (!priv->cpu_bo)
 			return true;
 
+		assert(!priv->cpu_bo->needs_flush);
 		assert(priv->pixmap->devKind == priv->cpu_bo->pitch);
 		return priv->pixmap->devPrivate.ptr == MAP(priv->cpu_bo->map__cpu);
 	}
@@ -1790,6 +1791,9 @@ static void download_boxes(struct sna *sna,
 	if (!ok)
 		ok = gpu_bo_download(sna, priv, n, box, false);
 	if (!ok) {
+		if (priv->cpu_bo)
+			kgem_bo_sync__cpu(&sna->kgem, priv->cpu_bo);
+		assert(priv->mapped == MAPPED_NONE);
 		assert(has_coherent_ptr(sna, priv, MOVE_WRITE));
 		sna_read_boxes(sna, priv->pixmap, priv->gpu_bo, box, n);
 	}


More information about the xorg-commit mailing list