randrstr.h revision 7e31ba66
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 62typedef XID RRMode; 63typedef XID RROutput; 64typedef XID RRCrtc; 65typedef XID RRProvider; 66typedef XID RRLease; 67 68extern int RREventBase, RRErrorBase; 69 70extern int (*ProcRandrVector[RRNumberRequests]) (ClientPtr); 71extern 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)) 78typedef struct _rrMode RRModeRec, *RRModePtr; 79typedef struct _rrPropertyValue RRPropertyValueRec, *RRPropertyValuePtr; 80typedef struct _rrProperty RRPropertyRec, *RRPropertyPtr; 81typedef struct _rrCrtc RRCrtcRec, *RRCrtcPtr; 82typedef struct _rrOutput RROutputRec, *RROutputPtr; 83typedef struct _rrProvider RRProviderRec, *RRProviderPtr; 84typedef struct _rrMonitor RRMonitorRec, *RRMonitorPtr; 85typedef struct _rrLease RRLeaseRec, *RRLeasePtr; 86 87struct _rrMode { 88 int refcnt; 89 xRRModeInfo mode; 90 char *name; 91 ScreenPtr userScreen; 92}; 93 94struct _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 101struct _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 112struct _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 138struct _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 164struct _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 177typedef struct _rrMonitorGeometry { 178 BoxRec box; 179 CARD32 mmWidth; 180 CARD32 mmHeight; 181} RRMonitorGeometryRec, *RRMonitorGeometryPtr; 182 183struct _rrMonitor { 184 Atom name; 185 ScreenPtr pScreen; 186 int numOutputs; 187 RROutput *outputs; 188 Bool primary; 189 Bool automatic; 190 RRMonitorGeometryRec geometry; 191}; 192 193typedef enum _rrLeaseState { RRLeaseCreating, RRLeaseRunning, RRLeaseTerminating } RRLeaseState; 194 195struct _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 208typedef Bool (*RRScreenSetSizeProcPtr) (ScreenPtr pScreen, 209 CARD16 width, 210 CARD16 height, 211 CARD32 mmWidth, CARD32 mmHeight); 212 213typedef 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 221typedef Bool (*RRCrtcSetGammaProcPtr) (ScreenPtr pScreen, RRCrtcPtr crtc); 222 223typedef Bool (*RRCrtcGetGammaProcPtr) (ScreenPtr pScreen, RRCrtcPtr crtc); 224 225typedef Bool (*RROutputSetPropertyProcPtr) (ScreenPtr pScreen, 226 RROutputPtr output, 227 Atom property, 228 RRPropertyValuePtr value); 229 230typedef Bool (*RROutputValidateModeProcPtr) (ScreenPtr pScreen, 231 RROutputPtr output, 232 RRModePtr mode); 233 234typedef void (*RRModeDestroyProcPtr) (ScreenPtr pScreen, RRModePtr mode); 235 236#endif 237 238#if RANDR_13_INTERFACE 239typedef Bool (*RROutputGetPropertyProcPtr) (ScreenPtr pScreen, 240 RROutputPtr output, Atom property); 241typedef Bool (*RRGetPanningProcPtr) (ScreenPtr pScrn, 242 RRCrtcPtr crtc, 243 BoxPtr totalArea, 244 BoxPtr trackingArea, INT16 *border); 245typedef Bool (*RRSetPanningProcPtr) (ScreenPtr pScrn, 246 RRCrtcPtr crtc, 247 BoxPtr totalArea, 248 BoxPtr trackingArea, INT16 *border); 249 250#endif /* RANDR_13_INTERFACE */ 251 252typedef Bool (*RRProviderGetPropertyProcPtr) (ScreenPtr pScreen, 253 RRProviderPtr provider, Atom property); 254typedef Bool (*RRProviderSetPropertyProcPtr) (ScreenPtr pScreen, 255 RRProviderPtr provider, 256 Atom property, 257 RRPropertyValuePtr value); 258 259typedef Bool (*RRGetInfoProcPtr) (ScreenPtr pScreen, Rotation * rotations); 260typedef Bool (*RRCloseScreenProcPtr) (ScreenPtr pscreen); 261 262typedef Bool (*RRProviderSetOutputSourceProcPtr)(ScreenPtr pScreen, 263 RRProviderPtr provider, 264 RRProviderPtr output_source); 265 266typedef Bool (*RRProviderSetOffloadSinkProcPtr)(ScreenPtr pScreen, 267 RRProviderPtr provider, 268 RRProviderPtr offload_sink); 269 270 271typedef void (*RRProviderDestroyProcPtr)(ScreenPtr pScreen, 272 RRProviderPtr provider); 273 274/* Additions for 1.6 */ 275 276typedef int (*RRCreateLeaseProcPtr)(ScreenPtr screen, 277 RRLeasePtr lease, 278 int *fd); 279 280typedef void (*RRTerminateLeaseProcPtr)(ScreenPtr screen, 281 RRLeasePtr lease); 282 283/* These are for 1.0 compatibility */ 284 285typedef struct _rrRefresh { 286 CARD16 rate; 287 RRModePtr mode; 288} RRScreenRate, *RRScreenRatePtr; 289 290typedef 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 300typedef Bool (*RRSetConfigProcPtr) (ScreenPtr pScreen, 301 Rotation rotation, 302 int rate, RRScreenSizePtr pSize); 303 304#endif 305 306typedef Bool (*RRCrtcSetScanoutPixmapProcPtr)(RRCrtcPtr crtc, PixmapPtr pixmap); 307 308typedef Bool (*RRStartFlippingPixmapTrackingProcPtr)(RRCrtcPtr, DrawablePtr, 309 PixmapPtr, PixmapPtr, 310 int x, int y, 311 int dst_x, int dst_y, 312 Rotation rotation); 313 314typedef Bool (*RREnableSharedPixmapFlippingProcPtr)(RRCrtcPtr, 315 PixmapPtr front, 316 PixmapPtr back); 317 318typedef void (*RRDisableSharedPixmapFlippingProcPtr)(RRCrtcPtr); 319 320 321typedef 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 413extern _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 429typedef struct _RREvent *RREventPtr; 430 431typedef struct _RREvent { 432 RREventPtr next; 433 ClientPtr client; 434 WindowPtr window; 435 XID clientResource; 436 int mask; 437} RREventRec; 438 439typedef struct _RRTimes { 440 TimeStamp setTime; 441 TimeStamp configTime; 442} RRTimesRec, *RRTimesPtr; 443 444typedef struct _RRClient { 445 int major_version; 446 int minor_version; 447/* RRTimesRec times[0]; */ 448} RRClientRec, *RRClientPtr; 449 450extern RESTYPE RRClientType, RREventType; /* resource types for event masks */ 451extern DevPrivateKeyRec RRClientPrivateKeyRec; 452 453#define RRClientPrivateKey (&RRClientPrivateKeyRec) 454extern _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 */ 513extern _X_EXPORT void 514 515RRScreenSetSizeRange(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 */ 526extern _X_EXPORT void 527 RRScreenSizeNotify(ScreenPtr pScreen); 528 529/* 530 * Request that the screen be resized 531 */ 532extern _X_EXPORT Bool 533 534RRScreenSizeSet(ScreenPtr pScreen, 535 CARD16 width, CARD16 height, CARD32 mmWidth, CARD32 mmHeight); 536 537/* 538 * Send ConfigureNotify event to root window when 'something' happens 539 */ 540extern _X_EXPORT void 541 RRSendConfigNotify(ScreenPtr pScreen); 542 543/* 544 * screen dispatch 545 */ 546extern _X_EXPORT int 547 ProcRRGetScreenSizeRange(ClientPtr client); 548 549extern _X_EXPORT int 550 ProcRRSetScreenSize(ClientPtr client); 551 552extern _X_EXPORT int 553 ProcRRGetScreenResources(ClientPtr client); 554 555extern _X_EXPORT int 556 ProcRRGetScreenResourcesCurrent(ClientPtr client); 557 558extern _X_EXPORT int 559 ProcRRSetScreenConfig(ClientPtr client); 560 561extern _X_EXPORT int 562 ProcRRGetScreenInfo(ClientPtr client); 563 564/* 565 * Deliver a ScreenNotify event 566 */ 567extern _X_EXPORT void 568 RRDeliverScreenEvent(ClientPtr client, WindowPtr pWin, ScreenPtr pScreen); 569 570extern _X_EXPORT void 571 RRResourcesChanged(ScreenPtr pScreen); 572 573/* randr.c */ 574/* set a screen change on the primary screen */ 575extern _X_EXPORT void 576RRSetChanged(ScreenPtr pScreen); 577 578/* 579 * Send all pending events 580 */ 581extern _X_EXPORT void 582 RRTellChanged(ScreenPtr pScreen); 583 584extern _X_EXPORT void 585RRSetChanged (ScreenPtr pScreen); 586 587/* 588 * Poll the driver for changed information 589 */ 590extern _X_EXPORT Bool 591 RRGetInfo(ScreenPtr pScreen, Bool force_query); 592 593extern _X_EXPORT Bool RRInit(void); 594 595extern _X_EXPORT Bool RRScreenInit(ScreenPtr pScreen); 596 597extern _X_EXPORT RROutputPtr RRFirstOutput(ScreenPtr pScreen); 598 599extern _X_EXPORT Bool RROutputSetNonDesktop(RROutputPtr output, Bool non_desktop); 600 601extern _X_EXPORT CARD16 602 RRVerticalRefresh(xRRModeInfo * mode); 603 604#ifdef RANDR_10_INTERFACE 605/* 606 * This is the old interface, deprecated but left 607 * around for compatibility 608 */ 609 610/* 611 * Then, register the specific size with the screen 612 */ 613 614extern _X_EXPORT RRScreenSizePtr 615RRRegisterSize(ScreenPtr pScreen, 616 short width, short height, short mmWidth, short mmHeight); 617 618extern _X_EXPORT Bool 619 RRRegisterRate(ScreenPtr pScreen, RRScreenSizePtr pSize, int rate); 620 621/* 622 * Finally, set the current configuration of the screen 623 */ 624 625extern _X_EXPORT void 626 627RRSetCurrentConfig(ScreenPtr pScreen, 628 Rotation rotation, int rate, RRScreenSizePtr pSize); 629 630extern _X_EXPORT Rotation RRGetRotation(ScreenPtr pScreen); 631 632#endif 633 634/* rrcrtc.c */ 635 636/* 637 * Notify the CRTC of some change; layoutChanged indicates that 638 * some position or size element changed 639 */ 640extern _X_EXPORT void 641 RRCrtcChanged(RRCrtcPtr crtc, Bool layoutChanged); 642 643/* 644 * Create a CRTC 645 */ 646extern _X_EXPORT RRCrtcPtr RRCrtcCreate(ScreenPtr pScreen, void *devPrivate); 647 648/* 649 * Set the allowed rotations on a CRTC 650 */ 651extern _X_EXPORT void 652 RRCrtcSetRotations(RRCrtcPtr crtc, Rotation rotations); 653 654/* 655 * Set whether transforms are allowed on a CRTC 656 */ 657extern _X_EXPORT void 658 RRCrtcSetTransformSupport(RRCrtcPtr crtc, Bool transforms); 659 660/* 661 * Notify the extension that the Crtc has been reconfigured, 662 * the driver calls this whenever it has updated the mode 663 */ 664extern _X_EXPORT Bool 665 666RRCrtcNotify(RRCrtcPtr crtc, 667 RRModePtr mode, 668 int x, 669 int y, 670 Rotation rotation, 671 RRTransformPtr transform, int numOutputs, RROutputPtr * outputs); 672 673extern _X_EXPORT void 674 RRDeliverCrtcEvent(ClientPtr client, WindowPtr pWin, RRCrtcPtr crtc); 675 676/* 677 * Request that the Crtc be reconfigured 678 */ 679extern _X_EXPORT Bool 680 681RRCrtcSet(RRCrtcPtr crtc, 682 RRModePtr mode, 683 int x, 684 int y, Rotation rotation, int numOutput, RROutputPtr * outputs); 685 686/* 687 * Request that the Crtc gamma be changed 688 */ 689 690extern _X_EXPORT Bool 691 RRCrtcGammaSet(RRCrtcPtr crtc, CARD16 *red, CARD16 *green, CARD16 *blue); 692 693/* 694 * Request current gamma back from the DDX (if possible). 695 * This includes gamma size. 696 */ 697 698extern _X_EXPORT Bool 699 RRCrtcGammaGet(RRCrtcPtr crtc); 700 701/* 702 * Notify the extension that the Crtc gamma has been changed 703 * The driver calls this whenever it has changed the gamma values 704 * in the RRCrtcRec 705 */ 706 707extern _X_EXPORT Bool 708 RRCrtcGammaNotify(RRCrtcPtr crtc); 709 710/* 711 * Set the size of the gamma table at server startup time 712 */ 713 714extern _X_EXPORT Bool 715 RRCrtcGammaSetSize(RRCrtcPtr crtc, int size); 716 717/* 718 * Return the area of the frame buffer scanned out by the crtc, 719 * taking into account the current mode and rotation 720 */ 721 722extern _X_EXPORT void 723 RRCrtcGetScanoutSize(RRCrtcPtr crtc, int *width, int *height); 724 725/* 726 * Return crtc transform 727 */ 728extern _X_EXPORT RRTransformPtr RRCrtcGetTransform(RRCrtcPtr crtc); 729 730/* 731 * Check whether the pending and current transforms are the same 732 */ 733extern _X_EXPORT Bool 734 RRCrtcPendingTransform(RRCrtcPtr crtc); 735 736/* 737 * Destroy a Crtc at shutdown 738 */ 739extern _X_EXPORT void 740 RRCrtcDestroy(RRCrtcPtr crtc); 741 742/* 743 * Set the pending CRTC transformation 744 */ 745 746extern _X_EXPORT int 747 748RRCrtcTransformSet(RRCrtcPtr crtc, 749 PictTransformPtr transform, 750 struct pict_f_transform *f_transform, 751 struct pict_f_transform *f_inverse, 752 char *filter, int filter_len, xFixed * params, int nparams); 753 754/* 755 * Initialize crtc type 756 */ 757extern _X_EXPORT Bool 758 RRCrtcInit(void); 759 760/* 761 * Initialize crtc type error value 762 */ 763extern _X_EXPORT void 764 RRCrtcInitErrorValue(void); 765 766/* 767 * Detach and free a scanout pixmap 768 */ 769extern _X_EXPORT void 770 RRCrtcDetachScanoutPixmap(RRCrtcPtr crtc); 771 772extern _X_EXPORT Bool 773 RRReplaceScanoutPixmap(DrawablePtr pDrawable, PixmapPtr pPixmap, Bool enable); 774 775/* 776 * Return if the screen has any scanout_pixmap's attached 777 */ 778extern _X_EXPORT Bool 779 RRHasScanoutPixmap(ScreenPtr pScreen); 780 781/* 782 * Crtc dispatch 783 */ 784 785extern _X_EXPORT int 786 ProcRRGetCrtcInfo(ClientPtr client); 787 788extern _X_EXPORT int 789 ProcRRSetCrtcConfig(ClientPtr client); 790 791extern _X_EXPORT int 792 ProcRRGetCrtcGammaSize(ClientPtr client); 793 794extern _X_EXPORT int 795 ProcRRGetCrtcGamma(ClientPtr client); 796 797extern _X_EXPORT int 798 ProcRRSetCrtcGamma(ClientPtr client); 799 800extern _X_EXPORT int 801 ProcRRSetCrtcTransform(ClientPtr client); 802 803extern _X_EXPORT int 804 ProcRRGetCrtcTransform(ClientPtr client); 805 806int 807 ProcRRGetPanning(ClientPtr client); 808 809int 810 ProcRRSetPanning(ClientPtr client); 811 812void 813 RRConstrainCursorHarder(DeviceIntPtr, ScreenPtr, int, int *, int *); 814 815/* rrdispatch.c */ 816extern _X_EXPORT Bool 817 RRClientKnowsRates(ClientPtr pClient); 818 819/* rrlease.c */ 820void 821RRDeliverLeaseEvent(ClientPtr client, WindowPtr window); 822 823extern _X_EXPORT void 824RRLeaseTerminated(RRLeasePtr lease); 825 826extern _X_EXPORT void 827RRLeaseFree(RRLeasePtr lease); 828 829extern _X_EXPORT Bool 830RRCrtcIsLeased(RRCrtcPtr crtc); 831 832extern _X_EXPORT Bool 833RROutputIsLeased(RROutputPtr output); 834 835void 836RRTerminateLease(RRLeasePtr lease); 837 838Bool 839RRLeaseInit(void); 840 841/* rrmode.c */ 842/* 843 * Find, and if necessary, create a mode 844 */ 845 846extern _X_EXPORT RRModePtr RRModeGet(xRRModeInfo * modeInfo, const char *name); 847 848/* 849 * Destroy a mode. 850 */ 851 852extern _X_EXPORT void 853 RRModeDestroy(RRModePtr mode); 854 855/* 856 * Return a list of modes that are valid for some output in pScreen 857 */ 858extern _X_EXPORT RRModePtr *RRModesForScreen(ScreenPtr pScreen, int *num_ret); 859 860/* 861 * Initialize mode type 862 */ 863extern _X_EXPORT Bool 864 RRModeInit(void); 865 866/* 867 * Initialize mode type error value 868 */ 869extern _X_EXPORT void 870 RRModeInitErrorValue(void); 871 872extern _X_EXPORT int 873 ProcRRCreateMode(ClientPtr client); 874 875extern _X_EXPORT int 876 ProcRRDestroyMode(ClientPtr client); 877 878extern _X_EXPORT int 879 ProcRRAddOutputMode(ClientPtr client); 880 881extern _X_EXPORT int 882 ProcRRDeleteOutputMode(ClientPtr client); 883 884/* rroutput.c */ 885 886/* 887 * Notify the output of some change. configChanged indicates whether 888 * any external configuration (mode list, clones, connected status) 889 * has changed, or whether the change was strictly internal 890 * (which crtc is in use) 891 */ 892extern _X_EXPORT void 893 RROutputChanged(RROutputPtr output, Bool configChanged); 894 895/* 896 * Create an output 897 */ 898 899extern _X_EXPORT RROutputPtr 900RROutputCreate(ScreenPtr pScreen, 901 const char *name, int nameLength, void *devPrivate); 902 903/* 904 * Notify extension that output parameters have been changed 905 */ 906extern _X_EXPORT Bool 907 RROutputSetClones(RROutputPtr output, RROutputPtr * clones, int numClones); 908 909extern _X_EXPORT Bool 910 911RROutputSetModes(RROutputPtr output, 912 RRModePtr * modes, int numModes, int numPreferred); 913 914extern _X_EXPORT int 915 RROutputAddUserMode(RROutputPtr output, RRModePtr mode); 916 917extern _X_EXPORT int 918 RROutputDeleteUserMode(RROutputPtr output, RRModePtr mode); 919 920extern _X_EXPORT Bool 921 RROutputSetCrtcs(RROutputPtr output, RRCrtcPtr * crtcs, int numCrtcs); 922 923extern _X_EXPORT Bool 924 RROutputSetConnection(RROutputPtr output, CARD8 connection); 925 926extern _X_EXPORT Bool 927 RROutputSetSubpixelOrder(RROutputPtr output, int subpixelOrder); 928 929extern _X_EXPORT Bool 930 RROutputSetPhysicalSize(RROutputPtr output, int mmWidth, int mmHeight); 931 932extern _X_EXPORT void 933 RRDeliverOutputEvent(ClientPtr client, WindowPtr pWin, RROutputPtr output); 934 935extern _X_EXPORT void 936 RROutputDestroy(RROutputPtr output); 937 938extern _X_EXPORT int 939 ProcRRGetOutputInfo(ClientPtr client); 940 941extern _X_EXPORT int 942 ProcRRSetOutputPrimary(ClientPtr client); 943 944extern _X_EXPORT int 945 ProcRRGetOutputPrimary(ClientPtr client); 946 947/* 948 * Initialize output type 949 */ 950extern _X_EXPORT Bool 951 RROutputInit(void); 952 953/* 954 * Initialize output type error value 955 */ 956extern _X_EXPORT void 957 RROutputInitErrorValue(void); 958 959/* rrpointer.c */ 960extern _X_EXPORT void 961 RRPointerMoved(ScreenPtr pScreen, int x, int y); 962 963extern _X_EXPORT void 964 RRPointerScreenConfigured(ScreenPtr pScreen); 965 966/* rrproperty.c */ 967 968extern _X_EXPORT void 969 RRDeleteAllOutputProperties(RROutputPtr output); 970 971extern _X_EXPORT RRPropertyValuePtr 972RRGetOutputProperty(RROutputPtr output, Atom property, Bool pending); 973 974extern _X_EXPORT RRPropertyPtr 975RRQueryOutputProperty(RROutputPtr output, Atom property); 976 977extern _X_EXPORT void 978 RRDeleteOutputProperty(RROutputPtr output, Atom property); 979 980extern _X_EXPORT Bool 981 RRPostPendingProperties(RROutputPtr output); 982 983extern _X_EXPORT int 984 985RRChangeOutputProperty(RROutputPtr output, Atom property, Atom type, 986 int format, int mode, unsigned long len, 987 const void *value, Bool sendevent, Bool pending); 988 989extern _X_EXPORT int 990 991RRConfigureOutputProperty(RROutputPtr output, Atom property, 992 Bool pending, Bool range, Bool immutable, 993 int num_values, const INT32 *values); 994extern _X_EXPORT int 995 ProcRRChangeOutputProperty(ClientPtr client); 996 997extern _X_EXPORT int 998 ProcRRGetOutputProperty(ClientPtr client); 999 1000extern _X_EXPORT int 1001 ProcRRListOutputProperties(ClientPtr client); 1002 1003extern _X_EXPORT int 1004 ProcRRQueryOutputProperty(ClientPtr client); 1005 1006extern _X_EXPORT int 1007 ProcRRConfigureOutputProperty(ClientPtr client); 1008 1009extern _X_EXPORT int 1010 ProcRRDeleteOutputProperty(ClientPtr client); 1011 1012/* rrprovider.c */ 1013#define PRIME_SYNC_PROP "PRIME Synchronization" 1014extern _X_EXPORT void 1015RRProviderInitErrorValue(void); 1016 1017extern _X_EXPORT int 1018ProcRRGetProviders(ClientPtr client); 1019 1020extern _X_EXPORT int 1021ProcRRGetProviderInfo(ClientPtr client); 1022 1023extern _X_EXPORT int 1024ProcRRSetProviderOutputSource(ClientPtr client); 1025 1026extern _X_EXPORT int 1027ProcRRSetProviderOffloadSink(ClientPtr client); 1028 1029extern _X_EXPORT Bool 1030RRProviderInit(void); 1031 1032extern _X_EXPORT RRProviderPtr 1033RRProviderCreate(ScreenPtr pScreen, const char *name, 1034 int nameLength); 1035 1036extern _X_EXPORT void 1037RRProviderDestroy (RRProviderPtr provider); 1038 1039extern _X_EXPORT void 1040RRProviderSetCapabilities(RRProviderPtr provider, uint32_t capabilities); 1041 1042extern _X_EXPORT Bool 1043RRProviderLookup(XID id, RRProviderPtr *provider_p); 1044 1045extern _X_EXPORT void 1046RRDeliverProviderEvent(ClientPtr client, WindowPtr pWin, RRProviderPtr provider); 1047 1048/* rrproviderproperty.c */ 1049 1050extern _X_EXPORT void 1051 RRDeleteAllProviderProperties(RRProviderPtr provider); 1052 1053extern _X_EXPORT RRPropertyValuePtr 1054 RRGetProviderProperty(RRProviderPtr provider, Atom property, Bool pending); 1055 1056extern _X_EXPORT RRPropertyPtr 1057 RRQueryProviderProperty(RRProviderPtr provider, Atom property); 1058 1059extern _X_EXPORT void 1060 RRDeleteProviderProperty(RRProviderPtr provider, Atom property); 1061 1062extern _X_EXPORT int 1063RRChangeProviderProperty(RRProviderPtr provider, Atom property, Atom type, 1064 int format, int mode, unsigned long len, 1065 void *value, Bool sendevent, Bool pending); 1066 1067extern _X_EXPORT int 1068 RRConfigureProviderProperty(RRProviderPtr provider, Atom property, 1069 Bool pending, Bool range, Bool immutable, 1070 int num_values, INT32 *values); 1071 1072extern _X_EXPORT Bool 1073 RRPostProviderPendingProperties(RRProviderPtr provider); 1074 1075extern _X_EXPORT int 1076 ProcRRGetProviderProperty(ClientPtr client); 1077 1078extern _X_EXPORT int 1079 ProcRRListProviderProperties(ClientPtr client); 1080 1081extern _X_EXPORT int 1082 ProcRRQueryProviderProperty(ClientPtr client); 1083 1084extern _X_EXPORT int 1085ProcRRConfigureProviderProperty(ClientPtr client); 1086 1087extern _X_EXPORT int 1088ProcRRChangeProviderProperty(ClientPtr client); 1089 1090extern _X_EXPORT int 1091 ProcRRDeleteProviderProperty(ClientPtr client); 1092/* rrxinerama.c */ 1093#ifdef XINERAMA 1094extern _X_EXPORT void 1095 RRXineramaExtensionInit(void); 1096#endif 1097 1098void 1099RRMonitorInit(ScreenPtr screen); 1100 1101Bool 1102RRMonitorMakeList(ScreenPtr screen, Bool get_active, RRMonitorPtr *monitors_ret, int *nmon_ret); 1103 1104int 1105RRMonitorCountList(ScreenPtr screen); 1106 1107void 1108RRMonitorFreeList(RRMonitorPtr monitors, int nmon); 1109 1110void 1111RRMonitorClose(ScreenPtr screen); 1112 1113RRMonitorPtr 1114RRMonitorAlloc(int noutput); 1115 1116int 1117RRMonitorAdd(ClientPtr client, ScreenPtr screen, RRMonitorPtr monitor); 1118 1119void 1120RRMonitorFree(RRMonitorPtr monitor); 1121 1122int 1123ProcRRGetMonitors(ClientPtr client); 1124 1125int 1126ProcRRSetMonitor(ClientPtr client); 1127 1128int 1129ProcRRDeleteMonitor(ClientPtr client); 1130 1131int 1132ProcRRCreateLease(ClientPtr client); 1133 1134int 1135ProcRRFreeLease(ClientPtr client); 1136 1137#endif /* _RANDRSTR_H_ */ 1138 1139/* 1140 1141randr extension implementation structure 1142 1143Query state: 1144 ProcRRGetScreenInfo/ProcRRGetScreenResources 1145 RRGetInfo 1146 1147 • Request configuration from driver, either 1.0 or 1.2 style 1148 • These functions only record state changes, all 1149 other actions are pended until RRTellChanged is called 1150 1151 ->rrGetInfo 1152 1.0: 1153 RRRegisterSize 1154 RRRegisterRate 1155 RRSetCurrentConfig 1156 1.2: 1157 RRScreenSetSizeRange 1158 RROutputSetCrtcs 1159 RRModeGet 1160 RROutputSetModes 1161 RROutputSetConnection 1162 RROutputSetSubpixelOrder 1163 RROutputSetClones 1164 RRCrtcNotify 1165 1166 • Must delay scanning configuration until after ->rrGetInfo returns 1167 because some drivers will call SetCurrentConfig in the middle 1168 of the ->rrGetInfo operation. 1169 1170 1.0: 1171 1172 • Scan old configuration, mirror to new structures 1173 1174 RRScanOldConfig 1175 RRCrtcCreate 1176 RROutputCreate 1177 RROutputSetCrtcs 1178 RROutputSetConnection 1179 RROutputSetSubpixelOrder 1180 RROldModeAdd • This adds modes one-at-a-time 1181 RRModeGet 1182 RRCrtcNotify 1183 1184 • send events, reset pointer if necessary 1185 1186 RRTellChanged 1187 WalkTree (sending events) 1188 1189 • when layout has changed: 1190 RRPointerScreenConfigured 1191 RRSendConfigNotify 1192 1193Asynchronous state setting (1.2 only) 1194 When setting state asynchronously, the driver invokes the 1195 ->rrGetInfo function and then calls RRTellChanged to flush 1196 the changes to the clients and reset pointer if necessary 1197 1198Set state 1199 1200 ProcRRSetScreenConfig 1201 RRCrtcSet 1202 1.2: 1203 ->rrCrtcSet 1204 RRCrtcNotify 1205 1.0: 1206 ->rrSetConfig 1207 RRCrtcNotify 1208 RRTellChanged 1209 */ 1210