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 Bool RROutputSetNonDesktop(RROutputPtr output, Bool non_desktop);
597 
598 extern _X_EXPORT CARD16
599  RRVerticalRefresh(xRRModeInfo * mode);
600 
601 #ifdef RANDR_10_INTERFACE
602 /*
603  * This is the old interface, deprecated but left
604  * around for compatibility
605  */
606 
607 /*
608  * Then, register the specific size with the screen
609  */
610 
611 extern _X_EXPORT RRScreenSizePtr
612 RRRegisterSize(ScreenPtr pScreen,
613                short width, short height, short mmWidth, short mmHeight);
614 
615 extern _X_EXPORT Bool
616  RRRegisterRate(ScreenPtr pScreen, RRScreenSizePtr pSize, int rate);
617 
618 /*
619  * Finally, set the current configuration of the screen
620  */
621 
622 extern _X_EXPORT void
623 
624 RRSetCurrentConfig(ScreenPtr pScreen,
625                    Rotation rotation, int rate, RRScreenSizePtr pSize);
626 
627 extern _X_EXPORT Rotation RRGetRotation(ScreenPtr pScreen);
628 
629 #endif
630 
631 /* rrcrtc.c */
632 
633 /*
634  * Notify the CRTC of some change; layoutChanged indicates that
635  * some position or size element changed
636  */
637 extern _X_EXPORT void
638  RRCrtcChanged(RRCrtcPtr crtc, Bool layoutChanged);
639 
640 /*
641  * Create a CRTC
642  */
643 extern _X_EXPORT RRCrtcPtr RRCrtcCreate(ScreenPtr pScreen, void *devPrivate);
644 
645 /*
646  * Set the allowed rotations on a CRTC
647  */
648 extern _X_EXPORT void
649  RRCrtcSetRotations(RRCrtcPtr crtc, Rotation rotations);
650 
651 /*
652  * Set whether transforms are allowed on a CRTC
653  */
654 extern _X_EXPORT void
655  RRCrtcSetTransformSupport(RRCrtcPtr crtc, Bool transforms);
656 
657 /*
658  * Notify the extension that the Crtc has been reconfigured,
659  * the driver calls this whenever it has updated the mode
660  */
661 extern _X_EXPORT Bool
662 
663 RRCrtcNotify(RRCrtcPtr crtc,
664              RRModePtr mode,
665              int x,
666              int y,
667              Rotation rotation,
668              RRTransformPtr transform, int numOutputs, RROutputPtr * outputs);
669 
670 extern _X_EXPORT void
671  RRDeliverCrtcEvent(ClientPtr client, WindowPtr pWin, RRCrtcPtr crtc);
672 
673 /*
674  * Request that the Crtc be reconfigured
675  */
676 extern _X_EXPORT Bool
677 
678 RRCrtcSet(RRCrtcPtr crtc,
679           RRModePtr mode,
680           int x,
681           int y, Rotation rotation, int numOutput, RROutputPtr * outputs);
682 
683 /*
684  * Request that the Crtc gamma be changed
685  */
686 
687 extern _X_EXPORT Bool
688  RRCrtcGammaSet(RRCrtcPtr crtc, CARD16 *red, CARD16 *green, CARD16 *blue);
689 
690 /*
691  * Request current gamma back from the DDX (if possible).
692  * This includes gamma size.
693  */
694 
695 extern _X_EXPORT Bool
696  RRCrtcGammaGet(RRCrtcPtr crtc);
697 
698 /*
699  * Notify the extension that the Crtc gamma has been changed
700  * The driver calls this whenever it has changed the gamma values
701  * in the RRCrtcRec
702  */
703 
704 extern _X_EXPORT Bool
705  RRCrtcGammaNotify(RRCrtcPtr crtc);
706 
707 /*
708  * Set the size of the gamma table at server startup time
709  */
710 
711 extern _X_EXPORT Bool
712  RRCrtcGammaSetSize(RRCrtcPtr crtc, int size);
713 
714 /*
715  * Return the area of the frame buffer scanned out by the crtc,
716  * taking into account the current mode and rotation
717  */
718 
719 extern _X_EXPORT void
720  RRCrtcGetScanoutSize(RRCrtcPtr crtc, int *width, int *height);
721 
722 /*
723  * Return crtc transform
724  */
725 extern _X_EXPORT RRTransformPtr RRCrtcGetTransform(RRCrtcPtr crtc);
726 
727 /*
728  * Check whether the pending and current transforms are the same
729  */
730 extern _X_EXPORT Bool
731  RRCrtcPendingTransform(RRCrtcPtr crtc);
732 
733 /*
734  * Destroy a Crtc at shutdown
735  */
736 extern _X_EXPORT void
737  RRCrtcDestroy(RRCrtcPtr crtc);
738 
739 /*
740  * Set the pending CRTC transformation
741  */
742 
743 extern _X_EXPORT int
744 
745 RRCrtcTransformSet(RRCrtcPtr crtc,
746                    PictTransformPtr transform,
747                    struct pict_f_transform *f_transform,
748                    struct pict_f_transform *f_inverse,
749                    char *filter, int filter_len, xFixed * params, int nparams);
750 
751 /*
752  * Initialize crtc type
753  */
754 extern _X_EXPORT Bool
755  RRCrtcInit(void);
756 
757 /*
758  * Initialize crtc type error value
759  */
760 extern _X_EXPORT void
761  RRCrtcInitErrorValue(void);
762 
763 /*
764  * Detach and free a scanout pixmap
765  */
766 extern _X_EXPORT void
767  RRCrtcDetachScanoutPixmap(RRCrtcPtr crtc);
768 
769 extern _X_EXPORT Bool
770  RRReplaceScanoutPixmap(DrawablePtr pDrawable, PixmapPtr pPixmap, Bool enable);
771 
772 /*
773  * Return if the screen has any scanout_pixmap's attached
774  */
775 extern _X_EXPORT Bool
776  RRHasScanoutPixmap(ScreenPtr pScreen);
777 
778 /*
779  * Crtc dispatch
780  */
781 
782 extern _X_EXPORT int
783  ProcRRGetCrtcInfo(ClientPtr client);
784 
785 extern _X_EXPORT int
786  ProcRRSetCrtcConfig(ClientPtr client);
787 
788 extern _X_EXPORT int
789  ProcRRGetCrtcGammaSize(ClientPtr client);
790 
791 extern _X_EXPORT int
792  ProcRRGetCrtcGamma(ClientPtr client);
793 
794 extern _X_EXPORT int
795  ProcRRSetCrtcGamma(ClientPtr client);
796 
797 extern _X_EXPORT int
798  ProcRRSetCrtcTransform(ClientPtr client);
799 
800 extern _X_EXPORT int
801  ProcRRGetCrtcTransform(ClientPtr client);
802 
803 int
804  ProcRRGetPanning(ClientPtr client);
805 
806 int
807  ProcRRSetPanning(ClientPtr client);
808 
809 void
810  RRConstrainCursorHarder(DeviceIntPtr, ScreenPtr, int, int *, int *);
811 
812 /* rrdispatch.c */
813 extern _X_EXPORT Bool
814  RRClientKnowsRates(ClientPtr pClient);
815 
816 /* rrlease.c */
817 void
818 RRDeliverLeaseEvent(ClientPtr client, WindowPtr window);
819 
820 extern _X_EXPORT void
821 RRLeaseTerminated(RRLeasePtr lease);
822 
823 extern _X_EXPORT void
824 RRLeaseFree(RRLeasePtr lease);
825 
826 extern _X_EXPORT Bool
827 RRCrtcIsLeased(RRCrtcPtr crtc);
828 
829 extern _X_EXPORT Bool
830 RROutputIsLeased(RROutputPtr output);
831 
832 void
833 RRTerminateLease(RRLeasePtr lease);
834 
835 Bool
836 RRLeaseInit(void);
837 
838 /* rrmode.c */
839 /*
840  * Find, and if necessary, create a mode
841  */
842 
843 extern _X_EXPORT RRModePtr RRModeGet(xRRModeInfo * modeInfo, const char *name);
844 
845 /*
846  * Destroy a mode.
847  */
848 
849 extern _X_EXPORT void
850  RRModeDestroy(RRModePtr mode);
851 
852 /*
853  * Return a list of modes that are valid for some output in pScreen
854  */
855 extern _X_EXPORT RRModePtr *RRModesForScreen(ScreenPtr pScreen, int *num_ret);
856 
857 /*
858  * Initialize mode type
859  */
860 extern _X_EXPORT Bool
861  RRModeInit(void);
862 
863 /*
864  * Initialize mode type error value
865  */
866 extern _X_EXPORT void
867  RRModeInitErrorValue(void);
868 
869 extern _X_EXPORT int
870  ProcRRCreateMode(ClientPtr client);
871 
872 extern _X_EXPORT int
873  ProcRRDestroyMode(ClientPtr client);
874 
875 extern _X_EXPORT int
876  ProcRRAddOutputMode(ClientPtr client);
877 
878 extern _X_EXPORT int
879  ProcRRDeleteOutputMode(ClientPtr client);
880 
881 /* rroutput.c */
882 
883 /*
884  * Notify the output of some change. configChanged indicates whether
885  * any external configuration (mode list, clones, connected status)
886  * has changed, or whether the change was strictly internal
887  * (which crtc is in use)
888  */
889 extern _X_EXPORT void
890  RROutputChanged(RROutputPtr output, Bool configChanged);
891 
892 /*
893  * Create an output
894  */
895 
896 extern _X_EXPORT RROutputPtr
897 RROutputCreate(ScreenPtr pScreen,
898                const char *name, int nameLength, void *devPrivate);
899 
900 /*
901  * Notify extension that output parameters have been changed
902  */
903 extern _X_EXPORT Bool
904  RROutputSetClones(RROutputPtr output, RROutputPtr * clones, int numClones);
905 
906 extern _X_EXPORT Bool
907 
908 RROutputSetModes(RROutputPtr output,
909                  RRModePtr * modes, int numModes, int numPreferred);
910 
911 extern _X_EXPORT int
912  RROutputAddUserMode(RROutputPtr output, RRModePtr mode);
913 
914 extern _X_EXPORT int
915  RROutputDeleteUserMode(RROutputPtr output, RRModePtr mode);
916 
917 extern _X_EXPORT Bool
918  RROutputSetCrtcs(RROutputPtr output, RRCrtcPtr * crtcs, int numCrtcs);
919 
920 extern _X_EXPORT Bool
921  RROutputSetConnection(RROutputPtr output, CARD8 connection);
922 
923 extern _X_EXPORT Bool
924  RROutputSetSubpixelOrder(RROutputPtr output, int subpixelOrder);
925 
926 extern _X_EXPORT Bool
927  RROutputSetPhysicalSize(RROutputPtr output, int mmWidth, int mmHeight);
928 
929 extern _X_EXPORT void
930  RRDeliverOutputEvent(ClientPtr client, WindowPtr pWin, RROutputPtr output);
931 
932 extern _X_EXPORT void
933  RROutputDestroy(RROutputPtr output);
934 
935 extern _X_EXPORT int
936  ProcRRGetOutputInfo(ClientPtr client);
937 
938 extern _X_EXPORT int
939  ProcRRSetOutputPrimary(ClientPtr client);
940 
941 extern _X_EXPORT int
942  ProcRRGetOutputPrimary(ClientPtr client);
943 
944 /*
945  * Initialize output type
946  */
947 extern _X_EXPORT Bool
948  RROutputInit(void);
949 
950 /*
951  * Initialize output type error value
952  */
953 extern _X_EXPORT void
954  RROutputInitErrorValue(void);
955 
956 /* rrpointer.c */
957 extern _X_EXPORT void
958  RRPointerMoved(ScreenPtr pScreen, int x, int y);
959 
960 extern _X_EXPORT void
961  RRPointerScreenConfigured(ScreenPtr pScreen);
962 
963 /* rrproperty.c */
964 
965 extern _X_EXPORT void
966  RRDeleteAllOutputProperties(RROutputPtr output);
967 
968 extern _X_EXPORT RRPropertyValuePtr
969 RRGetOutputProperty(RROutputPtr output, Atom property, Bool pending);
970 
971 extern _X_EXPORT RRPropertyPtr
972 RRQueryOutputProperty(RROutputPtr output, Atom property);
973 
974 extern _X_EXPORT void
975  RRDeleteOutputProperty(RROutputPtr output, Atom property);
976 
977 extern _X_EXPORT Bool
978  RRPostPendingProperties(RROutputPtr output);
979 
980 extern _X_EXPORT int
981 
982 RRChangeOutputProperty(RROutputPtr output, Atom property, Atom type,
983                        int format, int mode, unsigned long len,
984                        const void *value, Bool sendevent, Bool pending);
985 
986 extern _X_EXPORT int
987 
988 RRConfigureOutputProperty(RROutputPtr output, Atom property,
989                           Bool pending, Bool range, Bool immutable,
990                           int num_values, const INT32 *values);
991 extern _X_EXPORT int
992  ProcRRChangeOutputProperty(ClientPtr client);
993 
994 extern _X_EXPORT int
995  ProcRRGetOutputProperty(ClientPtr client);
996 
997 extern _X_EXPORT int
998  ProcRRListOutputProperties(ClientPtr client);
999 
1000 extern _X_EXPORT int
1001  ProcRRQueryOutputProperty(ClientPtr client);
1002 
1003 extern _X_EXPORT int
1004  ProcRRConfigureOutputProperty(ClientPtr client);
1005 
1006 extern _X_EXPORT int
1007  ProcRRDeleteOutputProperty(ClientPtr client);
1008 
1009 /* rrprovider.c */
1010 #define PRIME_SYNC_PROP         "PRIME Synchronization"
1011 extern _X_EXPORT void
1012 RRProviderInitErrorValue(void);
1013 
1014 extern _X_EXPORT int
1015 ProcRRGetProviders(ClientPtr client);
1016 
1017 extern _X_EXPORT int
1018 ProcRRGetProviderInfo(ClientPtr client);
1019 
1020 extern _X_EXPORT int
1021 ProcRRSetProviderOutputSource(ClientPtr client);
1022 
1023 extern _X_EXPORT int
1024 ProcRRSetProviderOffloadSink(ClientPtr client);
1025 
1026 extern _X_EXPORT Bool
1027 RRProviderInit(void);
1028 
1029 extern _X_EXPORT RRProviderPtr
1030 RRProviderCreate(ScreenPtr pScreen, const char *name,
1031                  int nameLength);
1032 
1033 extern _X_EXPORT void
1034 RRProviderDestroy (RRProviderPtr provider);
1035 
1036 extern _X_EXPORT void
1037 RRProviderSetCapabilities(RRProviderPtr provider, uint32_t capabilities);
1038 
1039 extern _X_EXPORT Bool
1040 RRProviderLookup(XID id, RRProviderPtr *provider_p);
1041 
1042 extern _X_EXPORT void
1043 RRDeliverProviderEvent(ClientPtr client, WindowPtr pWin, RRProviderPtr provider);
1044 
1045 extern _X_EXPORT void
1046 RRProviderAutoConfigGpuScreen(ScreenPtr pScreen, ScreenPtr primaryScreen);
1047 
1048 /* rrproviderproperty.c */
1049 
1050 extern _X_EXPORT void
1051  RRDeleteAllProviderProperties(RRProviderPtr provider);
1052 
1053 extern _X_EXPORT RRPropertyValuePtr
1054  RRGetProviderProperty(RRProviderPtr provider, Atom property, Bool pending);
1055 
1056 extern _X_EXPORT RRPropertyPtr
1057  RRQueryProviderProperty(RRProviderPtr provider, Atom property);
1058 
1059 extern _X_EXPORT void
1060  RRDeleteProviderProperty(RRProviderPtr provider, Atom property);
1061 
1062 extern _X_EXPORT int
1063 RRChangeProviderProperty(RRProviderPtr provider, Atom property, Atom type,
1064                        int format, int mode, unsigned long len,
1065                        void *value, Bool sendevent, Bool pending);
1066 
1067 extern _X_EXPORT int
1068  RRConfigureProviderProperty(RRProviderPtr provider, Atom property,
1069                              Bool pending, Bool range, Bool immutable,
1070                              int num_values, INT32 *values);
1071 
1072 extern _X_EXPORT Bool
1073  RRPostProviderPendingProperties(RRProviderPtr provider);
1074 
1075 extern _X_EXPORT int
1076  ProcRRGetProviderProperty(ClientPtr client);
1077 
1078 extern _X_EXPORT int
1079  ProcRRListProviderProperties(ClientPtr client);
1080 
1081 extern _X_EXPORT int
1082  ProcRRQueryProviderProperty(ClientPtr client);
1083 
1084 extern _X_EXPORT int
1085 ProcRRConfigureProviderProperty(ClientPtr client);
1086 
1087 extern _X_EXPORT int
1088 ProcRRChangeProviderProperty(ClientPtr client);
1089 
1090 extern _X_EXPORT int
1091  ProcRRDeleteProviderProperty(ClientPtr client);
1092 /* rrxinerama.c */
1093 #ifdef XINERAMA
1094 extern _X_EXPORT void
1095  RRXineramaExtensionInit(void);
1096 #endif
1097 
1098 void
1099 RRMonitorInit(ScreenPtr screen);
1100 
1101 Bool
1102 RRMonitorMakeList(ScreenPtr screen, Bool get_active, RRMonitorPtr *monitors_ret, int *nmon_ret);
1103 
1104 int
1105 RRMonitorCountList(ScreenPtr screen);
1106 
1107 void
1108 RRMonitorFreeList(RRMonitorPtr monitors, int nmon);
1109 
1110 void
1111 RRMonitorClose(ScreenPtr screen);
1112 
1113 RRMonitorPtr
1114 RRMonitorAlloc(int noutput);
1115 
1116 int
1117 RRMonitorAdd(ClientPtr client, ScreenPtr screen, RRMonitorPtr monitor);
1118 
1119 void
1120 RRMonitorFree(RRMonitorPtr monitor);
1121 
1122 int
1123 ProcRRGetMonitors(ClientPtr client);
1124 
1125 int
1126 ProcRRSetMonitor(ClientPtr client);
1127 
1128 int
1129 ProcRRDeleteMonitor(ClientPtr client);
1130 
1131 int
1132 ProcRRCreateLease(ClientPtr client);
1133 
1134 int
1135 ProcRRFreeLease(ClientPtr client);
1136 
1137 #endif                          /* _RANDRSTR_H_ */
1138 
1139 /*
1140 
1141 randr extension implementation structure
1142 
1143 Query state:
1144     ProcRRGetScreenInfo/ProcRRGetScreenResources
1145 	RRGetInfo
1146 
1147 	    • Request configuration from driver, either 1.0 or 1.2 style
1148 	    • These functions only record state changes, all
1149 	      other actions are pended until RRTellChanged is called
1150 
1151 	    ->rrGetInfo
1152 	    1.0:
1153 		RRRegisterSize
1154 		RRRegisterRate
1155 		RRSetCurrentConfig
1156 	    1.2:
1157 		RRScreenSetSizeRange
1158 		RROutputSetCrtcs
1159 		RRModeGet
1160 		RROutputSetModes
1161 		RROutputSetConnection
1162 		RROutputSetSubpixelOrder
1163 		RROutputSetClones
1164 		RRCrtcNotify
1165 
1166 	• Must delay scanning configuration until after ->rrGetInfo returns
1167 	  because some drivers will call SetCurrentConfig in the middle
1168 	  of the ->rrGetInfo operation.
1169 
1170 	1.0:
1171 
1172 	    • Scan old configuration, mirror to new structures
1173 
1174 	    RRScanOldConfig
1175 		RRCrtcCreate
1176 		RROutputCreate
1177 		RROutputSetCrtcs
1178 		RROutputSetConnection
1179 		RROutputSetSubpixelOrder
1180 		RROldModeAdd	• This adds modes one-at-a-time
1181 		    RRModeGet
1182 		RRCrtcNotify
1183 
1184 	• send events, reset pointer if necessary
1185 
1186 	RRTellChanged
1187 	    WalkTree (sending events)
1188 
1189 	    • when layout has changed:
1190 		RRPointerScreenConfigured
1191 		RRSendConfigNotify
1192 
1193 Asynchronous state setting (1.2 only)
1194     When setting state asynchronously, the driver invokes the
1195     ->rrGetInfo function and then calls RRTellChanged to flush
1196     the changes to the clients and reset pointer if necessary
1197 
1198 Set state
1199 
1200     ProcRRSetScreenConfig
1201 	RRCrtcSet
1202 	    1.2:
1203 		->rrCrtcSet
1204 		    RRCrtcNotify
1205 	    1.0:
1206 		->rrSetConfig
1207 		RRCrtcNotify
1208 	    RRTellChanged
1209  */
1210