xserver

xserver with xephyr scale patch
git clone https://git.neptards.moe/u3shit/xserver.git
Log | Files | Refs | README | LICENSE

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_ */