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