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