1 /* 2 * Copyright © 2000 Compaq Computer Corporation 3 * Copyright © 2002 Hewlett-Packard Company 4 * Copyright © 2006 Intel Corporation 5 * Copyright © 2008 Red Hat, Inc. 6 * 7 * Permission to use, copy, modify, distribute, and sell this software and its 8 * documentation for any purpose is hereby granted without fee, provided that 9 * the above copyright notice appear in all copies and that both that copyright 10 * notice and this permission notice appear in supporting documentation, and 11 * that the name of the copyright holders not be used in advertising or 12 * publicity pertaining to distribution of the software without specific, 13 * written prior permission. The copyright holders make no representations 14 * about the suitability of this software for any purpose. It is provided "as 15 * is" without express or implied warranty. 16 * 17 * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, 18 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO 19 * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR 20 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, 21 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 22 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 23 * OF THIS SOFTWARE. 24 * 25 * Author: Jim Gettys, Hewlett-Packard Company, Inc. 26 * Keith Packard, Intel Corporation 27 */ 28 29 #ifdef HAVE_DIX_CONFIG_H 30 #include <dix-config.h> 31 #endif 32 33 #ifndef _RANDRSTR_H_ 34 #define _RANDRSTR_H_ 35 36 #include <X11/X.h> 37 #include <X11/Xproto.h> 38 #include "misc.h" 39 #include "os.h" 40 #include "dixstruct.h" 41 #include "resource.h" 42 #include "scrnintstr.h" 43 #include "windowstr.h" 44 #include "pixmapstr.h" 45 #include "extnsionst.h" 46 #include "servermd.h" 47 #include "rrtransform.h" 48 #include <X11/extensions/randr.h> 49 #include <X11/extensions/randrproto.h> 50 #include <X11/extensions/render.h> /* we share subpixel order information */ 51 #include "picturestr.h" 52 #include <X11/Xfuncproto.h> 53 54 /* required for ABI compatibility for now */ 55 #define RANDR_10_INTERFACE 1 56 #define RANDR_12_INTERFACE 1 57 #define RANDR_13_INTERFACE 1 /* requires RANDR_12_INTERFACE */ 58 #define RANDR_GET_CRTC_INTERFACE 1 59 60 #define RANDR_INTERFACE_VERSION 0x0104 61 62 typedef XID RRMode; 63 typedef XID RROutput; 64 typedef XID RRCrtc; 65 typedef XID RRProvider; 66 typedef XID RRLease; 67 68 extern int RREventBase, RRErrorBase; 69 70 extern int (*ProcRandrVector[RRNumberRequests]) (ClientPtr); 71 extern int (*SProcRandrVector[RRNumberRequests]) (ClientPtr); 72 73 /* 74 * Modeline for a monitor. Name follows directly after this struct 75 */ 76 77 #define RRModeName(pMode) ((char *) (pMode + 1)) 78 typedef struct _rrMode RRModeRec, *RRModePtr; 79 typedef struct _rrPropertyValue RRPropertyValueRec, *RRPropertyValuePtr; 80 typedef struct _rrProperty RRPropertyRec, *RRPropertyPtr; 81 typedef struct _rrCrtc RRCrtcRec, *RRCrtcPtr; 82 typedef struct _rrOutput RROutputRec, *RROutputPtr; 83 typedef struct _rrProvider RRProviderRec, *RRProviderPtr; 84 typedef struct _rrMonitor RRMonitorRec, *RRMonitorPtr; 85 typedef struct _rrLease RRLeaseRec, *RRLeasePtr; 86 87 struct _rrMode { 88 int refcnt; 89 xRRModeInfo mode; 90 char *name; 91 ScreenPtr userScreen; 92 }; 93 94 struct _rrPropertyValue { 95 Atom type; /* ignored by server */ 96 short format; /* format of data for swapping - 8,16,32 */ 97 long size; /* size of data in (format/8) bytes */ 98 void *data; /* private to client */ 99 }; 100 101 struct _rrProperty { 102 RRPropertyPtr next; 103 ATOM propertyName; 104 Bool is_pending; 105 Bool range; 106 Bool immutable; 107 int num_valid; 108 INT32 *valid_values; 109 RRPropertyValueRec current, pending; 110 }; 111 112 struct _rrCrtc { 113 RRCrtc id; 114 ScreenPtr pScreen; 115 RRModePtr mode; 116 int x, y; 117 Rotation rotation; 118 Rotation rotations; 119 Bool changed; 120 int numOutputs; 121 RROutputPtr *outputs; 122 int gammaSize; 123 CARD16 *gammaRed; 124 CARD16 *gammaBlue; 125 CARD16 *gammaGreen; 126 void *devPrivate; 127 Bool transforms; 128 RRTransformRec client_pending_transform; 129 RRTransformRec client_current_transform; 130 PictTransform transform; 131 struct pict_f_transform f_transform; 132 struct pict_f_transform f_inverse; 133 134 PixmapPtr scanout_pixmap; 135 PixmapPtr scanout_pixmap_back; 136 }; 137 138 struct _rrOutput { 139 RROutput id; 140 ScreenPtr pScreen; 141 char *name; 142 int nameLength; 143 CARD8 connection; 144 CARD8 subpixelOrder; 145 int mmWidth; 146 int mmHeight; 147 RRCrtcPtr crtc; 148 int numCrtcs; 149 RRCrtcPtr *crtcs; 150 int numClones; 151 RROutputPtr *clones; 152 int numModes; 153 int numPreferred; 154 RRModePtr *modes; 155 int numUserModes; 156 RRModePtr *userModes; 157 Bool changed; 158 Bool nonDesktop; 159 RRPropertyPtr properties; 160 Bool pendingProperties; 161 void *devPrivate; 162 }; 163 164 struct _rrProvider { 165 RRProvider id; 166 ScreenPtr pScreen; 167 uint32_t capabilities; 168 char *name; 169 int nameLength; 170 RRPropertyPtr properties; 171 Bool pendingProperties; 172 Bool changed; 173 struct _rrProvider *offload_sink; 174 struct _rrProvider *output_source; 175 }; 176 177 typedef struct _rrMonitorGeometry { 178 BoxRec box; 179 CARD32 mmWidth; 180 CARD32 mmHeight; 181 } RRMonitorGeometryRec, *RRMonitorGeometryPtr; 182 183 struct _rrMonitor { 184 Atom name; 185 ScreenPtr pScreen; 186 int numOutputs; 187 RROutput *outputs; 188 Bool primary; 189 Bool automatic; 190 RRMonitorGeometryRec geometry; 191 }; 192 193 typedef enum _rrLeaseState { RRLeaseCreating, RRLeaseRunning, RRLeaseTerminating } RRLeaseState; 194 195 struct _rrLease { 196 struct xorg_list list; 197 ScreenPtr screen; 198 RRLease id; 199 RRLeaseState state; 200 void *devPrivate; 201 int numCrtcs; 202 RRCrtcPtr *crtcs; 203 int numOutputs; 204 RROutputPtr *outputs; 205 }; 206 207 #if RANDR_12_INTERFACE 208 typedef Bool (*RRScreenSetSizeProcPtr) (ScreenPtr pScreen, 209 CARD16 width, 210 CARD16 height, 211 CARD32 mmWidth, CARD32 mmHeight); 212 213 typedef Bool (*RRCrtcSetProcPtr) (ScreenPtr pScreen, 214 RRCrtcPtr crtc, 215 RRModePtr mode, 216 int x, 217 int y, 218 Rotation rotation, 219 int numOutputs, RROutputPtr * outputs); 220 221 typedef Bool (*RRCrtcSetGammaProcPtr) (ScreenPtr pScreen, RRCrtcPtr crtc); 222 223 typedef Bool (*RRCrtcGetGammaProcPtr) (ScreenPtr pScreen, RRCrtcPtr crtc); 224 225 typedef Bool (*RROutputSetPropertyProcPtr) (ScreenPtr pScreen, 226 RROutputPtr output, 227 Atom property, 228 RRPropertyValuePtr value); 229 230 typedef Bool (*RROutputValidateModeProcPtr) (ScreenPtr pScreen, 231 RROutputPtr output, 232 RRModePtr mode); 233 234 typedef void (*RRModeDestroyProcPtr) (ScreenPtr pScreen, RRModePtr mode); 235 236 #endif 237 238 #if RANDR_13_INTERFACE 239 typedef Bool (*RROutputGetPropertyProcPtr) (ScreenPtr pScreen, 240 RROutputPtr output, Atom property); 241 typedef Bool (*RRGetPanningProcPtr) (ScreenPtr pScrn, 242 RRCrtcPtr crtc, 243 BoxPtr totalArea, 244 BoxPtr trackingArea, INT16 *border); 245 typedef Bool (*RRSetPanningProcPtr) (ScreenPtr pScrn, 246 RRCrtcPtr crtc, 247 BoxPtr totalArea, 248 BoxPtr trackingArea, INT16 *border); 249 250 #endif /* RANDR_13_INTERFACE */ 251 252 typedef Bool (*RRProviderGetPropertyProcPtr) (ScreenPtr pScreen, 253 RRProviderPtr provider, Atom property); 254 typedef Bool (*RRProviderSetPropertyProcPtr) (ScreenPtr pScreen, 255 RRProviderPtr provider, 256 Atom property, 257 RRPropertyValuePtr value); 258 259 typedef Bool (*RRGetInfoProcPtr) (ScreenPtr pScreen, Rotation * rotations); 260 typedef Bool (*RRCloseScreenProcPtr) (ScreenPtr pscreen); 261 262 typedef Bool (*RRProviderSetOutputSourceProcPtr)(ScreenPtr pScreen, 263 RRProviderPtr provider, 264 RRProviderPtr output_source); 265 266 typedef Bool (*RRProviderSetOffloadSinkProcPtr)(ScreenPtr pScreen, 267 RRProviderPtr provider, 268 RRProviderPtr offload_sink); 269 270 271 typedef void (*RRProviderDestroyProcPtr)(ScreenPtr pScreen, 272 RRProviderPtr provider); 273 274 /* Additions for 1.6 */ 275 276 typedef int (*RRCreateLeaseProcPtr)(ScreenPtr screen, 277 RRLeasePtr lease, 278 int *fd); 279 280 typedef void (*RRTerminateLeaseProcPtr)(ScreenPtr screen, 281 RRLeasePtr lease); 282 283 /* These are for 1.0 compatibility */ 284 285 typedef struct _rrRefresh { 286 CARD16 rate; 287 RRModePtr mode; 288 } RRScreenRate, *RRScreenRatePtr; 289 290 typedef struct _rrScreenSize { 291 int id; 292 short width, height; 293 short mmWidth, mmHeight; 294 int nRates; 295 RRScreenRatePtr pRates; 296 } RRScreenSize, *RRScreenSizePtr; 297 298 #ifdef RANDR_10_INTERFACE 299 300 typedef Bool (*RRSetConfigProcPtr) (ScreenPtr pScreen, 301 Rotation rotation, 302 int rate, RRScreenSizePtr pSize); 303 304 #endif 305 306 typedef Bool (*RRCrtcSetScanoutPixmapProcPtr)(RRCrtcPtr crtc, PixmapPtr pixmap); 307 308 typedef Bool (*RRStartFlippingPixmapTrackingProcPtr)(RRCrtcPtr, DrawablePtr, 309 PixmapPtr, PixmapPtr, 310 int x, int y, 311 int dst_x, int dst_y, 312 Rotation rotation); 313 314 typedef Bool (*RREnableSharedPixmapFlippingProcPtr)(RRCrtcPtr, 315 PixmapPtr front, 316 PixmapPtr back); 317 318 typedef void (*RRDisableSharedPixmapFlippingProcPtr)(RRCrtcPtr); 319 320 321 typedef struct _rrScrPriv { 322 /* 323 * 'public' part of the structure; DDXen fill this in 324 * as they initialize 325 */ 326 #if RANDR_10_INTERFACE 327 RRSetConfigProcPtr rrSetConfig; 328 #endif 329 RRGetInfoProcPtr rrGetInfo; 330 #if RANDR_12_INTERFACE 331 RRScreenSetSizeProcPtr rrScreenSetSize; 332 RRCrtcSetProcPtr rrCrtcSet; 333 RRCrtcSetGammaProcPtr rrCrtcSetGamma; 334 RRCrtcGetGammaProcPtr rrCrtcGetGamma; 335 RROutputSetPropertyProcPtr rrOutputSetProperty; 336 RROutputValidateModeProcPtr rrOutputValidateMode; 337 RRModeDestroyProcPtr rrModeDestroy; 338 #endif 339 #if RANDR_13_INTERFACE 340 RROutputGetPropertyProcPtr rrOutputGetProperty; 341 RRGetPanningProcPtr rrGetPanning; 342 RRSetPanningProcPtr rrSetPanning; 343 #endif 344 /* TODO #if RANDR_15_INTERFACE */ 345 RRCrtcSetScanoutPixmapProcPtr rrCrtcSetScanoutPixmap; 346 347 RRStartFlippingPixmapTrackingProcPtr rrStartFlippingPixmapTracking; 348 RREnableSharedPixmapFlippingProcPtr rrEnableSharedPixmapFlipping; 349 RRDisableSharedPixmapFlippingProcPtr rrDisableSharedPixmapFlipping; 350 351 RRProviderSetOutputSourceProcPtr rrProviderSetOutputSource; 352 RRProviderSetOffloadSinkProcPtr rrProviderSetOffloadSink; 353 RRProviderGetPropertyProcPtr rrProviderGetProperty; 354 RRProviderSetPropertyProcPtr rrProviderSetProperty; 355 356 RRCreateLeaseProcPtr rrCreateLease; 357 RRTerminateLeaseProcPtr rrTerminateLease; 358 359 /* 360 * Private part of the structure; not considered part of the ABI 361 */ 362 TimeStamp lastSetTime; /* last changed by client */ 363 TimeStamp lastConfigTime; /* possible configs changed */ 364 RRCloseScreenProcPtr CloseScreen; 365 366 Bool changed; /* some config changed */ 367 Bool configChanged; /* configuration changed */ 368 Bool layoutChanged; /* screen layout changed */ 369 Bool resourcesChanged; /* screen resources change */ 370 Bool leasesChanged; /* leases change */ 371 372 CARD16 minWidth, minHeight; 373 CARD16 maxWidth, maxHeight; 374 CARD16 width, height; /* last known screen size */ 375 CARD16 mmWidth, mmHeight; /* last known screen size */ 376 377 int numOutputs; 378 RROutputPtr *outputs; 379 RROutputPtr primaryOutput; 380 381 int numCrtcs; 382 RRCrtcPtr *crtcs; 383 384 /* Last known pointer position */ 385 RRCrtcPtr pointerCrtc; 386 387 #ifdef RANDR_10_INTERFACE 388 /* 389 * Configuration information 390 */ 391 Rotation rotations; 392 CARD16 reqWidth, reqHeight; 393 394 int nSizes; 395 RRScreenSizePtr pSizes; 396 397 Rotation rotation; 398 int rate; 399 int size; 400 #endif 401 Bool discontiguous; 402 403 RRProviderPtr provider; 404 405 RRProviderDestroyProcPtr rrProviderDestroy; 406 407 int numMonitors; 408 RRMonitorPtr *monitors; 409 410 struct xorg_list leases; 411 } rrScrPrivRec, *rrScrPrivPtr; 412 413 extern _X_EXPORT DevPrivateKeyRec rrPrivKeyRec; 414 415 #define rrPrivKey (&rrPrivKeyRec) 416 417 #define rrGetScrPriv(pScr) ((rrScrPrivPtr)dixLookupPrivate(&(pScr)->devPrivates, rrPrivKey)) 418 #define rrScrPriv(pScr) rrScrPrivPtr pScrPriv = rrGetScrPriv(pScr) 419 #define SetRRScreen(s,p) dixSetPrivate(&(s)->devPrivates, rrPrivKey, p) 420 421 /* 422 * each window has a list of clients requesting 423 * RRNotify events. Each client has a resource 424 * for each window it selects RRNotify input for, 425 * this resource is used to delete the RRNotifyRec 426 * entry from the per-window queue. 427 */ 428 429 typedef struct _RREvent *RREventPtr; 430 431 typedef struct _RREvent { 432 RREventPtr next; 433 ClientPtr client; 434 WindowPtr window; 435 XID clientResource; 436 int mask; 437 } RREventRec; 438 439 typedef struct _RRTimes { 440 TimeStamp setTime; 441 TimeStamp configTime; 442 } RRTimesRec, *RRTimesPtr; 443 444 typedef struct _RRClient { 445 int major_version; 446 int minor_version; 447 /* RRTimesRec times[0]; */ 448 } RRClientRec, *RRClientPtr; 449 450 extern RESTYPE RRClientType, RREventType; /* resource types for event masks */ 451 extern DevPrivateKeyRec RRClientPrivateKeyRec; 452 453 #define RRClientPrivateKey (&RRClientPrivateKeyRec) 454 extern _X_EXPORT RESTYPE RRCrtcType, RRModeType, RROutputType, RRProviderType, RRLeaseType; 455 456 #define VERIFY_RR_OUTPUT(id, ptr, a)\ 457 {\ 458 int rc = dixLookupResourceByType((void **)&(ptr), id,\ 459 RROutputType, client, a);\ 460 if (rc != Success) {\ 461 client->errorValue = id;\ 462 return rc;\ 463 }\ 464 } 465 466 #define VERIFY_RR_CRTC(id, ptr, a)\ 467 {\ 468 int rc = dixLookupResourceByType((void **)&(ptr), id,\ 469 RRCrtcType, client, a);\ 470 if (rc != Success) {\ 471 client->errorValue = id;\ 472 return rc;\ 473 }\ 474 } 475 476 #define VERIFY_RR_MODE(id, ptr, a)\ 477 {\ 478 int rc = dixLookupResourceByType((void **)&(ptr), id,\ 479 RRModeType, client, a);\ 480 if (rc != Success) {\ 481 client->errorValue = id;\ 482 return rc;\ 483 }\ 484 } 485 486 #define VERIFY_RR_PROVIDER(id, ptr, a)\ 487 {\ 488 int rc = dixLookupResourceByType((void **)&(ptr), id,\ 489 RRProviderType, client, a);\ 490 if (rc != Success) {\ 491 client->errorValue = id;\ 492 return rc;\ 493 }\ 494 } 495 496 #define VERIFY_RR_LEASE(id, ptr, a)\ 497 {\ 498 int rc = dixLookupResourceByType((void **)&(ptr), id,\ 499 RRLeaseType, client, a);\ 500 if (rc != Success) {\ 501 client->errorValue = id;\ 502 return rc;\ 503 }\ 504 } 505 506 #define GetRRClient(pClient) ((RRClientPtr)dixLookupPrivate(&(pClient)->devPrivates, RRClientPrivateKey)) 507 #define rrClientPriv(pClient) RRClientPtr pRRClient = GetRRClient(pClient) 508 509 #ifdef RANDR_12_INTERFACE 510 /* 511 * Set the range of sizes for the screen 512 */ 513 extern _X_EXPORT void 514 515 RRScreenSetSizeRange(ScreenPtr pScreen, 516 CARD16 minWidth, 517 CARD16 minHeight, CARD16 maxWidth, CARD16 maxHeight); 518 #endif 519 520 /* rrscreen.c */ 521 /* 522 * Notify the extension that the screen size has been changed. 523 * The driver is responsible for calling this whenever it has changed 524 * the size of the screen 525 */ 526 extern _X_EXPORT void 527 RRScreenSizeNotify(ScreenPtr pScreen); 528 529 /* 530 * Request that the screen be resized 531 */ 532 extern _X_EXPORT Bool 533 534 RRScreenSizeSet(ScreenPtr pScreen, 535 CARD16 width, CARD16 height, CARD32 mmWidth, CARD32 mmHeight); 536 537 /* 538 * Send ConfigureNotify event to root window when 'something' happens 539 */ 540 extern _X_EXPORT void 541 RRSendConfigNotify(ScreenPtr pScreen); 542 543 /* 544 * screen dispatch 545 */ 546 extern _X_EXPORT int 547 ProcRRGetScreenSizeRange(ClientPtr client); 548 549 extern _X_EXPORT int 550 ProcRRSetScreenSize(ClientPtr client); 551 552 extern _X_EXPORT int 553 ProcRRGetScreenResources(ClientPtr client); 554 555 extern _X_EXPORT int 556 ProcRRGetScreenResourcesCurrent(ClientPtr client); 557 558 extern _X_EXPORT int 559 ProcRRSetScreenConfig(ClientPtr client); 560 561 extern _X_EXPORT int 562 ProcRRGetScreenInfo(ClientPtr client); 563 564 /* 565 * Deliver a ScreenNotify event 566 */ 567 extern _X_EXPORT void 568 RRDeliverScreenEvent(ClientPtr client, WindowPtr pWin, ScreenPtr pScreen); 569 570 extern _X_EXPORT void 571 RRResourcesChanged(ScreenPtr pScreen); 572 573 /* randr.c */ 574 /* set a screen change on the primary screen */ 575 extern _X_EXPORT void 576 RRSetChanged(ScreenPtr pScreen); 577 578 /* 579 * Send all pending events 580 */ 581 extern _X_EXPORT void 582 RRTellChanged(ScreenPtr pScreen); 583 584 /* 585 * Poll the driver for changed information 586 */ 587 extern _X_EXPORT Bool 588 RRGetInfo(ScreenPtr pScreen, Bool force_query); 589 590 extern _X_EXPORT Bool RRInit(void); 591 592 extern _X_EXPORT Bool RRScreenInit(ScreenPtr pScreen); 593 594 extern _X_EXPORT RROutputPtr RRFirstOutput(ScreenPtr pScreen); 595 596 extern _X_EXPORT RRCrtcPtr RRFirstEnabledCrtc(ScreenPtr pScreen); 597 598 extern _X_EXPORT Bool RROutputSetNonDesktop(RROutputPtr output, Bool non_desktop); 599 600 extern _X_EXPORT CARD16 601 RRVerticalRefresh(xRRModeInfo * mode); 602 603 #ifdef RANDR_10_INTERFACE 604 /* 605 * This is the old interface, deprecated but left 606 * around for compatibility 607 */ 608 609 /* 610 * Then, register the specific size with the screen 611 */ 612 613 extern _X_EXPORT RRScreenSizePtr 614 RRRegisterSize(ScreenPtr pScreen, 615 short width, short height, short mmWidth, short mmHeight); 616 617 extern _X_EXPORT Bool 618 RRRegisterRate(ScreenPtr pScreen, RRScreenSizePtr pSize, int rate); 619 620 /* 621 * Finally, set the current configuration of the screen 622 */ 623 624 extern _X_EXPORT void 625 626 RRSetCurrentConfig(ScreenPtr pScreen, 627 Rotation rotation, int rate, RRScreenSizePtr pSize); 628 629 extern _X_EXPORT Rotation RRGetRotation(ScreenPtr pScreen); 630 631 #endif 632 633 /* rrcrtc.c */ 634 635 /* 636 * Notify the CRTC of some change; layoutChanged indicates that 637 * some position or size element changed 638 */ 639 extern _X_EXPORT void 640 RRCrtcChanged(RRCrtcPtr crtc, Bool layoutChanged); 641 642 /* 643 * Create a CRTC 644 */ 645 extern _X_EXPORT RRCrtcPtr RRCrtcCreate(ScreenPtr pScreen, void *devPrivate); 646 647 /* 648 * Tests if findCrtc belongs to pScreen or slave screens 649 */ 650 extern _X_EXPORT Bool RRCrtcExists(ScreenPtr pScreen, RRCrtcPtr findCrtc); 651 652 /* 653 * Set the allowed rotations on a CRTC 654 */ 655 extern _X_EXPORT void 656 RRCrtcSetRotations(RRCrtcPtr crtc, Rotation rotations); 657 658 /* 659 * Set whether transforms are allowed on a CRTC 660 */ 661 extern _X_EXPORT void 662 RRCrtcSetTransformSupport(RRCrtcPtr crtc, Bool transforms); 663 664 /* 665 * Notify the extension that the Crtc has been reconfigured, 666 * the driver calls this whenever it has updated the mode 667 */ 668 extern _X_EXPORT Bool 669 670 RRCrtcNotify(RRCrtcPtr crtc, 671 RRModePtr mode, 672 int x, 673 int y, 674 Rotation rotation, 675 RRTransformPtr transform, int numOutputs, RROutputPtr * outputs); 676 677 extern _X_EXPORT void 678 RRDeliverCrtcEvent(ClientPtr client, WindowPtr pWin, RRCrtcPtr crtc); 679 680 /* 681 * Request that the Crtc be reconfigured 682 */ 683 extern _X_EXPORT Bool 684 685 RRCrtcSet(RRCrtcPtr crtc, 686 RRModePtr mode, 687 int x, 688 int y, Rotation rotation, int numOutput, RROutputPtr * outputs); 689 690 /* 691 * Request that the Crtc gamma be changed 692 */ 693 694 extern _X_EXPORT Bool 695 RRCrtcGammaSet(RRCrtcPtr crtc, CARD16 *red, CARD16 *green, CARD16 *blue); 696 697 /* 698 * Request current gamma back from the DDX (if possible). 699 * This includes gamma size. 700 */ 701 702 extern _X_EXPORT Bool 703 RRCrtcGammaGet(RRCrtcPtr crtc); 704 705 /* 706 * Notify the extension that the Crtc gamma has been changed 707 * The driver calls this whenever it has changed the gamma values 708 * in the RRCrtcRec 709 */ 710 711 extern _X_EXPORT Bool 712 RRCrtcGammaNotify(RRCrtcPtr crtc); 713 714 /* 715 * Set the size of the gamma table at server startup time 716 */ 717 718 extern _X_EXPORT Bool 719 RRCrtcGammaSetSize(RRCrtcPtr crtc, int size); 720 721 /* 722 * Return the area of the frame buffer scanned out by the crtc, 723 * taking into account the current mode and rotation 724 */ 725 726 extern _X_EXPORT void 727 RRCrtcGetScanoutSize(RRCrtcPtr crtc, int *width, int *height); 728 729 /* 730 * Return crtc transform 731 */ 732 extern _X_EXPORT RRTransformPtr RRCrtcGetTransform(RRCrtcPtr crtc); 733 734 /* 735 * Check whether the pending and current transforms are the same 736 */ 737 extern _X_EXPORT Bool 738 RRCrtcPendingTransform(RRCrtcPtr crtc); 739 740 /* 741 * Destroy a Crtc at shutdown 742 */ 743 extern _X_EXPORT void 744 RRCrtcDestroy(RRCrtcPtr crtc); 745 746 /* 747 * Set the pending CRTC transformation 748 */ 749 750 extern _X_EXPORT int 751 752 RRCrtcTransformSet(RRCrtcPtr crtc, 753 PictTransformPtr transform, 754 struct pict_f_transform *f_transform, 755 struct pict_f_transform *f_inverse, 756 char *filter, int filter_len, xFixed * params, int nparams); 757 758 /* 759 * Initialize crtc type 760 */ 761 extern _X_EXPORT Bool 762 RRCrtcInit(void); 763 764 /* 765 * Initialize crtc type error value 766 */ 767 extern _X_EXPORT void 768 RRCrtcInitErrorValue(void); 769 770 /* 771 * Detach and free a scanout pixmap 772 */ 773 extern _X_EXPORT void 774 RRCrtcDetachScanoutPixmap(RRCrtcPtr crtc); 775 776 extern _X_EXPORT Bool 777 RRReplaceScanoutPixmap(DrawablePtr pDrawable, PixmapPtr pPixmap, Bool enable); 778 779 /* 780 * Return if the screen has any scanout_pixmap's attached 781 */ 782 extern _X_EXPORT Bool 783 RRHasScanoutPixmap(ScreenPtr pScreen); 784 785 /* 786 * Crtc dispatch 787 */ 788 789 extern _X_EXPORT int 790 ProcRRGetCrtcInfo(ClientPtr client); 791 792 extern _X_EXPORT int 793 ProcRRSetCrtcConfig(ClientPtr client); 794 795 extern _X_EXPORT int 796 ProcRRGetCrtcGammaSize(ClientPtr client); 797 798 extern _X_EXPORT int 799 ProcRRGetCrtcGamma(ClientPtr client); 800 801 extern _X_EXPORT int 802 ProcRRSetCrtcGamma(ClientPtr client); 803 804 extern _X_EXPORT int 805 ProcRRSetCrtcTransform(ClientPtr client); 806 807 extern _X_EXPORT int 808 ProcRRGetCrtcTransform(ClientPtr client); 809 810 int 811 ProcRRGetPanning(ClientPtr client); 812 813 int 814 ProcRRSetPanning(ClientPtr client); 815 816 void 817 RRConstrainCursorHarder(DeviceIntPtr, ScreenPtr, int, int *, int *); 818 819 /* rrdispatch.c */ 820 extern _X_EXPORT Bool 821 RRClientKnowsRates(ClientPtr pClient); 822 823 /* rrlease.c */ 824 void 825 RRDeliverLeaseEvent(ClientPtr client, WindowPtr window); 826 827 extern _X_EXPORT void 828 RRLeaseTerminated(RRLeasePtr lease); 829 830 extern _X_EXPORT void 831 RRLeaseFree(RRLeasePtr lease); 832 833 extern _X_EXPORT Bool 834 RRCrtcIsLeased(RRCrtcPtr crtc); 835 836 extern _X_EXPORT Bool 837 RROutputIsLeased(RROutputPtr output); 838 839 void 840 RRTerminateLease(RRLeasePtr lease); 841 842 Bool 843 RRLeaseInit(void); 844 845 /* rrmode.c */ 846 /* 847 * Find, and if necessary, create a mode 848 */ 849 850 extern _X_EXPORT RRModePtr RRModeGet(xRRModeInfo * modeInfo, const char *name); 851 852 /* 853 * Destroy a mode. 854 */ 855 856 extern _X_EXPORT void 857 RRModeDestroy(RRModePtr mode); 858 859 /* 860 * Return a list of modes that are valid for some output in pScreen 861 */ 862 extern _X_EXPORT RRModePtr *RRModesForScreen(ScreenPtr pScreen, int *num_ret); 863 864 /* 865 * Initialize mode type 866 */ 867 extern _X_EXPORT Bool 868 RRModeInit(void); 869 870 /* 871 * Initialize mode type error value 872 */ 873 extern _X_EXPORT void 874 RRModeInitErrorValue(void); 875 876 extern _X_EXPORT int 877 ProcRRCreateMode(ClientPtr client); 878 879 extern _X_EXPORT int 880 ProcRRDestroyMode(ClientPtr client); 881 882 extern _X_EXPORT int 883 ProcRRAddOutputMode(ClientPtr client); 884 885 extern _X_EXPORT int 886 ProcRRDeleteOutputMode(ClientPtr client); 887 888 /* rroutput.c */ 889 890 /* 891 * Notify the output of some change. configChanged indicates whether 892 * any external configuration (mode list, clones, connected status) 893 * has changed, or whether the change was strictly internal 894 * (which crtc is in use) 895 */ 896 extern _X_EXPORT void 897 RROutputChanged(RROutputPtr output, Bool configChanged); 898 899 /* 900 * Create an output 901 */ 902 903 extern _X_EXPORT RROutputPtr 904 RROutputCreate(ScreenPtr pScreen, 905 const char *name, int nameLength, void *devPrivate); 906 907 /* 908 * Notify extension that output parameters have been changed 909 */ 910 extern _X_EXPORT Bool 911 RROutputSetClones(RROutputPtr output, RROutputPtr * clones, int numClones); 912 913 extern _X_EXPORT Bool 914 915 RROutputSetModes(RROutputPtr output, 916 RRModePtr * modes, int numModes, int numPreferred); 917 918 extern _X_EXPORT int 919 RROutputAddUserMode(RROutputPtr output, RRModePtr mode); 920 921 extern _X_EXPORT int 922 RROutputDeleteUserMode(RROutputPtr output, RRModePtr mode); 923 924 extern _X_EXPORT Bool 925 RROutputSetCrtcs(RROutputPtr output, RRCrtcPtr * crtcs, int numCrtcs); 926 927 extern _X_EXPORT Bool 928 RROutputSetConnection(RROutputPtr output, CARD8 connection); 929 930 extern _X_EXPORT Bool 931 RROutputSetSubpixelOrder(RROutputPtr output, int subpixelOrder); 932 933 extern _X_EXPORT Bool 934 RROutputSetPhysicalSize(RROutputPtr output, int mmWidth, int mmHeight); 935 936 extern _X_EXPORT void 937 RRDeliverOutputEvent(ClientPtr client, WindowPtr pWin, RROutputPtr output); 938 939 extern _X_EXPORT void 940 RROutputDestroy(RROutputPtr output); 941 942 extern _X_EXPORT int 943 ProcRRGetOutputInfo(ClientPtr client); 944 945 extern _X_EXPORT int 946 ProcRRSetOutputPrimary(ClientPtr client); 947 948 extern _X_EXPORT int 949 ProcRRGetOutputPrimary(ClientPtr client); 950 951 /* 952 * Initialize output type 953 */ 954 extern _X_EXPORT Bool 955 RROutputInit(void); 956 957 /* 958 * Initialize output type error value 959 */ 960 extern _X_EXPORT void 961 RROutputInitErrorValue(void); 962 963 /* rrpointer.c */ 964 extern _X_EXPORT void 965 RRPointerMoved(ScreenPtr pScreen, int x, int y); 966 967 extern _X_EXPORT void 968 RRPointerScreenConfigured(ScreenPtr pScreen); 969 970 /* rrproperty.c */ 971 972 extern _X_EXPORT void 973 RRDeleteAllOutputProperties(RROutputPtr output); 974 975 extern _X_EXPORT RRPropertyValuePtr 976 RRGetOutputProperty(RROutputPtr output, Atom property, Bool pending); 977 978 extern _X_EXPORT RRPropertyPtr 979 RRQueryOutputProperty(RROutputPtr output, Atom property); 980 981 extern _X_EXPORT void 982 RRDeleteOutputProperty(RROutputPtr output, Atom property); 983 984 extern _X_EXPORT Bool 985 RRPostPendingProperties(RROutputPtr output); 986 987 extern _X_EXPORT int 988 989 RRChangeOutputProperty(RROutputPtr output, Atom property, Atom type, 990 int format, int mode, unsigned long len, 991 const void *value, Bool sendevent, Bool pending); 992 993 extern _X_EXPORT int 994 995 RRConfigureOutputProperty(RROutputPtr output, Atom property, 996 Bool pending, Bool range, Bool immutable, 997 int num_values, const INT32 *values); 998 extern _X_EXPORT int 999 ProcRRChangeOutputProperty(ClientPtr client); 1000 1001 extern _X_EXPORT int 1002 ProcRRGetOutputProperty(ClientPtr client); 1003 1004 extern _X_EXPORT int 1005 ProcRRListOutputProperties(ClientPtr client); 1006 1007 extern _X_EXPORT int 1008 ProcRRQueryOutputProperty(ClientPtr client); 1009 1010 extern _X_EXPORT int 1011 ProcRRConfigureOutputProperty(ClientPtr client); 1012 1013 extern _X_EXPORT int 1014 ProcRRDeleteOutputProperty(ClientPtr client); 1015 1016 /* rrprovider.c */ 1017 #define PRIME_SYNC_PROP "PRIME Synchronization" 1018 extern _X_EXPORT void 1019 RRProviderInitErrorValue(void); 1020 1021 extern _X_EXPORT int 1022 ProcRRGetProviders(ClientPtr client); 1023 1024 extern _X_EXPORT int 1025 ProcRRGetProviderInfo(ClientPtr client); 1026 1027 extern _X_EXPORT int 1028 ProcRRSetProviderOutputSource(ClientPtr client); 1029 1030 extern _X_EXPORT int 1031 ProcRRSetProviderOffloadSink(ClientPtr client); 1032 1033 extern _X_EXPORT Bool 1034 RRProviderInit(void); 1035 1036 extern _X_EXPORT RRProviderPtr 1037 RRProviderCreate(ScreenPtr pScreen, const char *name, 1038 int nameLength); 1039 1040 extern _X_EXPORT void 1041 RRProviderDestroy (RRProviderPtr provider); 1042 1043 extern _X_EXPORT void 1044 RRProviderSetCapabilities(RRProviderPtr provider, uint32_t capabilities); 1045 1046 extern _X_EXPORT Bool 1047 RRProviderLookup(XID id, RRProviderPtr *provider_p); 1048 1049 extern _X_EXPORT void 1050 RRDeliverProviderEvent(ClientPtr client, WindowPtr pWin, RRProviderPtr provider); 1051 1052 /* rrproviderproperty.c */ 1053 1054 extern _X_EXPORT void 1055 RRDeleteAllProviderProperties(RRProviderPtr provider); 1056 1057 extern _X_EXPORT RRPropertyValuePtr 1058 RRGetProviderProperty(RRProviderPtr provider, Atom property, Bool pending); 1059 1060 extern _X_EXPORT RRPropertyPtr 1061 RRQueryProviderProperty(RRProviderPtr provider, Atom property); 1062 1063 extern _X_EXPORT void 1064 RRDeleteProviderProperty(RRProviderPtr provider, Atom property); 1065 1066 extern _X_EXPORT int 1067 RRChangeProviderProperty(RRProviderPtr provider, Atom property, Atom type, 1068 int format, int mode, unsigned long len, 1069 void *value, Bool sendevent, Bool pending); 1070 1071 extern _X_EXPORT int 1072 RRConfigureProviderProperty(RRProviderPtr provider, Atom property, 1073 Bool pending, Bool range, Bool immutable, 1074 int num_values, INT32 *values); 1075 1076 extern _X_EXPORT Bool 1077 RRPostProviderPendingProperties(RRProviderPtr provider); 1078 1079 extern _X_EXPORT int 1080 ProcRRGetProviderProperty(ClientPtr client); 1081 1082 extern _X_EXPORT int 1083 ProcRRListProviderProperties(ClientPtr client); 1084 1085 extern _X_EXPORT int 1086 ProcRRQueryProviderProperty(ClientPtr client); 1087 1088 extern _X_EXPORT int 1089 ProcRRConfigureProviderProperty(ClientPtr client); 1090 1091 extern _X_EXPORT int 1092 ProcRRChangeProviderProperty(ClientPtr client); 1093 1094 extern _X_EXPORT int 1095 ProcRRDeleteProviderProperty(ClientPtr client); 1096 /* rrxinerama.c */ 1097 #ifdef XINERAMA 1098 extern _X_EXPORT void 1099 RRXineramaExtensionInit(void); 1100 #endif 1101 1102 void 1103 RRMonitorInit(ScreenPtr screen); 1104 1105 Bool 1106 RRMonitorMakeList(ScreenPtr screen, Bool get_active, RRMonitorPtr *monitors_ret, int *nmon_ret); 1107 1108 int 1109 RRMonitorCountList(ScreenPtr screen); 1110 1111 void 1112 RRMonitorFreeList(RRMonitorPtr monitors, int nmon); 1113 1114 void 1115 RRMonitorClose(ScreenPtr screen); 1116 1117 RRMonitorPtr 1118 RRMonitorAlloc(int noutput); 1119 1120 int 1121 RRMonitorAdd(ClientPtr client, ScreenPtr screen, RRMonitorPtr monitor); 1122 1123 void 1124 RRMonitorFree(RRMonitorPtr monitor); 1125 1126 int 1127 ProcRRGetMonitors(ClientPtr client); 1128 1129 int 1130 ProcRRSetMonitor(ClientPtr client); 1131 1132 int 1133 ProcRRDeleteMonitor(ClientPtr client); 1134 1135 int 1136 ProcRRCreateLease(ClientPtr client); 1137 1138 int 1139 ProcRRFreeLease(ClientPtr client); 1140 1141 #endif /* _RANDRSTR_H_ */ 1142 1143 /* 1144 1145 randr extension implementation structure 1146 1147 Query state: 1148 ProcRRGetScreenInfo/ProcRRGetScreenResources 1149 RRGetInfo 1150 1151 • Request configuration from driver, either 1.0 or 1.2 style 1152 • These functions only record state changes, all 1153 other actions are pended until RRTellChanged is called 1154 1155 ->rrGetInfo 1156 1.0: 1157 RRRegisterSize 1158 RRRegisterRate 1159 RRSetCurrentConfig 1160 1.2: 1161 RRScreenSetSizeRange 1162 RROutputSetCrtcs 1163 RRModeGet 1164 RROutputSetModes 1165 RROutputSetConnection 1166 RROutputSetSubpixelOrder 1167 RROutputSetClones 1168 RRCrtcNotify 1169 1170 • Must delay scanning configuration until after ->rrGetInfo returns 1171 because some drivers will call SetCurrentConfig in the middle 1172 of the ->rrGetInfo operation. 1173 1174 1.0: 1175 1176 • Scan old configuration, mirror to new structures 1177 1178 RRScanOldConfig 1179 RRCrtcCreate 1180 RROutputCreate 1181 RROutputSetCrtcs 1182 RROutputSetConnection 1183 RROutputSetSubpixelOrder 1184 RROldModeAdd • This adds modes one-at-a-time 1185 RRModeGet 1186 RRCrtcNotify 1187 1188 • send events, reset pointer if necessary 1189 1190 RRTellChanged 1191 WalkTree (sending events) 1192 1193 • when layout has changed: 1194 RRPointerScreenConfigured 1195 RRSendConfigNotify 1196 1197 Asynchronous state setting (1.2 only) 1198 When setting state asynchronously, the driver invokes the 1199 ->rrGetInfo function and then calls RRTellChanged to flush 1200 the changes to the clients and reset pointer if necessary 1201 1202 Set state 1203 1204 ProcRRSetScreenConfig 1205 RRCrtcSet 1206 1.2: 1207 ->rrCrtcSet 1208 RRCrtcNotify 1209 1.0: 1210 ->rrSetConfig 1211 RRCrtcNotify 1212 RRTellChanged 1213 */ 1214