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