xf86Crtc.h (28925B)
1 /* 2 * Copyright © 2006 Keith Packard 3 * Copyright © 2011 Aaron Plattner 4 * 5 * Permission to use, copy, modify, distribute, and sell this software and its 6 * documentation for any purpose is hereby granted without fee, provided that 7 * the above copyright notice appear in all copies and that both that copyright 8 * notice and this permission notice appear in supporting documentation, and 9 * that the name of the copyright holders not be used in advertising or 10 * publicity pertaining to distribution of the software without specific, 11 * written prior permission. The copyright holders make no representations 12 * about the suitability of this software for any purpose. It is provided "as 13 * is" without express or implied warranty. 14 * 15 * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, 16 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO 17 * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR 18 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, 19 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 20 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 21 * OF THIS SOFTWARE. 22 */ 23 #ifndef _XF86CRTC_H_ 24 #define _XF86CRTC_H_ 25 26 #include <edid.h> 27 #include "randrstr.h" 28 #include "xf86Modes.h" 29 #include "xf86Cursor.h" 30 #include "xf86i2c.h" 31 #include "damage.h" 32 #include "picturestr.h" 33 34 /* Compat definitions for older X Servers. */ 35 #ifndef M_T_PREFERRED 36 #define M_T_PREFERRED 0x08 37 #endif 38 #ifndef M_T_DRIVER 39 #define M_T_DRIVER 0x40 40 #endif 41 #ifndef M_T_USERPREF 42 #define M_T_USERPREF 0x80 43 #endif 44 #ifndef HARDWARE_CURSOR_ARGB 45 #define HARDWARE_CURSOR_ARGB 0x00004000 46 #endif 47 48 typedef struct _xf86Crtc xf86CrtcRec, *xf86CrtcPtr; 49 typedef struct _xf86Output xf86OutputRec, *xf86OutputPtr; 50 typedef struct _xf86Lease xf86LeaseRec, *xf86LeasePtr; 51 52 /* define a standard for connector types */ 53 typedef enum _xf86ConnectorType { 54 XF86ConnectorNone, 55 XF86ConnectorVGA, 56 XF86ConnectorDVI_I, 57 XF86ConnectorDVI_D, 58 XF86ConnectorDVI_A, 59 XF86ConnectorComposite, 60 XF86ConnectorSvideo, 61 XF86ConnectorComponent, 62 XF86ConnectorLFP, 63 XF86ConnectorProprietary, 64 XF86ConnectorHDMI, 65 XF86ConnectorDisplayPort, 66 } xf86ConnectorType; 67 68 typedef enum _xf86OutputStatus { 69 XF86OutputStatusConnected, 70 XF86OutputStatusDisconnected, 71 XF86OutputStatusUnknown 72 } xf86OutputStatus; 73 74 typedef enum _xf86DriverTransforms { 75 XF86DriverTransformNone = 0, 76 XF86DriverTransformOutput = 1 << 0, 77 XF86DriverTransformCursorImage = 1 << 1, 78 XF86DriverTransformCursorPosition = 1 << 2, 79 } xf86DriverTransforms; 80 81 82 struct xf86CrtcTileInfo { 83 uint32_t group_id; 84 uint32_t flags; 85 uint32_t num_h_tile; 86 uint32_t num_v_tile; 87 uint32_t tile_h_loc; 88 uint32_t tile_v_loc; 89 uint32_t tile_h_size; 90 uint32_t tile_v_size; 91 }; 92 93 typedef struct _xf86CrtcFuncs { 94 /** 95 * Turns the crtc on/off, or sets intermediate power levels if available. 96 * 97 * Unsupported intermediate modes drop to the lower power setting. If the 98 * mode is DPMSModeOff, the crtc must be disabled sufficiently for it to 99 * be safe to call mode_set. 100 */ 101 void 102 (*dpms) (xf86CrtcPtr crtc, int mode); 103 104 /** 105 * Saves the crtc's state for restoration on VT switch. 106 */ 107 void 108 (*save) (xf86CrtcPtr crtc); 109 110 /** 111 * Restore's the crtc's state at VT switch. 112 */ 113 void 114 (*restore) (xf86CrtcPtr crtc); 115 116 /** 117 * Lock CRTC prior to mode setting, mostly for DRI. 118 * Returns whether unlock is needed 119 */ 120 Bool 121 (*lock) (xf86CrtcPtr crtc); 122 123 /** 124 * Unlock CRTC after mode setting, mostly for DRI 125 */ 126 void 127 (*unlock) (xf86CrtcPtr crtc); 128 129 /** 130 * Callback to adjust the mode to be set in the CRTC. 131 * 132 * This allows a CRTC to adjust the clock or even the entire set of 133 * timings, which is used for panels with fixed timings or for 134 * buses with clock limitations. 135 */ 136 Bool 137 (*mode_fixup) (xf86CrtcPtr crtc, 138 DisplayModePtr mode, DisplayModePtr adjusted_mode); 139 140 /** 141 * Prepare CRTC for an upcoming mode set. 142 */ 143 void 144 (*prepare) (xf86CrtcPtr crtc); 145 146 /** 147 * Callback for setting up a video mode after fixups have been made. 148 */ 149 void 150 (*mode_set) (xf86CrtcPtr crtc, 151 DisplayModePtr mode, 152 DisplayModePtr adjusted_mode, int x, int y); 153 154 /** 155 * Commit mode changes to a CRTC 156 */ 157 void 158 (*commit) (xf86CrtcPtr crtc); 159 160 /* Set the color ramps for the CRTC to the given values. */ 161 void 162 (*gamma_set) (xf86CrtcPtr crtc, CARD16 *red, CARD16 *green, CARD16 *blue, 163 int size); 164 165 /** 166 * Allocate the shadow area, delay the pixmap creation until needed 167 */ 168 void *(*shadow_allocate) (xf86CrtcPtr crtc, int width, int height); 169 170 /** 171 * Create shadow pixmap for rotation support 172 */ 173 PixmapPtr 174 (*shadow_create) (xf86CrtcPtr crtc, void *data, int width, int height); 175 176 /** 177 * Destroy shadow pixmap 178 */ 179 void 180 (*shadow_destroy) (xf86CrtcPtr crtc, PixmapPtr pPixmap, void *data); 181 182 /** 183 * Set cursor colors 184 */ 185 void 186 (*set_cursor_colors) (xf86CrtcPtr crtc, int bg, int fg); 187 188 /** 189 * Set cursor position 190 */ 191 void 192 (*set_cursor_position) (xf86CrtcPtr crtc, int x, int y); 193 194 /** 195 * Show cursor 196 */ 197 void 198 (*show_cursor) (xf86CrtcPtr crtc); 199 Bool 200 (*show_cursor_check) (xf86CrtcPtr crtc); 201 202 /** 203 * Hide cursor 204 */ 205 void 206 (*hide_cursor) (xf86CrtcPtr crtc); 207 208 /** 209 * Load monochrome image 210 */ 211 void 212 (*load_cursor_image) (xf86CrtcPtr crtc, CARD8 *image); 213 Bool 214 (*load_cursor_image_check) (xf86CrtcPtr crtc, CARD8 *image); 215 216 /** 217 * Load ARGB image 218 */ 219 void 220 (*load_cursor_argb) (xf86CrtcPtr crtc, CARD32 *image); 221 Bool 222 (*load_cursor_argb_check) (xf86CrtcPtr crtc, CARD32 *image); 223 224 /** 225 * Clean up driver-specific bits of the crtc 226 */ 227 void 228 (*destroy) (xf86CrtcPtr crtc); 229 230 /** 231 * Less fine-grained mode setting entry point for kernel modesetting 232 */ 233 Bool 234 (*set_mode_major) (xf86CrtcPtr crtc, DisplayModePtr mode, 235 Rotation rotation, int x, int y); 236 237 /** 238 * Callback for panning. Doesn't change the mode. 239 * Added in ABI version 2 240 */ 241 void 242 (*set_origin) (xf86CrtcPtr crtc, int x, int y); 243 244 /** 245 */ 246 Bool 247 (*set_scanout_pixmap)(xf86CrtcPtr crtc, PixmapPtr pixmap); 248 249 } xf86CrtcFuncsRec, *xf86CrtcFuncsPtr; 250 251 #define XF86_CRTC_VERSION 8 252 253 struct _xf86Crtc { 254 /** 255 * ABI versioning 256 */ 257 int version; 258 259 /** 260 * Associated ScrnInfo 261 */ 262 ScrnInfoPtr scrn; 263 264 /** 265 * Desired state of this CRTC 266 * 267 * Set when this CRTC should be driving one or more outputs 268 */ 269 Bool enabled; 270 271 /** 272 * Active mode 273 * 274 * This reflects the mode as set in the CRTC currently 275 * It will be cleared when the VT is not active or 276 * during server startup 277 */ 278 DisplayModeRec mode; 279 Rotation rotation; 280 PixmapPtr rotatedPixmap; 281 void *rotatedData; 282 283 /** 284 * Position on screen 285 * 286 * Locates this CRTC within the frame buffer 287 */ 288 int x, y; 289 290 /** 291 * Desired mode 292 * 293 * This is set to the requested mode, independent of 294 * whether the VT is active. In particular, it receives 295 * the startup configured mode and saves the active mode 296 * on VT switch. 297 */ 298 DisplayModeRec desiredMode; 299 Rotation desiredRotation; 300 int desiredX, desiredY; 301 302 /** crtc-specific functions */ 303 const xf86CrtcFuncsRec *funcs; 304 305 /** 306 * Driver private 307 * 308 * Holds driver-private information 309 */ 310 void *driver_private; 311 312 #ifdef RANDR_12_INTERFACE 313 /** 314 * RandR crtc 315 * 316 * When RandR 1.2 is available, this 317 * points at the associated crtc object 318 */ 319 RRCrtcPtr randr_crtc; 320 #else 321 void *randr_crtc; 322 #endif 323 324 /** 325 * Current cursor is ARGB 326 */ 327 Bool cursor_argb; 328 /** 329 * Track whether cursor is within CRTC range 330 */ 331 Bool cursor_in_range; 332 /** 333 * Track state of cursor associated with this CRTC 334 */ 335 Bool cursor_shown; 336 337 /** 338 * Current transformation matrix 339 */ 340 PictTransform crtc_to_framebuffer; 341 /* framebuffer_to_crtc was removed in ABI 2 */ 342 struct pict_f_transform f_crtc_to_framebuffer; /* ABI 2 */ 343 struct pict_f_transform f_framebuffer_to_crtc; /* ABI 2 */ 344 PictFilterPtr filter; /* ABI 2 */ 345 xFixed *params; /* ABI 2 */ 346 int nparams; /* ABI 2 */ 347 int filter_width; /* ABI 2 */ 348 int filter_height; /* ABI 2 */ 349 Bool transform_in_use; 350 RRTransformRec transform; /* ABI 2 */ 351 Bool transformPresent; /* ABI 2 */ 352 RRTransformRec desiredTransform; /* ABI 2 */ 353 Bool desiredTransformPresent; /* ABI 2 */ 354 /** 355 * Bounding box in screen space 356 */ 357 BoxRec bounds; 358 /** 359 * Panning: 360 * TotalArea: total panning area, larger than CRTC's size 361 * TrackingArea: Area of the pointer for which the CRTC is panned 362 * border: Borders of the displayed CRTC area which induces panning if the pointer reaches them 363 * Added in ABI version 2 364 */ 365 BoxRec panningTotalArea; 366 BoxRec panningTrackingArea; 367 INT16 panningBorder[4]; 368 369 /** 370 * Current gamma, especially useful after initial config. 371 * Added in ABI version 3 372 */ 373 CARD16 *gamma_red; 374 CARD16 *gamma_green; 375 CARD16 *gamma_blue; 376 int gamma_size; 377 378 /** 379 * Actual state of this CRTC 380 * 381 * Set to TRUE after modesetting, set to FALSE if no outputs are connected 382 * Added in ABI version 3 383 */ 384 Bool active; 385 /** 386 * Clear the shadow 387 */ 388 Bool shadowClear; 389 390 /** 391 * Indicates that the driver is handling some or all transforms: 392 * 393 * XF86DriverTransformOutput: The driver handles the output transform, so 394 * the shadow surface should be disabled. The driver writes this field 395 * before calling xf86CrtcRotate to indicate that it is handling the 396 * transform (including rotation and reflection). 397 * 398 * XF86DriverTransformCursorImage: Setting this flag causes the server to 399 * pass the untransformed cursor image to the driver hook. 400 * 401 * XF86DriverTransformCursorPosition: Setting this flag causes the server 402 * to pass the untransformed cursor position to the driver hook. 403 * 404 * Added in ABI version 4, changed to xf86DriverTransforms in ABI version 7 405 */ 406 xf86DriverTransforms driverIsPerformingTransform; 407 408 /* Added in ABI version 5 409 */ 410 PixmapPtr current_scanout; 411 412 /* Added in ABI version 6 413 */ 414 PixmapPtr current_scanout_back; 415 }; 416 417 typedef struct _xf86OutputFuncs { 418 /** 419 * Called to allow the output a chance to create properties after the 420 * RandR objects have been created. 421 */ 422 void 423 (*create_resources) (xf86OutputPtr output); 424 425 /** 426 * Turns the output on/off, or sets intermediate power levels if available. 427 * 428 * Unsupported intermediate modes drop to the lower power setting. If the 429 * mode is DPMSModeOff, the output must be disabled, as the DPLL may be 430 * disabled afterwards. 431 */ 432 void 433 (*dpms) (xf86OutputPtr output, int mode); 434 435 /** 436 * Saves the output's state for restoration on VT switch. 437 */ 438 void 439 (*save) (xf86OutputPtr output); 440 441 /** 442 * Restore's the output's state at VT switch. 443 */ 444 void 445 (*restore) (xf86OutputPtr output); 446 447 /** 448 * Callback for testing a video mode for a given output. 449 * 450 * This function should only check for cases where a mode can't be supported 451 * on the output specifically, and not represent generic CRTC limitations. 452 * 453 * \return MODE_OK if the mode is valid, or another MODE_* otherwise. 454 */ 455 int 456 (*mode_valid) (xf86OutputPtr output, DisplayModePtr pMode); 457 458 /** 459 * Callback to adjust the mode to be set in the CRTC. 460 * 461 * This allows an output to adjust the clock or even the entire set of 462 * timings, which is used for panels with fixed timings or for 463 * buses with clock limitations. 464 */ 465 Bool 466 (*mode_fixup) (xf86OutputPtr output, 467 DisplayModePtr mode, DisplayModePtr adjusted_mode); 468 469 /** 470 * Callback for preparing mode changes on an output 471 */ 472 void 473 (*prepare) (xf86OutputPtr output); 474 475 /** 476 * Callback for committing mode changes on an output 477 */ 478 void 479 (*commit) (xf86OutputPtr output); 480 481 /** 482 * Callback for setting up a video mode after fixups have been made. 483 * 484 * This is only called while the output is disabled. The dpms callback 485 * must be all that's necessary for the output, to turn the output on 486 * after this function is called. 487 */ 488 void 489 (*mode_set) (xf86OutputPtr output, 490 DisplayModePtr mode, DisplayModePtr adjusted_mode); 491 492 /** 493 * Probe for a connected output, and return detect_status. 494 */ 495 xf86OutputStatus(*detect) (xf86OutputPtr output); 496 497 /** 498 * Query the device for the modes it provides. 499 * 500 * This function may also update MonInfo, mm_width, and mm_height. 501 * 502 * \return singly-linked list of modes or NULL if no modes found. 503 */ 504 DisplayModePtr(*get_modes) (xf86OutputPtr output); 505 506 #ifdef RANDR_12_INTERFACE 507 /** 508 * Callback when an output's property has changed. 509 */ 510 Bool 511 (*set_property) (xf86OutputPtr output, 512 Atom property, RRPropertyValuePtr value); 513 #endif 514 #ifdef RANDR_13_INTERFACE 515 /** 516 * Callback to get an updated property value 517 */ 518 Bool 519 (*get_property) (xf86OutputPtr output, Atom property); 520 #endif 521 #ifdef RANDR_GET_CRTC_INTERFACE 522 /** 523 * Callback to get current CRTC for a given output 524 */ 525 xf86CrtcPtr(*get_crtc) (xf86OutputPtr output); 526 #endif 527 /** 528 * Clean up driver-specific bits of the output 529 */ 530 void 531 (*destroy) (xf86OutputPtr output); 532 } xf86OutputFuncsRec, *xf86OutputFuncsPtr; 533 534 #define XF86_OUTPUT_VERSION 3 535 536 struct _xf86Output { 537 /** 538 * ABI versioning 539 */ 540 int version; 541 542 /** 543 * Associated ScrnInfo 544 */ 545 ScrnInfoPtr scrn; 546 547 /** 548 * Currently connected crtc (if any) 549 * 550 * If this output is not in use, this field will be NULL. 551 */ 552 xf86CrtcPtr crtc; 553 554 /** 555 * Possible CRTCs for this output as a mask of crtc indices 556 */ 557 CARD32 possible_crtcs; 558 559 /** 560 * Possible outputs to share the same CRTC as a mask of output indices 561 */ 562 CARD32 possible_clones; 563 564 /** 565 * Whether this output can support interlaced modes 566 */ 567 Bool interlaceAllowed; 568 569 /** 570 * Whether this output can support double scan modes 571 */ 572 Bool doubleScanAllowed; 573 574 /** 575 * List of available modes on this output. 576 * 577 * This should be the list from get_modes(), plus perhaps additional 578 * compatible modes added later. 579 */ 580 DisplayModePtr probed_modes; 581 582 /** 583 * Options parsed from the related monitor section 584 */ 585 OptionInfoPtr options; 586 587 /** 588 * Configured monitor section 589 */ 590 XF86ConfMonitorPtr conf_monitor; 591 592 /** 593 * Desired initial position 594 */ 595 int initial_x, initial_y; 596 597 /** 598 * Desired initial rotation 599 */ 600 Rotation initial_rotation; 601 602 /** 603 * Current connection status 604 * 605 * This indicates whether a monitor is known to be connected 606 * to this output or not, or whether there is no way to tell 607 */ 608 xf86OutputStatus status; 609 610 /** EDID monitor information */ 611 xf86MonPtr MonInfo; 612 613 /** subpixel order */ 614 int subpixel_order; 615 616 /** Physical size of the currently attached output device. */ 617 int mm_width, mm_height; 618 619 /** Output name */ 620 char *name; 621 622 /** output-specific functions */ 623 const xf86OutputFuncsRec *funcs; 624 625 /** driver private information */ 626 void *driver_private; 627 628 /** Whether to use the old per-screen Monitor config section */ 629 Bool use_screen_monitor; 630 631 /** For pre-init, whether the output should be excluded from the 632 * desktop when there are other viable outputs to use 633 */ 634 Bool non_desktop; 635 636 #ifdef RANDR_12_INTERFACE 637 /** 638 * RandR 1.2 output structure. 639 * 640 * When RandR 1.2 is available, this points at the associated 641 * RandR output structure and is created when this output is created 642 */ 643 RROutputPtr randr_output; 644 #else 645 void *randr_output; 646 #endif 647 /** 648 * Desired initial panning 649 * Added in ABI version 2 650 */ 651 BoxRec initialTotalArea; 652 BoxRec initialTrackingArea; 653 INT16 initialBorder[4]; 654 655 struct xf86CrtcTileInfo tile_info; 656 }; 657 658 typedef struct _xf86ProviderFuncs { 659 /** 660 * Called to allow the provider a chance to create properties after the 661 * RandR objects have been created. 662 */ 663 void 664 (*create_resources) (ScrnInfoPtr scrn); 665 666 /** 667 * Callback when an provider's property has changed. 668 */ 669 Bool 670 (*set_property) (ScrnInfoPtr scrn, 671 Atom property, RRPropertyValuePtr value); 672 673 /** 674 * Callback to get an updated property value 675 */ 676 Bool 677 (*get_property) (ScrnInfoPtr provider, Atom property); 678 679 } xf86ProviderFuncsRec, *xf86ProviderFuncsPtr; 680 681 #define XF86_LEASE_VERSION 1 682 683 struct _xf86Lease { 684 /** 685 * ABI versioning 686 */ 687 int version; 688 689 /** 690 * Associated ScrnInfo 691 */ 692 ScrnInfoPtr scrn; 693 694 /** 695 * Driver private 696 */ 697 void *driver_private; 698 699 /** 700 * RandR lease 701 */ 702 RRLeasePtr randr_lease; 703 704 /* 705 * Contents of the lease 706 */ 707 708 /** 709 * Number of leased CRTCs 710 */ 711 int num_crtc; 712 713 /** 714 * Number of leased outputs 715 */ 716 int num_output; 717 718 /** 719 * Array of pointers to leased CRTCs 720 */ 721 RRCrtcPtr *crtcs; 722 723 /** 724 * Array of pointers to leased outputs 725 */ 726 RROutputPtr *outputs; 727 }; 728 729 typedef struct _xf86CrtcConfigFuncs { 730 /** 731 * Requests that the driver resize the screen. 732 * 733 * The driver is responsible for updating scrn->virtualX and scrn->virtualY. 734 * If the requested size cannot be set, the driver should leave those values 735 * alone and return FALSE. 736 * 737 * A naive driver that cannot reallocate the screen may simply change 738 * virtual[XY]. A more advanced driver will want to also change the 739 * devPrivate.ptr and devKind of the screen pixmap, update any offscreen 740 * pixmaps it may have moved, and change pScrn->displayWidth. 741 */ 742 Bool 743 (*resize) (ScrnInfoPtr scrn, int width, int height); 744 745 /** 746 * Requests that the driver create a lease 747 */ 748 int (*create_lease)(RRLeasePtr lease, int *fd); 749 750 /** 751 * Ask the driver to terminate a lease, freeing all 752 * driver resources 753 */ 754 void (*terminate_lease)(RRLeasePtr lease); 755 } xf86CrtcConfigFuncsRec, *xf86CrtcConfigFuncsPtr; 756 757 /* 758 * The driver calls this when it detects that a lease 759 * has been terminated 760 */ 761 extern _X_EXPORT void 762 xf86CrtcLeaseTerminated(RRLeasePtr lease); 763 764 extern _X_EXPORT void 765 xf86CrtcLeaseStarted(RRLeasePtr lease); 766 767 typedef void (*xf86_crtc_notify_proc_ptr) (ScreenPtr pScreen); 768 769 typedef struct _xf86CrtcConfig { 770 int num_output; 771 xf86OutputPtr *output; 772 /** 773 * compat_output is used whenever we deal 774 * with legacy code that only understands a single 775 * output. pScrn->modes will be loaded from this output, 776 * adjust frame will whack this output, etc. 777 */ 778 int compat_output; 779 780 int num_crtc; 781 xf86CrtcPtr *crtc; 782 783 int minWidth, minHeight; 784 int maxWidth, maxHeight; 785 786 /* For crtc-based rotation */ 787 DamagePtr rotation_damage; 788 Bool rotation_damage_registered; 789 790 /* DGA */ 791 unsigned int dga_flags; 792 unsigned long dga_address; 793 DGAModePtr dga_modes; 794 int dga_nmode; 795 int dga_width, dga_height, dga_stride; 796 DisplayModePtr dga_save_mode; 797 798 const xf86CrtcConfigFuncsRec *funcs; 799 800 CreateScreenResourcesProcPtr CreateScreenResources; 801 802 CloseScreenProcPtr CloseScreen; 803 804 /* Cursor information */ 805 xf86CursorInfoPtr cursor_info; 806 CursorPtr cursor; 807 CARD8 *cursor_image; 808 Bool cursor_on; 809 CARD32 cursor_fg, cursor_bg; 810 811 /** 812 * Options parsed from the related device section 813 */ 814 OptionInfoPtr options; 815 816 Bool debug_modes; 817 818 /* wrap screen BlockHandler for rotation */ 819 ScreenBlockHandlerProcPtr BlockHandler; 820 821 /* callback when crtc configuration changes */ 822 xf86_crtc_notify_proc_ptr xf86_crtc_notify; 823 824 char *name; 825 const xf86ProviderFuncsRec *provider_funcs; 826 #ifdef RANDR_12_INTERFACE 827 RRProviderPtr randr_provider; 828 #else 829 void *randr_provider; 830 #endif 831 } xf86CrtcConfigRec, *xf86CrtcConfigPtr; 832 833 extern _X_EXPORT int xf86CrtcConfigPrivateIndex; 834 835 #define XF86_CRTC_CONFIG_PTR(p) ((xf86CrtcConfigPtr) ((p)->privates[xf86CrtcConfigPrivateIndex].ptr)) 836 837 static _X_INLINE xf86OutputPtr 838 xf86CompatOutput(ScrnInfoPtr pScrn) 839 { 840 xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn); 841 842 if (xf86CrtcConfigPrivateIndex == -1) 843 return NULL; 844 845 if (config->compat_output < 0) 846 return NULL; 847 return config->output[config->compat_output]; 848 } 849 850 static _X_INLINE xf86CrtcPtr 851 xf86CompatCrtc(ScrnInfoPtr pScrn) 852 { 853 xf86OutputPtr compat_output = xf86CompatOutput(pScrn); 854 855 if (!compat_output) 856 return NULL; 857 return compat_output->crtc; 858 } 859 860 static _X_INLINE RRCrtcPtr 861 xf86CompatRRCrtc(ScrnInfoPtr pScrn) 862 { 863 xf86CrtcPtr compat_crtc = xf86CompatCrtc(pScrn); 864 865 if (!compat_crtc) 866 return NULL; 867 return compat_crtc->randr_crtc; 868 } 869 870 /* 871 * Initialize xf86CrtcConfig structure 872 */ 873 874 extern _X_EXPORT void 875 xf86CrtcConfigInit(ScrnInfoPtr scrn, const xf86CrtcConfigFuncsRec * funcs); 876 877 extern _X_EXPORT void 878 879 xf86CrtcSetSizeRange(ScrnInfoPtr scrn, 880 int minWidth, int minHeight, int maxWidth, int maxHeight); 881 882 /* 883 * Crtc functions 884 */ 885 extern _X_EXPORT xf86CrtcPtr 886 xf86CrtcCreate(ScrnInfoPtr scrn, const xf86CrtcFuncsRec * funcs); 887 888 extern _X_EXPORT void 889 xf86CrtcDestroy(xf86CrtcPtr crtc); 890 891 /** 892 * Sets the given video mode on the given crtc 893 */ 894 895 extern _X_EXPORT Bool 896 897 xf86CrtcSetModeTransform(xf86CrtcPtr crtc, DisplayModePtr mode, 898 Rotation rotation, RRTransformPtr transform, int x, 899 int y); 900 901 extern _X_EXPORT Bool 902 903 xf86CrtcSetMode(xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation, 904 int x, int y); 905 906 extern _X_EXPORT void 907 xf86CrtcSetOrigin(xf86CrtcPtr crtc, int x, int y); 908 909 /* 910 * Assign crtc rotation during mode set 911 */ 912 extern _X_EXPORT Bool 913 xf86CrtcRotate(xf86CrtcPtr crtc); 914 915 /* 916 * Clean up any rotation data, used when a crtc is turned off 917 * as well as when rotation is disabled. 918 */ 919 extern _X_EXPORT void 920 xf86RotateDestroy(xf86CrtcPtr crtc); 921 922 /* 923 * free shadow memory allocated for all crtcs 924 */ 925 extern _X_EXPORT void 926 xf86RotateFreeShadow(ScrnInfoPtr pScrn); 927 928 /* 929 * Clean up rotation during CloseScreen 930 */ 931 extern _X_EXPORT void 932 xf86RotateCloseScreen(ScreenPtr pScreen); 933 934 /** 935 * Return whether any output is assigned to the crtc 936 */ 937 extern _X_EXPORT Bool 938 xf86CrtcInUse(xf86CrtcPtr crtc); 939 940 /* 941 * Output functions 942 */ 943 extern _X_EXPORT xf86OutputPtr 944 xf86OutputCreate(ScrnInfoPtr scrn, 945 const xf86OutputFuncsRec * funcs, const char *name); 946 947 extern _X_EXPORT void 948 xf86OutputUseScreenMonitor(xf86OutputPtr output, Bool use_screen_monitor); 949 950 extern _X_EXPORT Bool 951 xf86OutputRename(xf86OutputPtr output, const char *name); 952 953 extern _X_EXPORT void 954 xf86OutputDestroy(xf86OutputPtr output); 955 956 extern _X_EXPORT void 957 xf86ProbeOutputModes(ScrnInfoPtr pScrn, int maxX, int maxY); 958 959 extern _X_EXPORT void 960 xf86SetScrnInfoModes(ScrnInfoPtr pScrn); 961 962 #ifdef RANDR_13_INTERFACE 963 #define ScreenInitRetType int 964 #else 965 #define ScreenInitRetType Bool 966 #endif 967 968 extern _X_EXPORT ScreenInitRetType xf86CrtcScreenInit(ScreenPtr pScreen); 969 970 extern _X_EXPORT void 971 xf86AssignNoOutputInitialSize(ScrnInfoPtr scrn, const OptionInfoRec *options, 972 int *no_output_width, int *no_output_height); 973 974 extern _X_EXPORT Bool 975 xf86InitialConfiguration(ScrnInfoPtr pScrn, Bool canGrow); 976 977 extern _X_EXPORT void 978 xf86DPMSSet(ScrnInfoPtr pScrn, int PowerManagementMode, int flags); 979 980 extern _X_EXPORT Bool 981 xf86SaveScreen(ScreenPtr pScreen, int mode); 982 983 extern _X_EXPORT void 984 xf86DisableUnusedFunctions(ScrnInfoPtr pScrn); 985 986 extern _X_EXPORT DisplayModePtr 987 xf86OutputFindClosestMode(xf86OutputPtr output, DisplayModePtr desired); 988 989 extern _X_EXPORT Bool 990 991 xf86SetSingleMode(ScrnInfoPtr pScrn, DisplayModePtr desired, Rotation rotation); 992 993 /** 994 * Set the EDID information for the specified output 995 */ 996 extern _X_EXPORT void 997 xf86OutputSetEDID(xf86OutputPtr output, xf86MonPtr edid_mon); 998 999 /** 1000 * Set the TILE information for the specified output 1001 */ 1002 extern _X_EXPORT void 1003 xf86OutputSetTile(xf86OutputPtr output, struct xf86CrtcTileInfo *tile_info); 1004 1005 extern _X_EXPORT Bool 1006 xf86OutputParseKMSTile(const char *tile_data, int tile_length, struct xf86CrtcTileInfo *tile_info); 1007 1008 /** 1009 * Return the list of modes supported by the EDID information 1010 * stored in 'output' 1011 */ 1012 extern _X_EXPORT DisplayModePtr xf86OutputGetEDIDModes(xf86OutputPtr output); 1013 1014 extern _X_EXPORT xf86MonPtr 1015 xf86OutputGetEDID(xf86OutputPtr output, I2CBusPtr pDDCBus); 1016 1017 /** 1018 * Initialize dga for this screen 1019 */ 1020 1021 #ifdef XFreeXDGA 1022 extern _X_EXPORT Bool 1023 xf86DiDGAInit(ScreenPtr pScreen, unsigned long dga_address); 1024 1025 /* this is the real function, used only internally */ 1026 _X_INTERNAL Bool 1027 _xf86_di_dga_init_internal(ScreenPtr pScreen); 1028 1029 /** 1030 * Re-initialize dga for this screen (as when the set of modes changes) 1031 */ 1032 1033 extern _X_EXPORT Bool 1034 xf86DiDGAReInit(ScreenPtr pScreen); 1035 #endif 1036 1037 /* This is the real function, used only internally */ 1038 _X_INTERNAL Bool 1039 _xf86_di_dga_reinit_internal(ScreenPtr pScreen); 1040 1041 /* 1042 * Set the subpixel order reported for the screen using 1043 * the information from the outputs 1044 */ 1045 1046 extern _X_EXPORT void 1047 xf86CrtcSetScreenSubpixelOrder(ScreenPtr pScreen); 1048 1049 /* 1050 * Get a standard string name for a connector type 1051 */ 1052 extern _X_EXPORT const char *xf86ConnectorGetName(xf86ConnectorType connector); 1053 1054 /* 1055 * Using the desired mode information in each crtc, set 1056 * modes (used in EnterVT functions, or at server startup) 1057 */ 1058 1059 extern _X_EXPORT Bool 1060 xf86SetDesiredModes(ScrnInfoPtr pScrn); 1061 1062 /** 1063 * Initialize the CRTC-based cursor code. CRTC function vectors must 1064 * contain relevant cursor setting functions. 1065 * 1066 * Driver should call this from ScreenInit function 1067 */ 1068 extern _X_EXPORT Bool 1069 xf86_cursors_init(ScreenPtr screen, int max_width, int max_height, int flags); 1070 1071 /** 1072 * Superseded by xf86CursorResetCursor, which is getting called 1073 * automatically when necessary. 1074 */ 1075 static _X_INLINE _X_DEPRECATED void xf86_reload_cursors(ScreenPtr screen) {} 1076 1077 /** 1078 * Called from EnterVT to turn the cursors back on 1079 */ 1080 extern _X_EXPORT Bool 1081 xf86_show_cursors(ScrnInfoPtr scrn); 1082 1083 /** 1084 * Called by the driver to turn a single crtc's cursor off 1085 */ 1086 extern _X_EXPORT void 1087 xf86_crtc_hide_cursor(xf86CrtcPtr crtc); 1088 1089 /** 1090 * Called by the driver to turn a single crtc's cursor on 1091 */ 1092 extern _X_EXPORT Bool 1093 xf86_crtc_show_cursor(xf86CrtcPtr crtc); 1094 1095 /** 1096 * Called by the driver to turn cursors off 1097 */ 1098 extern _X_EXPORT void 1099 xf86_hide_cursors(ScrnInfoPtr scrn); 1100 1101 /** 1102 * Clean up CRTC-based cursor code. Driver must call this at CloseScreen time. 1103 */ 1104 extern _X_EXPORT void 1105 xf86_cursors_fini(ScreenPtr screen); 1106 1107 #ifdef XV 1108 /* 1109 * For overlay video, compute the relevant CRTC and 1110 * clip video to that. 1111 * wraps xf86XVClipVideoHelper() 1112 */ 1113 1114 extern _X_EXPORT Bool 1115 1116 xf86_crtc_clip_video_helper(ScrnInfoPtr pScrn, 1117 xf86CrtcPtr * crtc_ret, 1118 xf86CrtcPtr desired_crtc, 1119 BoxPtr dst, 1120 INT32 *xa, 1121 INT32 *xb, 1122 INT32 *ya, 1123 INT32 *yb, 1124 RegionPtr reg, INT32 width, INT32 height); 1125 #endif 1126 1127 extern _X_EXPORT xf86_crtc_notify_proc_ptr 1128 xf86_wrap_crtc_notify(ScreenPtr pScreen, xf86_crtc_notify_proc_ptr new); 1129 1130 extern _X_EXPORT void 1131 xf86_unwrap_crtc_notify(ScreenPtr pScreen, xf86_crtc_notify_proc_ptr old); 1132 1133 extern _X_EXPORT void 1134 xf86_crtc_notify(ScreenPtr pScreen); 1135 1136 /** 1137 * Gamma 1138 */ 1139 1140 extern _X_EXPORT Bool 1141 xf86_crtc_supports_gamma(ScrnInfoPtr pScrn); 1142 1143 extern _X_EXPORT void 1144 xf86ProviderSetup(ScrnInfoPtr scrn, 1145 const xf86ProviderFuncsRec * funcs, const char *name); 1146 1147 extern _X_EXPORT void 1148 xf86DetachAllCrtc(ScrnInfoPtr scrn); 1149 1150 Bool xf86OutputForceEnabled(xf86OutputPtr output); 1151 #endif /* _XF86CRTC_H_ */