Lines Matching refs:crtc
33 * Notify the CRTC of some change
36 RRCrtcChanged(RRCrtcPtr crtc, Bool layoutChanged)
38 ScreenPtr pScreen = crtc->pScreen;
40 crtc->changed = TRUE;
54 * Create a CRTC
59 RRCrtcPtr crtc;
68 /* make space for the crtc pointer */
75 crtc = calloc(1, sizeof(RRCrtcRec));
76 if (!crtc)
78 crtc->id = FakeClientID(0);
79 crtc->pScreen = pScreen;
80 crtc->mode = NULL;
81 crtc->x = 0;
82 crtc->y = 0;
83 crtc->rotation = RR_Rotate_0;
84 crtc->rotations = RR_Rotate_0;
85 crtc->outputs = NULL;
86 crtc->numOutputs = 0;
87 crtc->gammaSize = 0;
88 crtc->gammaRed = crtc->gammaBlue = crtc->gammaGreen = NULL;
89 crtc->changed = FALSE;
90 crtc->devPrivate = devPrivate;
91 RRTransformInit(&crtc->client_pending_transform);
92 RRTransformInit(&crtc->client_current_transform);
93 pixman_transform_init_identity(&crtc->transform);
94 pixman_f_transform_init_identity(&crtc->f_transform);
95 pixman_f_transform_init_identity(&crtc->f_inverse);
97 if (!AddResource(crtc->id, RRCrtcType, (void *) crtc))
100 /* attach the screen and crtc together */
101 crtc->pScreen = pScreen;
102 pScrPriv->crtcs[pScrPriv->numCrtcs++] = crtc;
106 return crtc;
110 * Set the allowed rotations on a CRTC
113 RRCrtcSetRotations(RRCrtcPtr crtc, Rotation rotations)
115 crtc->rotations = rotations;
119 * Set whether transforms are allowed on a CRTC
122 RRCrtcSetTransformSupport(RRCrtcPtr crtc, Bool transforms)
124 crtc->transforms = transforms;
128 * Notify the extension that the Crtc has been reconfigured,
132 RRCrtcNotify(RRCrtcPtr crtc,
146 for (j = 0; j < crtc->numOutputs; j++)
147 if (outputs[i] == crtc->outputs[j])
149 if (j == crtc->numOutputs) {
150 outputs[i]->crtc = crtc;
152 RRCrtcChanged(crtc, FALSE);
159 for (j = 0; j < crtc->numOutputs; j++) {
161 if (outputs[i] == crtc->outputs[j])
164 if (crtc->outputs[j]->crtc == crtc)
165 crtc->outputs[j]->crtc = NULL;
166 RROutputChanged(crtc->outputs[j], FALSE);
167 RRCrtcChanged(crtc, FALSE);
171 * Reallocate the crtc output array if necessary
173 if (numOutputs != crtc->numOutputs) {
177 if (crtc->numOutputs)
178 newoutputs = reallocarray(crtc->outputs,
186 free(crtc->outputs);
189 crtc->outputs = newoutputs;
190 crtc->numOutputs = numOutputs;
193 * Copy the new list of outputs into the crtc
195 memcpy(crtc->outputs, outputs, numOutputs * sizeof(RROutputPtr));
197 * Update remaining crtc fields
199 if (mode != crtc->mode) {
200 if (crtc->mode)
201 RRModeDestroy(crtc->mode);
202 crtc->mode = mode;
205 RRCrtcChanged(crtc, TRUE);
207 if (x != crtc->x) {
208 crtc->x = x;
209 RRCrtcChanged(crtc, TRUE);
211 if (y != crtc->y) {
212 crtc->y = y;
213 RRCrtcChanged(crtc, TRUE);
215 if (rotation != crtc->rotation) {
216 crtc->rotation = rotation;
217 RRCrtcChanged(crtc, TRUE);
219 if (!RRTransformEqual(transform, &crtc->client_current_transform)) {
220 RRTransformCopy(&crtc->client_current_transform, transform);
221 RRCrtcChanged(crtc, TRUE);
223 if (crtc->changed && mode) {
227 &crtc->client_current_transform,
228 &crtc->transform, &crtc->f_transform,
229 &crtc->f_inverse);
235 RRDeliverCrtcEvent(ClientPtr client, WindowPtr pWin, RRCrtcPtr crtc)
240 RRModePtr mode = crtc->mode;
247 .crtc = crtc->id,
249 .rotation = crtc->rotation,
250 .x = mode ? crtc->x : 0,
251 .y = mode ? crtc->y : 0,
259 RRCrtcPendingProperties(RRCrtcPtr crtc)
261 ScreenPtr pScreen = crtc->pScreen;
269 if (output->crtc == crtc && output->pendingProperties)
276 cursor_bounds(RRCrtcPtr crtc, int *left, int *right, int *top, int *bottom)
278 rrScrPriv(crtc->pScreen);
281 if (crtc->mode == NULL)
286 pScrPriv->rrGetPanning(crtc->pScreen, crtc, NULL, &bounds, NULL);
291 bounds.x2 = crtc->mode->mode.width;
292 bounds.y2 = crtc->mode->mode.height;
295 pixman_f_transform_bounds(&crtc->f_transform, &bounds);
354 /* Find first enabled CRTC and start search for reachable CRTCs from it */
375 rrDestroySharedPixmap(RRCrtcPtr crtc, PixmapPtr pPixmap) {
376 ScreenPtr primary = crtc->pScreen->current_primary;
389 crtc->pScreen->DestroyPixmap(pPixmap);
393 RRCrtcDetachScanoutPixmap(RRCrtcPtr crtc)
395 rrScrPriv(crtc->pScreen);
397 if (crtc->scanout_pixmap) {
398 ScreenPtr primary = crtc->pScreen->current_primary;
401 if (crtc->scanout_pixmap_back) {
402 pScrPriv->rrDisableSharedPixmapFlipping(crtc);
406 crtc->scanout_pixmap,
407 crtc->scanout_pixmap_back);
410 rrDestroySharedPixmap(crtc, crtc->scanout_pixmap_back);
411 crtc->scanout_pixmap_back = NULL;
414 pScrPriv->rrCrtcSetScanoutPixmap(crtc, NULL);
418 crtc->scanout_pixmap);
422 rrDestroySharedPixmap(crtc, crtc->scanout_pixmap);
423 crtc->scanout_pixmap = NULL;
426 RRCrtcChanged(crtc, TRUE);
430 rrCreateSharedPixmap(RRCrtcPtr crtc, ScreenPtr primary,
441 spix = PixmapShareToSecondary(mpix, crtc->pScreen);
501 rrSetupPixmapSharing(RRCrtcPtr crtc, int width, int height,
505 ScreenPtr primary = crtc->pScreen->current_primary;
507 rrScrPrivPtr pSecondaryScrPriv = rrGetScrPriv(crtc->pScreen);
531 if (crtc->scanout_pixmap)
532 RRCrtcDetachScanoutPixmap(crtc);
538 spix_front = rrCreateSharedPixmap(crtc, primary,
554 PixmapPtr spix_back = rrCreateSharedPixmap(crtc, primary,
560 if (!pSecondaryScrPriv->rrEnableSharedPixmapFlipping(crtc,
564 crtc
565 crtc->scanout_pixmap_back = spix_back;
567 if (!pPrimaryScrPriv->rrStartFlippingPixmapTracking(crtc,
573 pSecondaryScrPriv->rrDisableSharedPixmapFlipping(crtc);
583 rrDestroySharedPixmap(crtc, spix_back);
585 crtc->scanout_pixmap = NULL;
586 crtc->scanout_pixmap_back = NULL;
596 if (!pSecondaryScrPriv->rrCrtcSetScanoutPixmap(crtc, spix_front)) {
597 rrDestroySharedPixmap(crtc, spix_front);
601 crtc->scanout_pixmap = spix_front;
608 static void crtc_to_box(BoxPtr box, RRCrtcPtr crtc)
610 box->x1 = crtc->x;
611 box->y1 = crtc->y;
612 switch (crtc->rotation) {
616 box->x2 = crtc->x + crtc->mode->mode.width;
617 box->y2 = crtc->y + crtc->mode->mode.height;
621 box->x2 = crtc->x + crtc->mode->mode.height;
622 box->y2 = crtc->y + crtc->mode->mode.width;
647 RRCrtcPtr crtc = pScrPriv->crtcs[c];
649 if (crtc == rr_crtc) {
661 if (!crtc->mode)
663 crtc_to_box(&newbox, crtc);
721 * Request that the Crtc be reconfigured
724 RRCrtcSet(RRCrtcPtr crtc,
729 ScreenPtr pScreen = crtc->pScreen;
739 if (outputs[o] && outputs[o]->crtc != crtc) {
746 if (crtc->mode == mode &&
747 crtc->x == x &&
748 crtc->y == y &&
749 crtc->rotation == rotation &&
750 crtc->numOutputs == numOutputs &&
751 !memcmp(crtc->outputs, outputs, numOutputs * sizeof(RROutputPtr)) &&
752 !RRCrtcPendingProperties(crtc) && !RRCrtcPendingTransform(crtc) &&
766 ret = rrCheckPixmapBounding(primary, crtc,
773 ret = rrSetupPixmapSharing(crtc, width, height,
780 ret = (*pScrPriv->rrCrtcSet) (pScreen, crtc, mode, x, y,
792 RRCrtcNotify(crtc, NULL, x, y, rotation, NULL, 0, NULL);
816 RRCrtcNotify(crtc, mode, x, y, rotation, NULL, 1,
840 * Return crtc transform
843 RRCrtcGetTransform(RRCrtcPtr crtc)
845 RRTransformPtr transform = &crtc->client_pending_transform;
856 RRCrtcPendingTransform(RRCrtcPtr crtc)
858 return !RRTransformEqual(&crtc->client_current_transform,
859 &crtc->client_pending_transform);
863 * Destroy a Crtc at shutdown
866 RRCrtcDestroy(RRCrtcPtr crtc)
868 FreeResource(crtc->id, 0);
874 RRCrtcPtr crtc = (RRCrtcPtr) value;
875 ScreenPtr pScreen = crtc->pScreen;
885 if (lease->crtcs[c] == crtc) {
893 if (pScrPriv->crtcs[i] == crtc) {
904 if (crtc->scanout_pixmap)
905 RRCrtcDetachScanoutPixmap(crtc);
906 free(crtc->gammaRed);
907 if (crtc->mode)
908 RRModeDestroy(crtc->mode);
909 free(crtc->outputs);
910 free(crtc);
915 * Request that the Crtc gamma be changed
919 RRCrtcGammaSet(RRCrtcPtr crtc, CARD16 *red, CARD16 *green, CARD16 *blue)
924 ScreenPtr pScreen = crtc->pScreen;
927 memcpy(crtc->gammaRed, red, crtc->gammaSize * sizeof(CARD16));
928 memcpy(crtc->gammaGreen, green, crtc->gammaSize * sizeof(CARD16));
929 memcpy(crtc->gammaBlue, blue, crtc->gammaSize * sizeof(CARD16));
934 ret = (*pScrPriv->rrCrtcSetGamma) (pScreen, crtc);
945 RRCrtcGammaGet(RRCrtcPtr crtc)
950 ScreenPtr pScreen = crtc->pScreen;
957 ret = (*pScrPriv->rrCrtcGetGamma) (pScreen, crtc);
1005 * Notify the extension that the Crtc gamma has been changed
1011 RRCrtcGammaNotify(RRCrtcPtr crtc)
1039 * Returns the width/height that the crtc scans out from the framebuffer
1042 RRCrtcGetScanoutSize(RRCrtcPtr crtc, int *width, int *height)
1044 RRModeGetScanoutSize(crtc->mode, &crtc->transform, width, height);
1052 RRCrtcGammaSetSize(RRCrtcPtr crtc, int size)
1056 if (size == crtc->gammaSize)
1065 free(crtc->gammaRed);
1066 crtc->gammaRed = gamma;
1067 crtc->gammaGreen = gamma + size;
1068 crtc->gammaBlue = gamma + size * 2;
1069 crtc->gammaSize = size;
1074 * Set the pending CRTC transformation
1078 RRCrtcTransformSet(RRCrtcPtr crtc,
1088 if (!crtc->transforms)
1092 filter = PictureFindFilter(crtc->pScreen, filter_name, filter_len);
1096 if (!filter->ValidateParams(crtc->pScreen, filter->id,
1109 if (!RRTransformSetFilter(&crtc->client_pending_transform,
1113 crtc->client_pending_transform.transform = *transform;
1114 crtc->client_pending_transform.f_transform = *f_transform;
1115 crtc->client_pending_transform.f_inverse = *f_inverse;
1120 * Initialize crtc type
1125 RRCrtcType = CreateNewResourceType(RRCrtcDestroyResource, "CRTC");
1133 * Initialize crtc type error value
1146 RRCrtcPtr crtc;
1160 VERIFY_RR_CRTC(stuff->crtc, crtc, DixReadAccess);
1162 leased = RRCrtcIsLeased(crtc);
1167 pScreen = crtc->pScreen;
1170 mode = crtc->mode;
1190 pScrPriv->rrGetPanning(pScreen, crtc, &panned_area, NULL, NULL) &&
1199 RRCrtcGetScanoutSize(crtc, &width, &height);
1200 rep.x = crtc->x;
1201 rep.y = crtc->y;
1206 rep.rotation = crtc->rotation;
1207 rep.rotations = crtc->rotations;
1208 rep.nOutput = crtc->numOutputs;
1213 if (pScrPriv->outputs[i]->crtcs[j] == crtc)
1232 for (i = 0; i < crtc->numOutputs; i++) {
1233 outputs[i] = crtc->outputs[i]->id;
1241 if (pScrPriv->outputs[i]->crtcs[j] == crtc) {
1281 RRCrtcPtr crtc;
1294 VERIFY_RR_CRTC(stuff->crtc, crtc, DixSetAttrAccess);
1296 if (RRCrtcIsLeased(crtc))
1331 /* validate crtc for this output */
1333 if (outputs[i]->crtcs[j] == crtc)
1370 pScreen = crtc->pScreen;
1403 if ((~crtc->rotations) & rotation) {
1420 if (pScrPriv->rrScreenSetSize && !crtc->transforms) {
1439 &crtc->client_pending_transform,
1459 if (!RRCrtcSet(crtc, mode, stuff->x, stuff->y,
1493 RRCrtcPtr crtc;
1501 VERIFY_RR_CRTC(stuff->crtc, crtc, DixReadAccess);
1506 pScreen = crtc->pScreen;
1521 pScrPriv->rrGetPanning(pScreen, crtc, &total, &tracking, border)) {
1562 RRCrtcPtr crtc;
1572 VERIFY_RR_CRTC(stuff->crtc, crtc, DixReadAccess);
1574 if (RRCrtcIsLeased(crtc))
1580 pScreen = crtc->pScreen;
1607 if (!pScrPriv->rrSetPanning(pScreen, crtc, &total, &tracking, border))
1637 RRCrtcPtr crtc;
1640 VERIFY_RR_CRTC(stuff->crtc, crtc, DixReadAccess);
1643 if (!RRCrtcGammaGet(crtc))
1650 .size = crtc->gammaSize
1666 RRCrtcPtr crtc;
1671 VERIFY_RR_CRTC(stuff->crtc, crtc, DixReadAccess);
1674 if (!RRCrtcGammaGet(crtc))
1677 len = crtc->gammaSize * 3 * 2;
1679 if (crtc->gammaSize) {
1689 .size = crtc->gammaSize
1697 if (crtc->gammaSize) {
1698 memcpy(extra, crtc->gammaRed, len);
1710 RRCrtcPtr crtc;
1715 VERIFY_RR_CRTC(stuff->crtc, crtc, DixReadAccess);
1717 if (RRCrtcIsLeased(crtc))
1724 if (stuff->size != crtc->gammaSize)
1728 green = red + crtc->gammaSize;
1729 blue = green + crtc->gammaSize;
1731 RRCrtcGammaSet(crtc, red, green, blue);
1742 RRCrtcPtr crtc;
1751 VERIFY_RR_CRTC(stuff->crtc, crtc, DixReadAccess);
1753 if (RRCrtcIsLeased(crtc))
1768 return RRCrtcTransformSet(crtc, &transform, &f_transform, &f_inverse,
1829 RRCrtcPtr crtc;
1835 VERIFY_RR_CRTC(stuff->crtc, crtc, DixReadAccess);
1837 pending = &crtc->client_pending_transform;
1838 current = &crtc->client_current_transform;
1852 reply->hasTransforms = crtc->transforms;
1879 RRCrtcPtr crtc = pScrPriv->crtcs[i];
1883 if (!cursor_bounds(crtc, &left, &right, &top, &bottom))
1898 /* if we're trying to escape, clamp to the CRTC we're coming from */
1900 RRCrtcPtr crtc = pScrPriv->crtcs[i];
1904 if (!cursor_bounds(crtc, &left, &right, &top, &bottom))
1937 /* if we're moving inside a crtc, we're fine */
1951 /* if we're trying to escape, clamp to the CRTC we're coming from */
1979 RRCrtcPtr crtc = pScrPriv->crtcs[i];
1982 saved_scanout_pixmap[i] = crtc->scanout_pixmap;
1984 if (!crtc->mode && enable)
1986 if (!crtc->scanout_pixmap && !enable)
1990 if (crtc->scanout_pixmap_back) {
1995 size_fits = (crtc->mode &&
1996 crtc->x == pDrawable->x &&
1997 crtc->y == pDrawable->y &&
1998 crtc->mode->mode.width == pDrawable->width &&
1999 crtc->mode->mode.height == pDrawable->height);
2002 if (crtc->scanout_pixmap == pPixmap) {
2006 crtc->scanout_pixmap = NULL;
2010 crtc->scanout_pixmap = NULL;
2011 pScrPriv->rrCrtcSetScanoutPixmap(crtc, crtc->scanout_pixmap);
2013 (*pScrPriv->rrCrtcSet) (pDrawable->pScreen, crtc, crtc->mode, crtc->x, crtc->y,
2014 crtc->rotation, crtc->numOutputs, crtc->outputs);
2015 saved_scanout_pixmap[i] = crtc->scanout_pixmap;
2026 crtc->scanout_pixmap = pPixmap;
2034 RRCrtcPtr crtc = pScrPriv->crtcs[i];
2036 if (crtc->scanout_pixmap == saved_scanout_pixmap[i])
2040 pScrPriv->rrCrtcSetScanoutPixmap(crtc, crtc->scanout_pixmap);
2042 (*pScrPriv->rrCrtcSet) (pDrawable->pScreen, crtc, crtc->mode, crtc->x, crtc->y,
2043 crtc->rotation, crtc->numOutputs, crtc->outputs);
2046 crtc->scanout_pixmap = saved_scanout_pixmap[i];
2069 RRCrtcPtr crtc = pScrPriv->crtcs[i];
2071 if (crtc->scanout_pixmap)