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