diff options
author | Keith Packard <keithp@keithp.com> | 2011-02-23 11:18:08 -0800 |
---|---|---|
committer | Keith Packard <keithp@keithp.com> | 2011-02-23 11:18:08 -0800 |
commit | 3d4ee25a1e2e0ed2463ceaabea8f5a284a6ddd60 (patch) | |
tree | f996b23006878a5df4da480b4478accc80a14f25 /randr | |
parent | 8b0e651f7d09a7f35c87a4d0a6e2053cae93b516 (diff) |
Revert "randr: Implement RRSetCrtcConfigs"
This reverts commit d94a035ea9eb3167fc4f35b2d9f0d53f8807014c.
Diffstat (limited to 'randr')
-rw-r--r-- | randr/Makefile.am | 4 | ||||
-rw-r--r-- | randr/mirrcrtc.c | 169 | ||||
-rw-r--r-- | randr/randrstr.h | 90 | ||||
-rw-r--r-- | randr/rrcrtc.c | 512 | ||||
-rw-r--r-- | randr/rrscreen.c | 18 |
5 files changed, 44 insertions, 749 deletions
diff --git a/randr/Makefile.am b/randr/Makefile.am index a1c88dcb8..4b38e524b 100644 --- a/randr/Makefile.am +++ b/randr/Makefile.am @@ -22,9 +22,7 @@ librandr_la_SOURCES = \ rrsdispatch.c \ rrsprite.c \ rrtransform.h \ - rrtransform.c \ - mirrcrtc.c - + rrtransform.c if XINERAMA librandr_la_SOURCES += ${XINERAMA_SRCS} diff --git a/randr/mirrcrtc.c b/randr/mirrcrtc.c deleted file mode 100644 index b1e2c9f34..000000000 --- a/randr/mirrcrtc.c +++ /dev/null @@ -1,169 +0,0 @@ -/* - * Copyright © 2010 Keith Packard - * - * Permission to use, copy, modify, distribute, and sell this software and its - * documentation for any purpose is hereby granted without fee, provided that - * the above copyright notice appear in all copies and that both that copyright - * notice and this permission notice appear in supporting documentation, and - * that the name of the copyright holders not be used in advertising or - * publicity pertaining to distribution of the software without specific, - * written prior permission. The copyright holders make no representations - * about the suitability of this software for any purpose. It is provided "as - * is" without express or implied warranty. - * - * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, - * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO - * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR - * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, - * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER - * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE - * OF THIS SOFTWARE. - */ - -#include "randrstr.h" - -Bool -miRRSetScreenConfig(ScreenPtr screen, - RRScreenConfigPtr screen_config) -{ - RRScreenConfigRec old_screen_config; - - /* XXX deal with separate pixmap/screen sizes */ - if (screen_config->screen_pixmap_width != screen_config->screen_width || - screen_config->screen_pixmap_height != screen_config->screen_height) - return FALSE; - - RRScreenCurrentConfig(screen, &old_screen_config); - - /* Check and see if nothing has changed */ - if (old_screen_config.screen_width == screen_config->screen_width && - old_screen_config.screen_height == screen_config->screen_height && - old_screen_config.screen_pixmap_width == screen_config->screen_pixmap_width && - old_screen_config.screen_pixmap_height == screen_config->screen_pixmap_height && - old_screen_config.mm_width == screen_config->mm_width && - old_screen_config.mm_height == screen_config->mm_height) - return TRUE; - - return RRScreenSizeSet(screen, - screen_config->screen_width, - screen_config->screen_height, - screen_config->mm_width, - screen_config->mm_height); -} - -Bool -miRRSetCrtcConfig(RRCrtcConfigPtr crtc_config) -{ - int x = crtc_config->x, y = crtc_config->y; - - if (crtc_config->pixmap) { - x = crtc_config->pixmap_x; - y = crtc_config->pixmap_y; - } - return RRCrtcSet(crtc_config->crtc, - crtc_config->mode, - x, - y, - crtc_config->rotation, - crtc_config->numOutputs, - crtc_config->outputs); -} - -Bool -miRRDisableCrtc(RRCrtcPtr crtc) -{ - RRCrtcConfigRec off_config; - - memset(&off_config, '\0', sizeof (RRCrtcConfigRec)); - off_config.crtc = crtc; - return miRRSetCrtcConfig(&off_config); -} - -/* - * If the current crtc configuration doesn't fit - * with the new screen config, disable it - */ -Bool -miRRCheckDisableCrtc(RRScreenConfigPtr new_screen_config, - RRCrtcConfigPtr old_crtc_config) -{ - RRCrtcPtr crtc = old_crtc_config->crtc; - - /* If it's already disabled, we're done */ - if (!old_crtc_config->mode) - return TRUE; - - /* If the crtc isn't scanning from the screen pixmap, - * we're done - */ - if (old_crtc_config->pixmap) - return TRUE; - - /* If the new screen configuration covers the existing CRTC space, - * we're done - */ - if (RRScreenCoversCrtc(new_screen_config, old_crtc_config, - &crtc->client_current_transform, NULL)) - return TRUE; - - /* Disable the crtc and let it get re-enabled */ - return miRRDisableCrtc(crtc); -} - -Bool -miRRSetCrtcConfigs(ScreenPtr screen, - RRScreenConfigPtr screen_config, - RRCrtcConfigPtr crtc_configs, - int num_configs) -{ - RRScreenConfigRec old_screen_config; - RRCrtcConfigPtr old_crtc_configs; - int i; - - /* - * Save existing state - */ - - RRScreenCurrentConfig(screen, &old_screen_config); - old_crtc_configs = calloc(num_configs, sizeof (RRCrtcConfigRec)); - if (!old_crtc_configs) - return FALSE; - - for (i = 0; i < num_configs; i++) - if (!RRCrtcCurrentConfig(crtc_configs[i].crtc, &old_crtc_configs[i])) - goto fail_save; - /* - * Set the new configuration. If anything goes wrong, - * bail and restore the old configuration - */ - for (i = 0; i < num_configs; i++) - if (!miRRCheckDisableCrtc(screen_config, &old_crtc_configs[i])) - goto fail_disable; - - if (!miRRSetScreenConfig(screen, screen_config)) - goto fail_set_screen; - - for (i = 0; i < num_configs; i++) - if (!miRRSetCrtcConfig(&crtc_configs[i])) - goto fail_set_crtc; - - RRFreeCrtcConfigs(old_crtc_configs, num_configs); - return TRUE; - -fail_set_crtc: - /* - * Restore the previous configuration. Ignore any errors - * as we just need to hope that the driver can manage to - * get back to the previous state without trouble. - */ - for (i = 0; i < num_configs; i++) - (void) miRRDisableCrtc(old_crtc_configs[i].crtc); - (void) miRRSetScreenConfig(screen, &old_screen_config); -fail_set_screen: -fail_disable: - for (i = 0; i < num_configs; i++) - (void) miRRSetCrtcConfig(&old_crtc_configs[i]); -fail_save: - RRFreeCrtcConfigs(old_crtc_configs, num_configs); - return FALSE; -} diff --git a/randr/randrstr.h b/randr/randrstr.h index 2fe960234..5e2a3518c 100644 --- a/randr/randrstr.h +++ b/randr/randrstr.h @@ -78,8 +78,6 @@ typedef struct _rrMode RRModeRec, *RRModePtr; typedef struct _rrPropertyValue RRPropertyValueRec, *RRPropertyValuePtr; typedef struct _rrProperty RRPropertyRec, *RRPropertyPtr; typedef struct _rrCrtc RRCrtcRec, *RRCrtcPtr; -typedef struct _rrScreenConfig RRScreenConfigRec, *RRScreenConfigPtr; -typedef struct _rrCrtcConfig RRCrtcConfigRec, *RRCrtcConfigPtr; typedef struct _rrOutput RROutputRec, *RROutputPtr; struct _rrMode { @@ -137,28 +135,6 @@ struct _rrCrtc { struct pict_f_transform f_sprite_image_inverse; /* image from crtc */ }; -struct _rrScreenConfig { - CARD16 screen_pixmap_width; - CARD16 screen_pixmap_height; - CARD16 screen_width; - CARD16 screen_height; - CARD32 mm_width; - CARD32 mm_height; -}; - -struct _rrCrtcConfig { - RRCrtcPtr crtc; - int x, y; - RRModePtr mode; - Rotation rotation; - int numOutputs; - RROutputPtr *outputs; - struct pict_f_transform sprite_position_transform; - struct pict_f_transform sprite_image_transform; - PixmapPtr pixmap; - int pixmap_x, pixmap_y; -}; - struct _rrOutput { RROutput id; ScreenPtr pScreen; @@ -275,11 +251,6 @@ typedef void (*RRGetCrtcSpriteTransformPtr) (ScreenPtr pScreen, struct pict_f_transform *position_transform, struct pict_f_transform *image_transform); -typedef Bool (*RRSetCrtcConfigsPtr) (ScreenPtr screen, - RRScreenConfigPtr screen_config, - RRCrtcConfigPtr crtc_configs, - int num_configs); - typedef struct _rrScrPriv { /* * 'public' part of the structure; DDXen fill this in @@ -305,7 +276,6 @@ typedef struct _rrScrPriv { #endif RRSetCrtcSpriteTransformPtr rrSetCrtcSpriteTransform; RRGetCrtcSpriteTransformPtr rrGetCrtcSpriteTransform; - RRSetCrtcConfigsPtr rrSetCrtcConfigs; /* * Private part of the structure; not considered part of the ABI @@ -458,10 +428,6 @@ RRScreenSizeSet (ScreenPtr pScreen, CARD32 mmWidth, CARD32 mmHeight); -extern _X_EXPORT void -RRScreenCurrentConfig(ScreenPtr screen, - RRScreenConfigPtr screen_config); - /* * Send ConfigureNotify event to root window when 'something' happens */ @@ -705,38 +671,6 @@ extern _X_EXPORT void RRCrtcInitErrorValue (void); /* - * Free a set of crtc configs and their attached output arrays - */ -void -RRFreeCrtcConfigs(RRCrtcConfigPtr configs, int num_configs); - -/* - * Convert the current crtc configuration into an RRCrtcConfig - */ -extern _X_EXPORT Bool -RRCrtcCurrentConfig(RRCrtcPtr crtc, - RRCrtcConfigPtr crtc_config); - -/* - * Figure out whether the specific crtc_config can fit - * within the screen_config - */ -Bool -RRScreenCoversCrtc(RRScreenConfigPtr screen_config, - RRCrtcConfigPtr crtc_config, - RRTransformPtr client_transform, - XID *errorValue); - -/* - * Set a screen and set of crtc configurations in one operation - */ -Bool -RRSetCrtcConfigs(ScreenPtr screen, - RRScreenConfigPtr screen_config, - RRCrtcConfigPtr crtc_configs, - int num_configs); - -/* * Crtc dispatch */ @@ -761,9 +695,6 @@ ProcRRSetCrtcTransform (ClientPtr client); extern _X_EXPORT int ProcRRGetCrtcTransform (ClientPtr client); -extern _X_EXPORT int -ProcRRSetCrtcConfigs (ClientPtr client); - int ProcRRGetPanning (ClientPtr client); @@ -985,27 +916,6 @@ extern _X_EXPORT void RRXineramaExtensionInit(void); #endif -/* mirrcrtc.c */ -Bool -miRRSetScreenConfig(ScreenPtr screen, - RRScreenConfigPtr screen_config); - -Bool -miRRSetCrtcConfig(RRCrtcConfigPtr crtc_config); - -Bool -miRRDisableCrtc(RRCrtcPtr crtc); - -Bool -miRRCheckDisableCrtc(RRScreenConfigPtr new_screen_config, - RRCrtcConfigPtr old_crtc_config); - -Bool -miRRSetCrtcConfigs(ScreenPtr screen, - RRScreenConfigPtr screen_config, - RRCrtcConfigPtr crtc_configs, - int num_configs); - #endif /* _RANDRSTR_H_ */ /* diff --git a/randr/rrcrtc.c b/randr/rrcrtc.c index 1f8f2e662..c2f696332 100644 --- a/randr/rrcrtc.c +++ b/randr/rrcrtc.c @@ -37,7 +37,7 @@ RRCrtcChanged (RRCrtcPtr crtc, Bool layoutChanged) if (pScreen) { rrScrPriv(pScreen); - + pScrPriv->changed = TRUE; /* * Send ConfigureNotify on any layout change @@ -59,19 +59,19 @@ RRCrtcCreate (ScreenPtr pScreen, void *devPrivate) if (!RRInit()) return NULL; - + pScrPriv = rrGetScrPriv(pScreen); /* make space for the crtc pointer */ if (pScrPriv->numCrtcs) - crtcs = realloc(pScrPriv->crtcs, + crtcs = realloc(pScrPriv->crtcs, (pScrPriv->numCrtcs + 1) * sizeof (RRCrtcPtr)); else crtcs = malloc(sizeof (RRCrtcPtr)); if (!crtcs) return FALSE; pScrPriv->crtcs = crtcs; - + crtc = calloc(1, sizeof (RRCrtcRec)); if (!crtc) return NULL; @@ -90,8 +90,6 @@ RRCrtcCreate (ScreenPtr pScreen, void *devPrivate) crtc->devPrivate = devPrivate; RRTransformInit (&crtc->client_pending_transform); RRTransformInit (&crtc->client_current_transform); - pixman_transform_init_identity (&crtc->client_sprite_position_transform); - pixman_transform_init_identity (&crtc->client_sprite_image_transform); pixman_transform_init_identity (&crtc->transform); pixman_f_transform_init_identity (&crtc->f_transform); pixman_f_transform_init_identity (&crtc->f_inverse); @@ -104,7 +102,7 @@ RRCrtcCreate (ScreenPtr pScreen, void *devPrivate) /* attach the screen and crtc together */ crtc->pScreen = pScreen; pScrPriv->crtcs[pScrPriv->numCrtcs++] = crtc; - + return crtc; } @@ -141,7 +139,7 @@ RRCrtcNotify (RRCrtcPtr crtc, RROutputPtr *outputs) { int i, j; - + /* * Check to see if any of the new outputs were * not in the old list and mark them as changed @@ -181,7 +179,7 @@ RRCrtcNotify (RRCrtcPtr crtc, if (numOutputs != crtc->numOutputs) { RROutputPtr *newoutputs; - + if (numOutputs) { if (crtc->numOutputs) @@ -260,7 +258,7 @@ RRDeliverCrtcEvent (ClientPtr client, WindowPtr pWin, RRCrtcPtr crtc) rrScrPriv (pScreen); xRRCrtcChangeNotifyEvent ce; RRModePtr mode = crtc->mode; - + ce.type = RRNotify + RREventBase; ce.subCode = RRNotify_CrtcChange; ce.timestamp = pScrPriv->lastSetTime.milliseconds; @@ -335,7 +333,7 @@ RRCrtcSet (RRCrtcPtr crtc, #if RANDR_12_INTERFACE if (pScrPriv->rrCrtcSet) { - ret = (*pScrPriv->rrCrtcSet) (pScreen, crtc, mode, x, y, + ret = (*pScrPriv->rrCrtcSet) (pScreen, crtc, mode, x, y, rotation, numOutputs, outputs); } else @@ -394,59 +392,6 @@ RRCrtcSet (RRCrtcPtr crtc, return ret; } -void -RRFreeCrtcConfigs(RRCrtcConfigPtr configs, int num_configs) -{ - int i; - - for (i = 0; i < num_configs; i++) - free(configs[i].outputs); - free(configs); -} - -Bool -RRCrtcCurrentConfig(RRCrtcPtr crtc, - RRCrtcConfigPtr crtc_config) -{ - crtc_config->crtc = crtc; - crtc_config->x = crtc->x; - crtc_config->y = crtc->y; - crtc_config->mode = crtc->mode; - crtc_config->rotation = crtc->rotation; - crtc_config->numOutputs = crtc->numOutputs; - crtc_config->outputs = calloc(crtc->numOutputs, sizeof (RROutputPtr)); - if (!crtc_config->outputs) - return FALSE; - memcpy(crtc_config->outputs, crtc->outputs, crtc->numOutputs * sizeof (RROutputPtr)); - crtc_config->sprite_position_transform = crtc->client_sprite_f_position_transform; - crtc_config->sprite_image_transform = crtc->client_sprite_f_image_transform; - - /* XXX add pixmap stuff */ - crtc_config->pixmap = NULL; - crtc_config->pixmap_x = 0; - crtc_config->pixmap_y = 0; - return TRUE; -} - - -/* - * Request that a set of crtcs be configured at the same - * time on a single screen - */ - -Bool -RRSetCrtcConfigs(ScreenPtr screen, - RRScreenConfigPtr screen_config, - RRCrtcConfigPtr crtc_configs, - int num_configs) -{ - rrScrPrivPtr scr_priv = rrGetScrPriv(screen); - - if (!scr_priv) - return FALSE; - return (*scr_priv->rrSetCrtcConfigs)(screen, screen_config, crtc_configs, num_configs); -} - /* * Return crtc transform */ @@ -490,7 +435,7 @@ RRCrtcDestroyResource (pointer value, XID pid) { rrScrPriv(pScreen); int i; - + for (i = 0; i < pScrPriv->numCrtcs; i++) { if (pScrPriv->crtcs[i] == crtc) @@ -523,7 +468,7 @@ RRCrtcGammaSet (RRCrtcPtr crtc, #if RANDR_12_INTERFACE ScreenPtr pScreen = crtc->pScreen; #endif - + memcpy (crtc->gammaRed, red, crtc->gammaSize * sizeof (CARD16)); memcpy (crtc->gammaGreen, green, crtc->gammaSize * sizeof (CARD16)); memcpy (crtc->gammaBlue, blue, crtc->gammaSize * sizeof (CARD16)); @@ -686,44 +631,6 @@ RRCrtcTransformSet (RRCrtcPtr crtc, } /* - * Figure out whether the specific crtc_config can fit - * within the screen_config - */ -Bool -RRScreenCoversCrtc(RRScreenConfigPtr screen_config, - RRCrtcConfigPtr crtc_config, - RRTransformPtr client_transform, - XID *errorValue) -{ - int source_width; - int source_height; - struct pixman_f_transform f_transform; - - RRTransformCompute (crtc_config->x, crtc_config->y, - crtc_config->mode->mode.width, crtc_config->mode->mode.height, - crtc_config->rotation, - client_transform, - &crtc_config->sprite_position_transform, - &crtc_config->sprite_image_transform, - NULL, &f_transform, NULL, NULL, NULL, NULL); - - RRModeGetScanoutSize (crtc_config->mode, &f_transform, - &source_width, &source_height); - if (crtc_config->x + source_width > screen_config->screen_pixmap_width) { - if (errorValue) - *errorValue = crtc_config->x; - return FALSE; - } - - if (crtc_config->y + source_height > screen_config->screen_pixmap_height) { - if (errorValue) - *errorValue = crtc_config->y; - return FALSE; - } - return TRUE; -} - -/* * Initialize crtc type */ Bool @@ -732,7 +639,7 @@ RRCrtcInit (void) RRCrtcType = CreateNewResourceType (RRCrtcDestroyResource, "CRTC"); if (!RRCrtcType) return FALSE; - + return TRUE; } @@ -761,7 +668,7 @@ ProcRRGetCrtcInfo (ClientPtr client) int i, j, k, n; int width, height; BoxRec panned_area; - + REQUEST_SIZE_MATCH(xRRGetCrtcInfoReq); VERIFY_RR_CRTC(stuff->crtc, crtc, DixReadAccess); @@ -772,7 +679,7 @@ ProcRRGetCrtcInfo (ClientPtr client) pScrPriv = rrGetScrPriv(pScreen); mode = crtc->mode; - + rep.type = X_Reply; rep.status = RRSetConfigSuccess; rep.sequenceNumber = client->sequence; @@ -805,7 +712,7 @@ ProcRRGetCrtcInfo (ClientPtr client) if (pScrPriv->outputs[i]->crtcs[j] == crtc) k++; rep.nPossibleOutput = k; - + rep.length = rep.nOutput + rep.nPossibleOutput; extraLen = rep.length << 2; @@ -820,7 +727,7 @@ ProcRRGetCrtcInfo (ClientPtr client) outputs = (RROutput *) extra; possible = (RROutput *) (outputs + rep.nOutput); - + for (i = 0; i < crtc->numOutputs; i++) { outputs[i] = crtc->outputs[i]->id; @@ -837,7 +744,7 @@ ProcRRGetCrtcInfo (ClientPtr client) swapl (&possible[k], n); k++; } - + if (client->swapped) { swaps(&rep.sequenceNumber, n); swapl(&rep.length, n); @@ -858,7 +765,7 @@ ProcRRGetCrtcInfo (ClientPtr client) WriteToClient (client, extraLen, (char *) extra); free(extra); } - + return Success; } @@ -878,10 +785,10 @@ ProcRRSetCrtcConfig (ClientPtr client) TimeStamp time; Rotation rotation; int rc, i, j; - + REQUEST_AT_LEAST_SIZE(xRRSetCrtcConfigReq); numOutputs = (stuff->length - bytes_to_int32(SIZEOF (xRRSetCrtcConfigReq))); - + VERIFY_RR_CRTC(stuff->crtc, crtc, DixSetAttrAccess); if (stuff->mode == None) @@ -904,7 +811,7 @@ ProcRRSetCrtcConfig (ClientPtr client) } else outputs = NULL; - + outputIds = (RROutput *) (stuff + 1); for (i = 0; i < numOutputs; i++) { @@ -927,7 +834,7 @@ ProcRRSetCrtcConfig (ClientPtr client) /* validate mode for this output */ for (j = 0; j < outputs[i]->numModes + outputs[i]->numUserModes; j++) { - RRModePtr m = (j < outputs[i]->numModes ? + RRModePtr m = (j < outputs[i]->numModes ? outputs[i]->modes[j] : outputs[i]->userModes[j - outputs[i]->numModes]); if (m == mode) @@ -962,17 +869,17 @@ ProcRRSetCrtcConfig (ClientPtr client) pScreen = crtc->pScreen; pScrPriv = rrGetScrPriv(pScreen); - + time = ClientTimeToServerTime(stuff->timestamp); configTime = ClientTimeToServerTime(stuff->configTimestamp); - + if (!pScrPriv) { time = currentTime; rep.status = RRSetConfigFailed; goto sendReply; } - + /* * Validate requested rotation */ @@ -1005,7 +912,7 @@ ProcRRSetCrtcConfig (ClientPtr client) free(outputs); return BadMatch; } - + #ifdef RANDR_12_INTERFACE /* * Check screen size bounds if the DDX provides a 1.2 interface @@ -1037,7 +944,7 @@ ProcRRSetCrtcConfig (ClientPtr client) free(outputs); return BadValue; } - + if (stuff->y + source_height > pScreen->height) { client->errorValue = stuff->y; @@ -1047,7 +954,7 @@ ProcRRSetCrtcConfig (ClientPtr client) } #endif } - + if (!RRCrtcSet (crtc, mode, stuff->x, stuff->y, rotation, numOutputs, outputs)) { @@ -1056,17 +963,17 @@ ProcRRSetCrtcConfig (ClientPtr client) } rep.status = RRSetConfigSuccess; pScrPriv->lastSetTime = time; - + sendReply: free(outputs); - + rep.type = X_Reply; /* rep.status has already been filled in */ rep.length = 0; rep.sequenceNumber = client->sequence; rep.newTimestamp = pScrPriv->lastSetTime.milliseconds; - if (client->swapped) + if (client->swapped) { int n; swaps(&rep.sequenceNumber, n); @@ -1074,7 +981,7 @@ sendReply: swapl(&rep.newTimestamp, n); } WriteToClient(client, sizeof(xRRSetCrtcConfigReply), (char *)&rep); - + return Success; } @@ -1090,7 +997,7 @@ ProcRRGetPanning (ClientPtr client) BoxRec tracking; INT16 border[4]; int n; - + REQUEST_SIZE_MATCH(xRRGetPanningReq); VERIFY_RR_CRTC(stuff->crtc, crtc, DixReadAccess); @@ -1160,7 +1067,7 @@ ProcRRSetPanning (ClientPtr client) BoxRec tracking; INT16 border[4]; int n; - + REQUEST_SIZE_MATCH(xRRSetPanningReq); VERIFY_RR_CRTC(stuff->crtc, crtc, DixReadAccess); @@ -1175,9 +1082,9 @@ ProcRRSetPanning (ClientPtr client) rep.status = RRSetConfigFailed; goto sendReply; } - + time = ClientTimeToServerTime(stuff->timestamp); - + if (!pScrPriv->rrGetPanning) return RRErrorBase + BadRRCrtc; @@ -1253,7 +1160,7 @@ ProcRRGetCrtcGamma (ClientPtr client) int n; unsigned long len; char *extra = NULL; - + REQUEST_SIZE_MATCH(xRRGetCrtcGammaReq); VERIFY_RR_CRTC(stuff->crtc, crtc, DixReadAccess); @@ -1262,7 +1169,7 @@ ProcRRGetCrtcGamma (ClientPtr client) return RRErrorBase + BadRRCrtc; len = crtc->gammaSize * 3 * 2; - + if (crtc->gammaSize) { extra = malloc(len); if (!extra) @@ -1296,21 +1203,21 @@ ProcRRSetCrtcGamma (ClientPtr client) RRCrtcPtr crtc; unsigned long len; CARD16 *red, *green, *blue; - + REQUEST_AT_LEAST_SIZE(xRRSetCrtcGammaReq); VERIFY_RR_CRTC(stuff->crtc, crtc, DixReadAccess); - + len = client->req_len - bytes_to_int32(sizeof (xRRSetCrtcGammaReq)); if (len < (stuff->size * 3 + 1) >> 1) return BadLength; if (stuff->size != crtc->gammaSize) return BadMatch; - + red = (CARD16 *) (stuff + 1); green = red + crtc->gammaSize; blue = green + crtc->gammaSize; - + RRCrtcGammaSet (crtc, red, green, blue); return Success; @@ -1351,7 +1258,7 @@ ProcRRSetCrtcTransform (ClientPtr client) #define CrtcTransformExtra (SIZEOF(xRRGetCrtcTransformReply) - 32) - + static int transform_filter_length (RRTransformPtr transform) { @@ -1453,336 +1360,3 @@ ProcRRGetCrtcTransform (ClientPtr client) free(reply); return Success; } - -static void -pixman_f_transform_from_xRenderTransform(struct pixman_f_transform *f_transform, - xRenderTransform *x_transform) -{ - struct pixman_transform transform; - PictTransform_from_xRenderTransform(&transform, x_transform); - pixman_f_transform_from_pixman_transform(f_transform, &transform); -} - -static int -RRConvertCrtcConfig(ClientPtr client, ScreenPtr screen, - RRScreenConfigPtr screen_config, - RRCrtcConfigPtr config, xRRCrtcConfig *x, - RROutput *outputIds) -{ - RRCrtcPtr crtc; - RROutputPtr *outputs; - rrScrPrivPtr scr_priv; - RRModePtr mode; - PixmapPtr pixmap; - int rc, i, j; - Rotation rotation; - - VERIFY_RR_CRTC(x->crtc, crtc, DixSetAttrAccess); - - if (x->mode == None) - { - mode = NULL; - if (x->nOutput > 0) - return BadMatch; - } - else - { - VERIFY_RR_MODE(x->mode, mode, DixSetAttrAccess); - if (x->nOutput == 0) - return BadMatch; - } - if (x->nOutput) - { - outputs = malloc(x->nOutput * sizeof (RROutputPtr)); - if (!outputs) - return BadAlloc; - } - else - outputs = NULL; - - if (x->pixmap == None) - pixmap = NULL; - else - { - rc = dixLookupResourceByType((pointer *) &pixmap, x->pixmap, - RT_PIXMAP, client, DixWriteAccess); - if (rc != Success) { - free(outputs); - return rc; - } - /* XXX check to make sure this is a scanout pixmap */ - } - - for (i = 0; i < x->nOutput; i++) - { - rc = dixLookupResourceByType((pointer *)(outputs + i), outputIds[i], - RROutputType, client, DixSetAttrAccess); - if (rc != Success) - { - free(outputs); - return rc; - } - /* validate crtc for this output */ - for (j = 0; j < outputs[i]->numCrtcs; j++) - if (outputs[i]->crtcs[j] == crtc) - break; - if (j == outputs[i]->numCrtcs) - { - free(outputs); - return BadMatch; - } - /* validate mode for this output */ - for (j = 0; j < outputs[i]->numModes + outputs[i]->numUserModes; j++) - { - RRModePtr m = (j < outputs[i]->numModes ? - outputs[i]->modes[j] : - outputs[i]->userModes[j - outputs[i]->numModes]); - if (m == mode) - break; - } - if (j == outputs[i]->numModes + outputs[i]->numUserModes) - { - free(outputs); - return BadMatch; - } - } - /* validate clones */ - for (i = 0; i < x->nOutput; i++) - { - for (j = 0; j < x->nOutput; j++) - { - int k; - if (i == j) - continue; - for (k = 0; k < outputs[i]->numClones; k++) - { - if (outputs[i]->clones[k] == outputs[j]) - break; - } - if (k == outputs[i]->numClones) - { - free(outputs); - return BadMatch; - } - } - } - - if (crtc->pScreen != screen) - return BadMatch; - - scr_priv = rrGetScrPriv(screen); - - config->crtc = crtc; - config->x = x->x; - config->y = x->y; - config->mode = mode; - config->rotation = x->rotation; - config->numOutputs = x->nOutput; - config->outputs = outputs; - pixman_f_transform_from_xRenderTransform(&config->sprite_position_transform, - &x->spritePositionTransform); - pixman_f_transform_from_xRenderTransform(&config->sprite_image_transform, - &x->spriteImageTransform); - config->pixmap = pixmap; - config->pixmap_x = x->xPixmap; - config->pixmap_y = x->yPixmap; - - /* - * Validate requested rotation - */ - rotation = (Rotation) x->rotation; - - /* test the rotation bits only! */ - switch (rotation & 0xf) { - case RR_Rotate_0: - case RR_Rotate_90: - case RR_Rotate_180: - case RR_Rotate_270: - break; - default: - /* - * Invalid rotation - */ - client->errorValue = x->rotation; - free(outputs); - return BadValue; - } - - if (mode) - { - if ((~crtc->rotations) & rotation) - { - /* - * requested rotation or reflection not supported by screen - */ - client->errorValue = x->rotation; - free(outputs); - return BadMatch; - } - - /* - * If scanning out from another pixmap, make sure the mode - * fits - */ - if (pixmap) - { - if (x->xPixmap + mode->mode.width > pixmap->drawable.width) { - client->errorValue = x->xPixmap; - free(outputs); - return BadValue; - } - if (x->yPixmap + mode->mode.height > pixmap->drawable.height) { - client->errorValue = x->yPixmap; - free(outputs); - return BadValue; - } - } - /* - * Check screen size bounds if the DDX provides a 1.2 interface - * for setting screen size. Else, assume the CrtcSet sets - * the size along with the mode. If the driver supports transforms, - * then it must allow crtcs to display a subset of the screen, so - * only do this check for drivers without transform support. - */ - else if (scr_priv->rrScreenSetSize && !crtc->transforms) - { - if (!RRScreenCoversCrtc(screen_config, config, - &crtc->client_pending_transform, - &client->errorValue)) - { - free(outputs); - return BadValue; - } - } - } - - return Success; -} - -int -ProcRRSetCrtcConfigs (ClientPtr client) -{ - REQUEST(xRRSetCrtcConfigsReq); - xRRSetCrtcConfigsReply rep; - DrawablePtr drawable; - ScreenPtr screen; - rrScrPrivPtr scr_priv; - xRRCrtcConfig *x_configs; - RRScreenConfigRec screen_config; - RRCrtcConfigPtr configs; - RROutput *output_ids; - int num_configs; - int rc, i; - int extra_len; - int num_output_ids; - - REQUEST_AT_LEAST_SIZE(xRRSetCrtcConfigsReq); - - extra_len = client->req_len - bytes_to_int32(sizeof(xRRSetCrtcConfigsReq)); - - num_configs = stuff->nConfigs; - - /* Check request length against number of configs specified */ - if (num_configs * (sizeof (xRRCrtcConfig) >> 2) > extra_len) - return BadLength; - - extra_len -= num_configs * (sizeof (xRRCrtcConfig) >> 2); - x_configs = (xRRCrtcConfig *) (stuff + 1); - - /* Check remaining request length against number of outputs */ - num_output_ids = 0; - for (i = 0; i < num_configs; i++) - num_output_ids += x_configs[i].nOutput; - - if (extra_len != num_output_ids) - return BadLength; - - rc = dixLookupDrawable(&drawable, stuff->drawable, client, 0, DixGetAttrAccess); - if (rc != Success) - return rc; - - screen = drawable->pScreen; - - scr_priv = rrGetScrPriv(screen); - - if (!scr_priv) - { - rep.status = RRSetConfigFailed; - goto sendReply; - } - - if (stuff->widthInMillimeters == 0 || stuff->heightInMillimeters == 0) - { - client->errorValue = 0; - return BadValue; - } - - if (stuff->screenPixmapWidth < scr_priv->minWidth || - scr_priv->maxWidth < stuff->screenPixmapWidth) - { - client->errorValue = stuff->screenPixmapWidth; - return BadValue; - } - if (stuff->screenPixmapHeight < scr_priv->minHeight || - scr_priv->maxHeight < stuff->screenPixmapHeight) - { - client->errorValue = stuff->screenPixmapHeight; - return BadValue; - } - - screen_config.screen_pixmap_width = stuff->screenPixmapWidth; - screen_config.screen_pixmap_height = stuff->screenPixmapHeight; - screen_config.screen_width = stuff->screenWidth; - screen_config.screen_height = stuff->screenHeight; - screen_config.mm_width = stuff->widthInMillimeters; - screen_config.mm_height = stuff->heightInMillimeters; - - if (num_configs == 0) - return Success; - - output_ids = (RROutput *) (x_configs + num_configs); - - /* - * Convert protocol crtc configurations into - * server crtc configurations - */ - configs = calloc(num_configs, sizeof (RRCrtcConfigRec)); - if (!configs) - return BadAlloc; - for (i = 0; i < num_configs; i++) { - rc = RRConvertCrtcConfig(client, screen, &screen_config, - &configs[i], - &x_configs[i], output_ids); - if (rc != Success) { - rep.status = RRSetConfigFailed; - goto sendReply; - } - output_ids += x_configs[i].nOutput; - } - - if (!RRSetCrtcConfigs (screen, &screen_config, configs, num_configs)) - { - rep.status = RRSetConfigFailed; - goto sendReply; - } - rep.status = RRSetConfigSuccess; - scr_priv->lastSetTime = currentTime; - -sendReply: - RRFreeCrtcConfigs(configs, num_configs); - - rep.type = X_Reply; - /* rep.status has already been filled in */ - rep.length = 0; - rep.sequenceNumber = client->sequence; - - if (client->swapped) - { - int n; - swaps(&rep.sequenceNumber, n); - swapl(&rep.length, n); - } - WriteToClient(client, sizeof(xRRSetCrtcConfigsReply), (char *)&rep); - - return Success; -} diff --git a/randr/rrscreen.c b/randr/rrscreen.c index af09f6852..1bc1a9ea1 100644 --- a/randr/rrscreen.c +++ b/randr/rrscreen.c @@ -191,24 +191,6 @@ RRScreenSizeSet (ScreenPtr pScreen, } /* - * Compute an RRScreenConfig from the current screen information - */ -void -RRScreenCurrentConfig(ScreenPtr screen, - RRScreenConfigPtr screen_config) -{ - PixmapPtr screen_pixmap = screen->GetScreenPixmap(screen); - WindowPtr root = screen->root; - - screen_config->screen_pixmap_width = screen_pixmap->drawable.width; - screen_config->screen_pixmap_height = screen_pixmap->drawable.height; - screen_config->screen_width = root->drawable.width; - screen_config->screen_height = root->drawable.height; - screen_config->mm_width = screen->mmWidth; - screen_config->mm_height = screen->mmHeight; -} - -/* * Retrieve valid screen size range */ int |