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