xf86-video-intel: 4 commits - tools/virtual.c

Chris Wilson ickle at kemper.freedesktop.org
Mon May 5 05:07:44 PDT 2014


 tools/virtual.c |   63 +++++++++++++++++++++++++++++++++++++++++---------------
 1 file changed, 47 insertions(+), 16 deletions(-)

New commits:
commit 5279ebf56449a9b9edd28ff23e9c8a20af792795
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon May 5 13:06:11 2014 +0100

    intel-virtual-output: Mark ShmPixmap destinations as writeable
    
    In order to prevent a subsequent BadAccess when we try to use it as a
    ShmPixmap, we need to mark the segment as writeable.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
    References: https://bugs.freedesktop.org/show_bug.cgi?id=78293

diff --git a/tools/virtual.c b/tools/virtual.c
index 8803fea..d35e585 100644
--- a/tools/virtual.c
+++ b/tools/virtual.c
@@ -934,7 +934,7 @@ static int clone_init_xfer(struct clone *clone)
 	}
 	if (clone->dst.use_shm) {
 		clone->dst.shm = clone->shm;
-		clone->dst.shm.readOnly = True;
+		clone->dst.shm.readOnly = !clone->dst.use_shm_pixmap;
 		XShmAttach(clone->dst.dpy, &clone->dst.shm);
 		XSync(clone->dst.dpy, False);
 	}
commit a93d2d4f910dc66fe7114a4f44bf8098e3f7ae7a
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon May 5 13:03:14 2014 +0100

    intel-virtual-output: Check for errors whilst creating ShmPixmaps
    
    Creating a ShmPixmap may cause an asynchronous BadAccess error, so wrap
    the construction with XSync and check for an error before proceeding.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
    References: https://bugs.freedesktop.org/show_bug.cgi?id=78293

diff --git a/tools/virtual.c b/tools/virtual.c
index b2f3069..8803fea 100644
--- a/tools/virtual.c
+++ b/tools/virtual.c
@@ -827,6 +827,9 @@ static void output_init_xfer(struct clone *clone, struct output *output)
 {
 	if (output->use_shm_pixmap) {
 		DBG(("%s-%s: creating shm pixmap\n", DisplayString(output->dpy), output->name));
+		XSync(output->dpy, False);
+		_x_error_occurred = 0;
+
 		if (output->pixmap)
 			XFreePixmap(output->dpy, output->pixmap);
 		output->pixmap = XShmCreatePixmap(output->dpy, output->window,
@@ -836,6 +839,13 @@ static void output_init_xfer(struct clone *clone, struct output *output)
 			XRenderFreePicture(output->dpy, output->pix_picture);
 			output->pix_picture = None;
 		}
+
+		XSync(output->dpy, False);
+		if (_x_error_occurred) {
+			XFreePixmap(output->dpy, output->pixmap);
+			output->pixmap = None;
+			output->use_shm_pixmap = 0;
+		}
 	}
 	if (output->use_render) {
 		DBG(("%s-%s: creating picture\n", DisplayString(output->dpy), output->name));
commit 45892b3a63613af67e249e9ad006f2b2002570c0
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon May 5 12:41:06 2014 +0100

    intel-virtual-output: Record shm/randr/xinerama queries in DBG log
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/tools/virtual.c b/tools/virtual.c
index 1444bde..b2f3069 100644
--- a/tools/virtual.c
+++ b/tools/virtual.c
@@ -1995,10 +1995,27 @@ 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",
+	     DisplayString(dpy),
+	     display->has_shm,
+	     display->shm_event,
+	     display->shm_opcode,
+	     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",
+	     DisplayString(dpy),
+	     display->rr_active,
+	     display->rr_event,
+	     display->rr_error));
+
 	if (XineramaQueryExtension(dpy, &display->xinerama_event, &display->xinerama_error))
 		display->xinerama_active = XineramaIsActive(dpy);
+	DBG(("%s: xinerama_active?=%d, event=%d, error=%d\n",
+	     DisplayString(dpy),
+	     display->xinerama_active,
+	     display->xinerama_event,
+	     display->xinerama_error));
 
 	/* first display (source) is slightly special */
 	if (!first_display) {
commit 6c9f216d7ce7c329b1008cb09c9de55396e0e6b1
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon May 5 12:38:51 2014 +0100

    intel-virtual-output: Check error state when disabling CRTC
    
    Only mark an output as disabled if we do successfully disable it. This
    will require a little more work to make sure that such errors are
    cleanly propagated back to the host...
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/tools/virtual.c b/tools/virtual.c
index 28b69f4..1444bde 100644
--- a/tools/virtual.c
+++ b/tools/virtual.c
@@ -447,15 +447,15 @@ static void clone_update_edid(struct clone *clone)
 	}
 }
 
-static void disable_crtc(Display *dpy, XRRScreenResources *res, RRCrtc crtc)
+static int disable_crtc(Display *dpy, XRRScreenResources *res, RRCrtc crtc)
 {
 	XRRPanning panning;
 
 	if (crtc == 0)
-		return;
+		return 1;
 
 	XRRSetPanning(dpy, res, crtc, memset(&panning, 0, sizeof(panning)));
-	XRRSetCrtcConfig(dpy, res, crtc, CurrentTime, 0, 0, None, RR_Rotate_0, NULL, 0);
+	return XRRSetCrtcConfig(dpy, res, crtc, CurrentTime, 0, 0, None, RR_Rotate_0, NULL, 0) == Success;
 }
 
 static int clone_update_modes__randr(struct clone *clone)
@@ -528,9 +528,10 @@ static int clone_update_modes__randr(struct clone *clone)
 	if (from_info->crtc != clone->dst.rr_crtc) {
 		DBG(("%s(%s-%s): disabling active CRTC\n", __func__,
 		     DisplayString(clone->dst.dpy), clone->dst.name));
-		disable_crtc(clone->dst.dpy, from_res, from_info->crtc);
-		clone->dst.rr_crtc = 0;
-		clone->dst.mode.id = 0;
+		if (disable_crtc(clone->dst.dpy, from_res, from_info->crtc)) {
+			clone->dst.rr_crtc = 0;
+			clone->dst.mode.id = 0;
+		}
 	}
 
 	/* Clear all current UserModes on the output, including any active ones */
@@ -1108,9 +1109,10 @@ static int context_update(struct context *ctx)
 
 				DBG(("%s: disabling output '%s'\n",
 				     DisplayString(dst->dpy), dst->name));
-				disable_crtc(dpy, res, dst->rr_crtc);
-				dst->rr_crtc = 0;
-				dst->mode.id = 0;
+				if (disable_crtc(dpy, res, dst->rr_crtc)) {
+					dst->rr_crtc = 0;
+					dst->mode.id = 0;
+				}
 			}
 			goto free_res;
 		}
@@ -1132,9 +1134,10 @@ static int context_update(struct context *ctx)
 
 				DBG(("%s: disabling output '%s'\n",
 				     DisplayString(dst->dpy), dst->name));
-				disable_crtc(dpy, res, dst->rr_crtc);
-				dst->rr_crtc = 0;
-				dst->mode.id = 0;
+				if (disable_crtc(dpy, res, dst->rr_crtc)) {
+					dst->rr_crtc = 0;
+					dst->mode.id = 0;
+				}
 			}
 
 			DBG(("%s: XRRSetScreenSize %dx%d\n", DisplayString(display->dpy), x2, y2));
@@ -1162,9 +1165,10 @@ err:
 				if (dst->rr_crtc) {
 					DBG(("%s: disabling unused output '%s'\n",
 					     DisplayString(dst->dpy), dst->name));
-					disable_crtc(dpy, res, dst->rr_crtc);
-					dst->rr_crtc = 0;
-					dst->mode.id = 0;
+					if (disable_crtc(dpy, res, dst->rr_crtc)) {
+						dst->rr_crtc = 0;
+						dst->mode.id = 0;
+					}
 				}
 				continue;
 			}


More information about the xorg-commit mailing list