randrstr.h revision 7e31ba66
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
62typedef XID RRMode;
63typedef XID RROutput;
64typedef XID RRCrtc;
65typedef XID RRProvider;
66typedef XID RRLease;
67
68extern int RREventBase, RRErrorBase;
69
70extern int (*ProcRandrVector[RRNumberRequests]) (ClientPtr);
71extern 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))
78typedef struct _rrMode RRModeRec, *RRModePtr;
79typedef struct _rrPropertyValue RRPropertyValueRec, *RRPropertyValuePtr;
80typedef struct _rrProperty RRPropertyRec, *RRPropertyPtr;
81typedef struct _rrCrtc RRCrtcRec, *RRCrtcPtr;
82typedef struct _rrOutput RROutputRec, *RROutputPtr;
83typedef struct _rrProvider RRProviderRec, *RRProviderPtr;
84typedef struct _rrMonitor RRMonitorRec, *RRMonitorPtr;
85typedef struct _rrLease RRLeaseRec, *RRLeasePtr;
86
87struct _rrMode {
88    int refcnt;
89    xRRModeInfo mode;
90    char *name;
91    ScreenPtr userScreen;
92};
93
94struct _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
101struct _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
112struct _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
138struct _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
164struct _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
177typedef struct _rrMonitorGeometry {
178    BoxRec box;
179    CARD32 mmWidth;
180    CARD32 mmHeight;
181} RRMonitorGeometryRec, *RRMonitorGeometryPtr;
182
183struct _rrMonitor {
184    Atom name;
185    ScreenPtr pScreen;
186    int numOutputs;
187    RROutput *outputs;
188    Bool primary;
189    Bool automatic;
190    RRMonitorGeometryRec geometry;
191};
192
193typedef enum _rrLeaseState { RRLeaseCreating, RRLeaseRunning, RRLeaseTerminating } RRLeaseState;
194
195struct _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
208typedef Bool (*RRScreenSetSizeProcPtr) (ScreenPtr pScreen,
209                                        CARD16 width,
210                                        CARD16 height,
211                                        CARD32 mmWidth, CARD32 mmHeight);
212
213typedef 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
221typedef Bool (*RRCrtcSetGammaProcPtr) (ScreenPtr pScreen, RRCrtcPtr crtc);
222
223typedef Bool (*RRCrtcGetGammaProcPtr) (ScreenPtr pScreen, RRCrtcPtr crtc);
224
225typedef Bool (*RROutputSetPropertyProcPtr) (ScreenPtr pScreen,
226                                            RROutputPtr output,
227                                            Atom property,
228                                            RRPropertyValuePtr value);
229
230typedef Bool (*RROutputValidateModeProcPtr) (ScreenPtr pScreen,
231                                             RROutputPtr output,
232                                             RRModePtr mode);
233
234typedef void (*RRModeDestroyProcPtr) (ScreenPtr pScreen, RRModePtr mode);
235
236#endif
237
238#if RANDR_13_INTERFACE
239typedef Bool (*RROutputGetPropertyProcPtr) (ScreenPtr pScreen,
240                                            RROutputPtr output, Atom property);
241typedef Bool (*RRGetPanningProcPtr) (ScreenPtr pScrn,
242                                     RRCrtcPtr crtc,
243                                     BoxPtr totalArea,
244                                     BoxPtr trackingArea, INT16 *border);
245typedef Bool (*RRSetPanningProcPtr) (ScreenPtr pScrn,
246                                     RRCrtcPtr crtc,
247                                     BoxPtr totalArea,
248                                     BoxPtr trackingArea, INT16 *border);
249
250#endif                          /* RANDR_13_INTERFACE */
251
252typedef Bool (*RRProviderGetPropertyProcPtr) (ScreenPtr pScreen,
253                                            RRProviderPtr provider, Atom property);
254typedef Bool (*RRProviderSetPropertyProcPtr) (ScreenPtr pScreen,
255                                              RRProviderPtr provider,
256                                              Atom property,
257                                              RRPropertyValuePtr value);
258
259typedef Bool (*RRGetInfoProcPtr) (ScreenPtr pScreen, Rotation * rotations);
260typedef Bool (*RRCloseScreenProcPtr) (ScreenPtr pscreen);
261
262typedef Bool (*RRProviderSetOutputSourceProcPtr)(ScreenPtr pScreen,
263                                          RRProviderPtr provider,
264                                          RRProviderPtr output_source);
265
266typedef Bool (*RRProviderSetOffloadSinkProcPtr)(ScreenPtr pScreen,
267                                         RRProviderPtr provider,
268                                         RRProviderPtr offload_sink);
269
270
271typedef void (*RRProviderDestroyProcPtr)(ScreenPtr pScreen,
272                                         RRProviderPtr provider);
273
274/* Additions for 1.6 */
275
276typedef int (*RRCreateLeaseProcPtr)(ScreenPtr screen,
277                                    RRLeasePtr lease,
278                                    int *fd);
279
280typedef void (*RRTerminateLeaseProcPtr)(ScreenPtr screen,
281                                        RRLeasePtr lease);
282
283/* These are for 1.0 compatibility */
284
285typedef struct _rrRefresh {
286    CARD16 rate;
287    RRModePtr mode;
288} RRScreenRate, *RRScreenRatePtr;
289
290typedef 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
300typedef Bool (*RRSetConfigProcPtr) (ScreenPtr pScreen,
301                                    Rotation rotation,
302                                    int rate, RRScreenSizePtr pSize);
303
304#endif
305
306typedef Bool (*RRCrtcSetScanoutPixmapProcPtr)(RRCrtcPtr crtc, PixmapPtr pixmap);
307
308typedef Bool (*RRStartFlippingPixmapTrackingProcPtr)(RRCrtcPtr, DrawablePtr,
309                                                     PixmapPtr, PixmapPtr,
310                                                     int x, int y,
311                                                     int dst_x, int dst_y,
312                                                     Rotation rotation);
313
314typedef Bool (*RREnableSharedPixmapFlippingProcPtr)(RRCrtcPtr,
315                                                    PixmapPtr front,
316                                                    PixmapPtr back);
317
318typedef void (*RRDisableSharedPixmapFlippingProcPtr)(RRCrtcPtr);
319
320
321typedef 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
413extern _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
429typedef struct _RREvent *RREventPtr;
430
431typedef struct _RREvent {
432    RREventPtr next;
433    ClientPtr client;
434    WindowPtr window;
435    XID clientResource;
436    int mask;
437} RREventRec;
438
439typedef struct _RRTimes {
440    TimeStamp setTime;
441    TimeStamp configTime;
442} RRTimesRec, *RRTimesPtr;
443
444typedef struct _RRClient {
445    int major_version;
446    int minor_version;
447/*  RRTimesRec	times[0]; */
448} RRClientRec, *RRClientPtr;
449
450extern RESTYPE RRClientType, RREventType;     /* resource types for event masks */
451extern DevPrivateKeyRec RRClientPrivateKeyRec;
452
453#define RRClientPrivateKey (&RRClientPrivateKeyRec)
454extern _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 */
513extern _X_EXPORT void
514
515RRScreenSetSizeRange(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 */
526extern _X_EXPORT void
527 RRScreenSizeNotify(ScreenPtr pScreen);
528
529/*
530 * Request that the screen be resized
531 */
532extern _X_EXPORT Bool
533
534RRScreenSizeSet(ScreenPtr pScreen,
535                CARD16 width, CARD16 height, CARD32 mmWidth, CARD32 mmHeight);
536
537/*
538 * Send ConfigureNotify event to root window when 'something' happens
539 */
540extern _X_EXPORT void
541 RRSendConfigNotify(ScreenPtr pScreen);
542
543/*
544 * screen dispatch
545 */
546extern _X_EXPORT int
547 ProcRRGetScreenSizeRange(ClientPtr client);
548
549extern _X_EXPORT int
550 ProcRRSetScreenSize(ClientPtr client);
551
552extern _X_EXPORT int
553 ProcRRGetScreenResources(ClientPtr client);
554
555extern _X_EXPORT int
556 ProcRRGetScreenResourcesCurrent(ClientPtr client);
557
558extern _X_EXPORT int
559 ProcRRSetScreenConfig(ClientPtr client);
560
561extern _X_EXPORT int
562 ProcRRGetScreenInfo(ClientPtr client);
563
564/*
565 * Deliver a ScreenNotify event
566 */
567extern _X_EXPORT void
568 RRDeliverScreenEvent(ClientPtr client, WindowPtr pWin, ScreenPtr pScreen);
569
570extern _X_EXPORT void
571 RRResourcesChanged(ScreenPtr pScreen);
572
573/* randr.c */
574/* set a screen change on the primary screen */
575extern _X_EXPORT void
576RRSetChanged(ScreenPtr pScreen);
577
578/*
579 * Send all pending events
580 */
581extern _X_EXPORT void
582 RRTellChanged(ScreenPtr pScreen);
583
584extern _X_EXPORT void
585RRSetChanged (ScreenPtr pScreen);
586
587/*
588 * Poll the driver for changed information
589 */
590extern _X_EXPORT Bool
591 RRGetInfo(ScreenPtr pScreen, Bool force_query);
592
593extern _X_EXPORT Bool RRInit(void);
594
595extern _X_EXPORT Bool RRScreenInit(ScreenPtr pScreen);
596
597extern _X_EXPORT RROutputPtr RRFirstOutput(ScreenPtr pScreen);
598
599extern _X_EXPORT Bool RROutputSetNonDesktop(RROutputPtr output, Bool non_desktop);
600
601extern _X_EXPORT CARD16
602 RRVerticalRefresh(xRRModeInfo * mode);
603
604#ifdef RANDR_10_INTERFACE
605/*
606 * This is the old interface, deprecated but left
607 * around for compatibility
608 */
609
610/*
611 * Then, register the specific size with the screen
612 */
613
614extern _X_EXPORT RRScreenSizePtr
615RRRegisterSize(ScreenPtr pScreen,
616               short width, short height, short mmWidth, short mmHeight);
617
618extern _X_EXPORT Bool
619 RRRegisterRate(ScreenPtr pScreen, RRScreenSizePtr pSize, int rate);
620
621/*
622 * Finally, set the current configuration of the screen
623 */
624
625extern _X_EXPORT void
626
627RRSetCurrentConfig(ScreenPtr pScreen,
628                   Rotation rotation, int rate, RRScreenSizePtr pSize);
629
630extern _X_EXPORT Rotation RRGetRotation(ScreenPtr pScreen);
631
632#endif
633
634/* rrcrtc.c */
635
636/*
637 * Notify the CRTC of some change; layoutChanged indicates that
638 * some position or size element changed
639 */
640extern _X_EXPORT void
641 RRCrtcChanged(RRCrtcPtr crtc, Bool layoutChanged);
642
643/*
644 * Create a CRTC
645 */
646extern _X_EXPORT RRCrtcPtr RRCrtcCreate(ScreenPtr pScreen, void *devPrivate);
647
648/*
649 * Set the allowed rotations on a CRTC
650 */
651extern _X_EXPORT void
652 RRCrtcSetRotations(RRCrtcPtr crtc, Rotation rotations);
653
654/*
655 * Set whether transforms are allowed on a CRTC
656 */
657extern _X_EXPORT void
658 RRCrtcSetTransformSupport(RRCrtcPtr crtc, Bool transforms);
659
660/*
661 * Notify the extension that the Crtc has been reconfigured,
662 * the driver calls this whenever it has updated the mode
663 */
664extern _X_EXPORT Bool
665
666RRCrtcNotify(RRCrtcPtr crtc,
667             RRModePtr mode,
668             int x,
669             int y,
670             Rotation rotation,
671             RRTransformPtr transform, int numOutputs, RROutputPtr * outputs);
672
673extern _X_EXPORT void
674 RRDeliverCrtcEvent(ClientPtr client, WindowPtr pWin, RRCrtcPtr crtc);
675
676/*
677 * Request that the Crtc be reconfigured
678 */
679extern _X_EXPORT Bool
680
681RRCrtcSet(RRCrtcPtr crtc,
682          RRModePtr mode,
683          int x,
684          int y, Rotation rotation, int numOutput, RROutputPtr * outputs);
685
686/*
687 * Request that the Crtc gamma be changed
688 */
689
690extern _X_EXPORT Bool
691 RRCrtcGammaSet(RRCrtcPtr crtc, CARD16 *red, CARD16 *green, CARD16 *blue);
692
693/*
694 * Request current gamma back from the DDX (if possible).
695 * This includes gamma size.
696 */
697
698extern _X_EXPORT Bool
699 RRCrtcGammaGet(RRCrtcPtr crtc);
700
701/*
702 * Notify the extension that the Crtc gamma has been changed
703 * The driver calls this whenever it has changed the gamma values
704 * in the RRCrtcRec
705 */
706
707extern _X_EXPORT Bool
708 RRCrtcGammaNotify(RRCrtcPtr crtc);
709
710/*
711 * Set the size of the gamma table at server startup time
712 */
713
714extern _X_EXPORT Bool
715 RRCrtcGammaSetSize(RRCrtcPtr crtc, int size);
716
717/*
718 * Return the area of the frame buffer scanned out by the crtc,
719 * taking into account the current mode and rotation
720 */
721
722extern _X_EXPORT void
723 RRCrtcGetScanoutSize(RRCrtcPtr crtc, int *width, int *height);
724
725/*
726 * Return crtc transform
727 */
728extern _X_EXPORT RRTransformPtr RRCrtcGetTransform(RRCrtcPtr crtc);
729
730/*
731 * Check whether the pending and current transforms are the same
732 */
733extern _X_EXPORT Bool
734 RRCrtcPendingTransform(RRCrtcPtr crtc);
735
736/*
737 * Destroy a Crtc at shutdown
738 */
739extern _X_EXPORT void
740 RRCrtcDestroy(RRCrtcPtr crtc);
741
742/*
743 * Set the pending CRTC transformation
744 */
745
746extern _X_EXPORT int
747
748RRCrtcTransformSet(RRCrtcPtr crtc,
749                   PictTransformPtr transform,
750                   struct pict_f_transform *f_transform,
751                   struct pict_f_transform *f_inverse,
752                   char *filter, int filter_len, xFixed * params, int nparams);
753
754/*
755 * Initialize crtc type
756 */
757extern _X_EXPORT Bool
758 RRCrtcInit(void);
759
760/*
761 * Initialize crtc type error value
762 */
763extern _X_EXPORT void
764 RRCrtcInitErrorValue(void);
765
766/*
767 * Detach and free a scanout pixmap
768 */
769extern _X_EXPORT void
770 RRCrtcDetachScanoutPixmap(RRCrtcPtr crtc);
771
772extern _X_EXPORT Bool
773 RRReplaceScanoutPixmap(DrawablePtr pDrawable, PixmapPtr pPixmap, Bool enable);
774
775/*
776 * Return if the screen has any scanout_pixmap's attached
777 */
778extern _X_EXPORT Bool
779 RRHasScanoutPixmap(ScreenPtr pScreen);
780
781/*
782 * Crtc dispatch
783 */
784
785extern _X_EXPORT int
786 ProcRRGetCrtcInfo(ClientPtr client);
787
788extern _X_EXPORT int
789 ProcRRSetCrtcConfig(ClientPtr client);
790
791extern _X_EXPORT int
792 ProcRRGetCrtcGammaSize(ClientPtr client);
793
794extern _X_EXPORT int
795 ProcRRGetCrtcGamma(ClientPtr client);
796
797extern _X_EXPORT int
798 ProcRRSetCrtcGamma(ClientPtr client);
799
800extern _X_EXPORT int
801 ProcRRSetCrtcTransform(ClientPtr client);
802
803extern _X_EXPORT int
804 ProcRRGetCrtcTransform(ClientPtr client);
805
806int
807 ProcRRGetPanning(ClientPtr client);
808
809int
810 ProcRRSetPanning(ClientPtr client);
811
812void
813 RRConstrainCursorHarder(DeviceIntPtr, ScreenPtr, int, int *, int *);
814
815/* rrdispatch.c */
816extern _X_EXPORT Bool
817 RRClientKnowsRates(ClientPtr pClient);
818
819/* rrlease.c */
820void
821RRDeliverLeaseEvent(ClientPtr client, WindowPtr window);
822
823extern _X_EXPORT void
824RRLeaseTerminated(RRLeasePtr lease);
825
826extern _X_EXPORT void
827RRLeaseFree(RRLeasePtr lease);
828
829extern _X_EXPORT Bool
830RRCrtcIsLeased(RRCrtcPtr crtc);
831
832extern _X_EXPORT Bool
833RROutputIsLeased(RROutputPtr output);
834
835void
836RRTerminateLease(RRLeasePtr lease);
837
838Bool
839RRLeaseInit(void);
840
841/* rrmode.c */
842/*
843 * Find, and if necessary, create a mode
844 */
845
846extern _X_EXPORT RRModePtr RRModeGet(xRRModeInfo * modeInfo, const char *name);
847
848/*
849 * Destroy a mode.
850 */
851
852extern _X_EXPORT void
853 RRModeDestroy(RRModePtr mode);
854
855/*
856 * Return a list of modes that are valid for some output in pScreen
857 */
858extern _X_EXPORT RRModePtr *RRModesForScreen(ScreenPtr pScreen, int *num_ret);
859
860/*
861 * Initialize mode type
862 */
863extern _X_EXPORT Bool
864 RRModeInit(void);
865
866/*
867 * Initialize mode type error value
868 */
869extern _X_EXPORT void
870 RRModeInitErrorValue(void);
871
872extern _X_EXPORT int
873 ProcRRCreateMode(ClientPtr client);
874
875extern _X_EXPORT int
876 ProcRRDestroyMode(ClientPtr client);
877
878extern _X_EXPORT int
879 ProcRRAddOutputMode(ClientPtr client);
880
881extern _X_EXPORT int
882 ProcRRDeleteOutputMode(ClientPtr client);
883
884/* rroutput.c */
885
886/*
887 * Notify the output of some change. configChanged indicates whether
888 * any external configuration (mode list, clones, connected status)
889 * has changed, or whether the change was strictly internal
890 * (which crtc is in use)
891 */
892extern _X_EXPORT void
893 RROutputChanged(RROutputPtr output, Bool configChanged);
894
895/*
896 * Create an output
897 */
898
899extern _X_EXPORT RROutputPtr
900RROutputCreate(ScreenPtr pScreen,
901               const char *name, int nameLength, void *devPrivate);
902
903/*
904 * Notify extension that output parameters have been changed
905 */
906extern _X_EXPORT Bool
907 RROutputSetClones(RROutputPtr output, RROutputPtr * clones, int numClones);
908
909extern _X_EXPORT Bool
910
911RROutputSetModes(RROutputPtr output,
912                 RRModePtr * modes, int numModes, int numPreferred);
913
914extern _X_EXPORT int
915 RROutputAddUserMode(RROutputPtr output, RRModePtr mode);
916
917extern _X_EXPORT int
918 RROutputDeleteUserMode(RROutputPtr output, RRModePtr mode);
919
920extern _X_EXPORT Bool
921 RROutputSetCrtcs(RROutputPtr output, RRCrtcPtr * crtcs, int numCrtcs);
922
923extern _X_EXPORT Bool
924 RROutputSetConnection(RROutputPtr output, CARD8 connection);
925
926extern _X_EXPORT Bool
927 RROutputSetSubpixelOrder(RROutputPtr output, int subpixelOrder);
928
929extern _X_EXPORT Bool
930 RROutputSetPhysicalSize(RROutputPtr output, int mmWidth, int mmHeight);
931
932extern _X_EXPORT void
933 RRDeliverOutputEvent(ClientPtr client, WindowPtr pWin, RROutputPtr output);
934
935extern _X_EXPORT void
936 RROutputDestroy(RROutputPtr output);
937
938extern _X_EXPORT int
939 ProcRRGetOutputInfo(ClientPtr client);
940
941extern _X_EXPORT int
942 ProcRRSetOutputPrimary(ClientPtr client);
943
944extern _X_EXPORT int
945 ProcRRGetOutputPrimary(ClientPtr client);
946
947/*
948 * Initialize output type
949 */
950extern _X_EXPORT Bool
951 RROutputInit(void);
952
953/*
954 * Initialize output type error value
955 */
956extern _X_EXPORT void
957 RROutputInitErrorValue(void);
958
959/* rrpointer.c */
960extern _X_EXPORT void
961 RRPointerMoved(ScreenPtr pScreen, int x, int y);
962
963extern _X_EXPORT void
964 RRPointerScreenConfigured(ScreenPtr pScreen);
965
966/* rrproperty.c */
967
968extern _X_EXPORT void
969 RRDeleteAllOutputProperties(RROutputPtr output);
970
971extern _X_EXPORT RRPropertyValuePtr
972RRGetOutputProperty(RROutputPtr output, Atom property, Bool pending);
973
974extern _X_EXPORT RRPropertyPtr
975RRQueryOutputProperty(RROutputPtr output, Atom property);
976
977extern _X_EXPORT void
978 RRDeleteOutputProperty(RROutputPtr output, Atom property);
979
980extern _X_EXPORT Bool
981 RRPostPendingProperties(RROutputPtr output);
982
983extern _X_EXPORT int
984
985RRChangeOutputProperty(RROutputPtr output, Atom property, Atom type,
986                       int format, int mode, unsigned long len,
987                       const void *value, Bool sendevent, Bool pending);
988
989extern _X_EXPORT int
990
991RRConfigureOutputProperty(RROutputPtr output, Atom property,
992                          Bool pending, Bool range, Bool immutable,
993                          int num_values, const INT32 *values);
994extern _X_EXPORT int
995 ProcRRChangeOutputProperty(ClientPtr client);
996
997extern _X_EXPORT int
998 ProcRRGetOutputProperty(ClientPtr client);
999
1000extern _X_EXPORT int
1001 ProcRRListOutputProperties(ClientPtr client);
1002
1003extern _X_EXPORT int
1004 ProcRRQueryOutputProperty(ClientPtr client);
1005
1006extern _X_EXPORT int
1007 ProcRRConfigureOutputProperty(ClientPtr client);
1008
1009extern _X_EXPORT int
1010 ProcRRDeleteOutputProperty(ClientPtr client);
1011
1012/* rrprovider.c */
1013#define PRIME_SYNC_PROP         "PRIME Synchronization"
1014extern _X_EXPORT void
1015RRProviderInitErrorValue(void);
1016
1017extern _X_EXPORT int
1018ProcRRGetProviders(ClientPtr client);
1019
1020extern _X_EXPORT int
1021ProcRRGetProviderInfo(ClientPtr client);
1022
1023extern _X_EXPORT int
1024ProcRRSetProviderOutputSource(ClientPtr client);
1025
1026extern _X_EXPORT int
1027ProcRRSetProviderOffloadSink(ClientPtr client);
1028
1029extern _X_EXPORT Bool
1030RRProviderInit(void);
1031
1032extern _X_EXPORT RRProviderPtr
1033RRProviderCreate(ScreenPtr pScreen, const char *name,
1034                 int nameLength);
1035
1036extern _X_EXPORT void
1037RRProviderDestroy (RRProviderPtr provider);
1038
1039extern _X_EXPORT void
1040RRProviderSetCapabilities(RRProviderPtr provider, uint32_t capabilities);
1041
1042extern _X_EXPORT Bool
1043RRProviderLookup(XID id, RRProviderPtr *provider_p);
1044
1045extern _X_EXPORT void
1046RRDeliverProviderEvent(ClientPtr client, WindowPtr pWin, RRProviderPtr provider);
1047
1048/* rrproviderproperty.c */
1049
1050extern _X_EXPORT void
1051 RRDeleteAllProviderProperties(RRProviderPtr provider);
1052
1053extern _X_EXPORT RRPropertyValuePtr
1054 RRGetProviderProperty(RRProviderPtr provider, Atom property, Bool pending);
1055
1056extern _X_EXPORT RRPropertyPtr
1057 RRQueryProviderProperty(RRProviderPtr provider, Atom property);
1058
1059extern _X_EXPORT void
1060 RRDeleteProviderProperty(RRProviderPtr provider, Atom property);
1061
1062extern _X_EXPORT int
1063RRChangeProviderProperty(RRProviderPtr provider, Atom property, Atom type,
1064                       int format, int mode, unsigned long len,
1065                       void *value, Bool sendevent, Bool pending);
1066
1067extern _X_EXPORT int
1068 RRConfigureProviderProperty(RRProviderPtr provider, Atom property,
1069                             Bool pending, Bool range, Bool immutable,
1070                             int num_values, INT32 *values);
1071
1072extern _X_EXPORT Bool
1073 RRPostProviderPendingProperties(RRProviderPtr provider);
1074
1075extern _X_EXPORT int
1076 ProcRRGetProviderProperty(ClientPtr client);
1077
1078extern _X_EXPORT int
1079 ProcRRListProviderProperties(ClientPtr client);
1080
1081extern _X_EXPORT int
1082 ProcRRQueryProviderProperty(ClientPtr client);
1083
1084extern _X_EXPORT int
1085ProcRRConfigureProviderProperty(ClientPtr client);
1086
1087extern _X_EXPORT int
1088ProcRRChangeProviderProperty(ClientPtr client);
1089
1090extern _X_EXPORT int
1091 ProcRRDeleteProviderProperty(ClientPtr client);
1092/* rrxinerama.c */
1093#ifdef XINERAMA
1094extern _X_EXPORT void
1095 RRXineramaExtensionInit(void);
1096#endif
1097
1098void
1099RRMonitorInit(ScreenPtr screen);
1100
1101Bool
1102RRMonitorMakeList(ScreenPtr screen, Bool get_active, RRMonitorPtr *monitors_ret, int *nmon_ret);
1103
1104int
1105RRMonitorCountList(ScreenPtr screen);
1106
1107void
1108RRMonitorFreeList(RRMonitorPtr monitors, int nmon);
1109
1110void
1111RRMonitorClose(ScreenPtr screen);
1112
1113RRMonitorPtr
1114RRMonitorAlloc(int noutput);
1115
1116int
1117RRMonitorAdd(ClientPtr client, ScreenPtr screen, RRMonitorPtr monitor);
1118
1119void
1120RRMonitorFree(RRMonitorPtr monitor);
1121
1122int
1123ProcRRGetMonitors(ClientPtr client);
1124
1125int
1126ProcRRSetMonitor(ClientPtr client);
1127
1128int
1129ProcRRDeleteMonitor(ClientPtr client);
1130
1131int
1132ProcRRCreateLease(ClientPtr client);
1133
1134int
1135ProcRRFreeLease(ClientPtr client);
1136
1137#endif                          /* _RANDRSTR_H_ */
1138
1139/*
1140
1141randr extension implementation structure
1142
1143Query 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
1193Asynchronous 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
1198Set state
1199
1200    ProcRRSetScreenConfig
1201	RRCrtcSet
1202	    1.2:
1203		->rrCrtcSet
1204		    RRCrtcNotify
1205	    1.0:
1206		->rrSetConfig
1207		RRCrtcNotify
1208	    RRTellChanged
1209 */
1210