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