From fd7b5e2c280ca5490b40f93d105e1e8e6636072c Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Tue, 18 Mar 2008 15:35:44 -0700 Subject: [PATCH] Report whether transforms are support from driver through extension to client Add APIs to xf86RandR12 support and randr extension to record whether the driver supports transforms, report that value in the RRGetCrtcTransform reply. --- hw/xfree86/modes/xf86Crtc.c | 6 ++++++ hw/xfree86/modes/xf86RandR12.c | 25 +++++++++++++++++++++++++ hw/xfree86/modes/xf86RandR12.h | 1 + randr/randrstr.h | 7 +++++++ randr/rrcrtc.c | 15 +++++++++++++-- 5 files changed, 52 insertions(+), 2 deletions(-) diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c index f94996f9f..257003e9a 100644 --- a/hw/xfree86/modes/xf86Crtc.c +++ b/hw/xfree86/modes/xf86Crtc.c @@ -730,11 +730,17 @@ xf86CrtcScreenInit (ScreenPtr screen) break; } if (c == config->num_crtc) + { xf86RandR12SetRotations (screen, RR_Rotate_0 | RR_Rotate_90 | RR_Rotate_180 | RR_Rotate_270 | RR_Reflect_X | RR_Reflect_Y); + xf86RandR12SetTransform (screen, TRUE); + } else + { xf86RandR12SetRotations (screen, RR_Rotate_0); + xf86RandR12SetTransform (screen, FALSE); + } /* Wrap CreateScreenResources so we can initialize the RandR code */ config->CreateScreenResources = screen->CreateScreenResources; diff --git a/hw/xfree86/modes/xf86RandR12.c b/hw/xfree86/modes/xf86RandR12.c index af02501cf..75f7ef3c1 100644 --- a/hw/xfree86/modes/xf86RandR12.c +++ b/hw/xfree86/modes/xf86RandR12.c @@ -585,6 +585,31 @@ xf86RandR12SetRotations (ScreenPtr pScreen, Rotation rotations) randrp->supported_rotations = rotations; } +_X_EXPORT void +xf86RandR12SetTransform (ScreenPtr pScreen, Bool transforms) +{ + XF86RandRInfoPtr randrp; +#if RANDR_13_INTERFACE + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + int c; + xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn); +#endif + +#if XORG_VERSION_CURRENT < XORG_VERSION_NUMERIC(7,0,0,0,0) + if (xf86RandR12Key == NULL) + return; +#endif + + randrp = XF86RANDRINFO(pScreen); +#if RANDR_13_INTERFACE + for (c = 0; c < config->num_crtc; c++) { + xf86CrtcPtr crtc = config->crtc[c]; + + RRCrtcSetTransform (crtc->randr_crtc, transforms); + } +#endif +} + _X_EXPORT void xf86RandR12GetOriginalVirtualSize(ScrnInfoPtr pScrn, int *x, int *y) { diff --git a/hw/xfree86/modes/xf86RandR12.h b/hw/xfree86/modes/xf86RandR12.h index 4fd855cf5..c361b4733 100644 --- a/hw/xfree86/modes/xf86RandR12.h +++ b/hw/xfree86/modes/xf86RandR12.h @@ -31,6 +31,7 @@ Bool xf86RandR12CreateScreenResources (ScreenPtr pScreen); Bool xf86RandR12Init(ScreenPtr pScreen); void xf86RandR12SetRotations (ScreenPtr pScreen, Rotation rotation); +void xf86RandR12SetTransform (ScreenPtr pScreen, Bool transforms); Bool xf86RandR12SetConfig(ScreenPtr pScreen, Rotation rotation, int rate, RRScreenSizePtr pSize); Rotation xf86RandR12GetRotation(ScreenPtr pScreen); diff --git a/randr/randrstr.h b/randr/randrstr.h index f97c26d23..c3e000316 100644 --- a/randr/randrstr.h +++ b/randr/randrstr.h @@ -127,6 +127,7 @@ struct _rrCrtc { CARD16 *gammaBlue; CARD16 *gammaGreen; void *devPrivate; + Bool transforms; RRTransformRec client_pending_transform; RRTransformRec client_current_transform; PictTransform transform; @@ -535,6 +536,12 @@ RRCrtcCreate (ScreenPtr pScreen, void *devPrivate); void RRCrtcSetRotations (RRCrtcPtr crtc, Rotation rotations); +/* + * Set whether transforms are allowed on a CRTC + */ +void +RRCrtcSetTransform (RRCrtcPtr crtc, Bool transforms); + /* * Notify the extension that the Crtc has been reconfigured, * the driver calls this whenever it has updated the mode diff --git a/randr/rrcrtc.c b/randr/rrcrtc.c index a3e250345..5e3e38aea 100644 --- a/randr/rrcrtc.c +++ b/randr/rrcrtc.c @@ -163,6 +163,15 @@ RRCrtcSetRotations (RRCrtcPtr crtc, Rotation rotations) crtc->rotations = rotations; } +/* + * Set whether transforms are allowed on a CRTC + */ +void +RRCrtcSetTransform (RRCrtcPtr crtc, Bool transforms) +{ + crtc->transforms = transforms; +} + /* * Notify the extension that the Crtc has been reconfigured, * the driver calls this whenever it has updated the mode @@ -608,6 +617,9 @@ RRCrtcTransformSet (RRCrtcPtr crtc, PictFilterPtr filter = NULL; int width = 0, height = 0; + if (!crtc->transforms) + return BadValue; + if (filter_len) { filter = PictureFindFilter (crtc->pScreen, @@ -1317,8 +1329,7 @@ ProcRRGetCrtcTransform (ClientPtr client) reply->sequenceNumber = client->sequence; reply->length = (CrtcTransformExtra + nextra) >> 2; - /* XXX deal with DDXen that can't do transforms */ - reply->hasTransforms = xTrue; + reply->hasTransforms = crtc->transforms; transform_encode (client, &reply->pendingTransform, &pending->transform); transform_encode (client, &reply->pendingInverse, &pending->inverse);