xref: /OK3568_Linux_fs/external/xserver/hw/xwayland/xwayland-vidmode.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Copyright (c) 1999-2003 by The XFree86 Project, Inc.
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * Permission is hereby granted, free of charge, to any person obtaining a
5*4882a593Smuzhiyun  * copy of this software and associated documentation files (the "Software"),
6*4882a593Smuzhiyun  * to deal in the Software without restriction, including without limitation
7*4882a593Smuzhiyun  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*4882a593Smuzhiyun  * and/or sell copies of the Software, and to permit persons to whom the
9*4882a593Smuzhiyun  * Software is furnished to do so, subject to the following conditions:
10*4882a593Smuzhiyun  *
11*4882a593Smuzhiyun  * The above copyright notice and this permission notice shall be included in
12*4882a593Smuzhiyun  * all copies or substantial portions of the Software.
13*4882a593Smuzhiyun  *
14*4882a593Smuzhiyun  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15*4882a593Smuzhiyun  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16*4882a593Smuzhiyun  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17*4882a593Smuzhiyun  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18*4882a593Smuzhiyun  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19*4882a593Smuzhiyun  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20*4882a593Smuzhiyun  * OTHER DEALINGS IN THE SOFTWARE.
21*4882a593Smuzhiyun  *
22*4882a593Smuzhiyun  * Except as contained in this notice, the name of the copyright holder(s)
23*4882a593Smuzhiyun  * and author(s) shall not be used in advertising or otherwise to promote
24*4882a593Smuzhiyun  * the sale, use or other dealings in this Software without prior written
25*4882a593Smuzhiyun  * authorization from the copyright holder(s) and author(s).
26*4882a593Smuzhiyun  */
27*4882a593Smuzhiyun 
28*4882a593Smuzhiyun #ifdef HAVE_DIX_CONFIG_H
29*4882a593Smuzhiyun #include <dix-config.h>
30*4882a593Smuzhiyun #endif
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun #include <X11/X.h>
33*4882a593Smuzhiyun #include "misc.h"
34*4882a593Smuzhiyun #include "os.h"
35*4882a593Smuzhiyun #include "extinit.h"
36*4882a593Smuzhiyun 
37*4882a593Smuzhiyun #ifdef XF86VIDMODE
38*4882a593Smuzhiyun #include "xwayland.h"
39*4882a593Smuzhiyun #include "randrstr.h"
40*4882a593Smuzhiyun #include "vidmodestr.h"
41*4882a593Smuzhiyun 
42*4882a593Smuzhiyun static DevPrivateKeyRec xwlVidModePrivateKeyRec;
43*4882a593Smuzhiyun #define xwlVidModePrivateKey (&xwlVidModePrivateKeyRec)
44*4882a593Smuzhiyun 
45*4882a593Smuzhiyun /* Taken from xrandr, h sync frequency in KHz */
46*4882a593Smuzhiyun static double
mode_hsync(const xRRModeInfo * mode_info)47*4882a593Smuzhiyun mode_hsync(const xRRModeInfo *mode_info)
48*4882a593Smuzhiyun {
49*4882a593Smuzhiyun     double rate;
50*4882a593Smuzhiyun 
51*4882a593Smuzhiyun     if (mode_info->hTotal)
52*4882a593Smuzhiyun         rate = (double) mode_info->dotClock / (double) mode_info->hTotal;
53*4882a593Smuzhiyun     else
54*4882a593Smuzhiyun         rate = 0.0;
55*4882a593Smuzhiyun 
56*4882a593Smuzhiyun     return rate / 1000.0;
57*4882a593Smuzhiyun }
58*4882a593Smuzhiyun 
59*4882a593Smuzhiyun /* Taken from xrandr, v refresh frequency in Hz */
60*4882a593Smuzhiyun static double
mode_refresh(const xRRModeInfo * mode_info)61*4882a593Smuzhiyun mode_refresh(const xRRModeInfo *mode_info)
62*4882a593Smuzhiyun {
63*4882a593Smuzhiyun     double rate;
64*4882a593Smuzhiyun     double vTotal = mode_info->vTotal;
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun     if (mode_info->modeFlags & RR_DoubleScan)
67*4882a593Smuzhiyun 	vTotal *= 2.0;
68*4882a593Smuzhiyun 
69*4882a593Smuzhiyun     if (mode_info->modeFlags & RR_Interlace)
70*4882a593Smuzhiyun 	vTotal /= 2.0;
71*4882a593Smuzhiyun 
72*4882a593Smuzhiyun     if (mode_info->hTotal > 0.0 && vTotal > 0.0)
73*4882a593Smuzhiyun 	rate = ((double) mode_info->dotClock /
74*4882a593Smuzhiyun 		((double) mode_info->hTotal * (double) vTotal));
75*4882a593Smuzhiyun     else
76*4882a593Smuzhiyun         rate = 0.0;
77*4882a593Smuzhiyun 
78*4882a593Smuzhiyun     return rate;
79*4882a593Smuzhiyun }
80*4882a593Smuzhiyun 
81*4882a593Smuzhiyun static Bool
xwlVidModeGetCurrentModeline(ScreenPtr pScreen,DisplayModePtr * mode,int * dotClock)82*4882a593Smuzhiyun xwlVidModeGetCurrentModeline(ScreenPtr pScreen, DisplayModePtr *mode, int *dotClock)
83*4882a593Smuzhiyun {
84*4882a593Smuzhiyun     DisplayModePtr pMod;
85*4882a593Smuzhiyun     RROutputPtr output;
86*4882a593Smuzhiyun     RRCrtcPtr crtc;
87*4882a593Smuzhiyun     xRRModeInfo rrmode;
88*4882a593Smuzhiyun 
89*4882a593Smuzhiyun     pMod = dixLookupPrivate(&pScreen->devPrivates, xwlVidModePrivateKey);
90*4882a593Smuzhiyun     if (pMod == NULL)
91*4882a593Smuzhiyun         return FALSE;
92*4882a593Smuzhiyun 
93*4882a593Smuzhiyun     output = RRFirstOutput(pScreen);
94*4882a593Smuzhiyun     if (output == NULL)
95*4882a593Smuzhiyun         return FALSE;
96*4882a593Smuzhiyun 
97*4882a593Smuzhiyun     crtc = output->crtc;
98*4882a593Smuzhiyun     if (crtc == NULL)
99*4882a593Smuzhiyun         return FALSE;
100*4882a593Smuzhiyun 
101*4882a593Smuzhiyun     rrmode = crtc->mode->mode;
102*4882a593Smuzhiyun 
103*4882a593Smuzhiyun     pMod->next = pMod;
104*4882a593Smuzhiyun     pMod->prev = pMod;
105*4882a593Smuzhiyun     pMod->name = "";
106*4882a593Smuzhiyun     pMod->VScan = 1;
107*4882a593Smuzhiyun     pMod->Private = NULL;
108*4882a593Smuzhiyun     pMod->HDisplay = rrmode.width;
109*4882a593Smuzhiyun     pMod->HSyncStart = rrmode.hSyncStart;
110*4882a593Smuzhiyun     pMod->HSyncEnd = rrmode.hSyncEnd;
111*4882a593Smuzhiyun     pMod->HTotal = rrmode.hTotal;
112*4882a593Smuzhiyun     pMod->HSkew = rrmode.hSkew;
113*4882a593Smuzhiyun     pMod->VDisplay = rrmode.height;
114*4882a593Smuzhiyun     pMod->VSyncStart = rrmode.vSyncStart;
115*4882a593Smuzhiyun     pMod->VSyncEnd = rrmode.vSyncEnd;
116*4882a593Smuzhiyun     pMod->VTotal = rrmode.vTotal;
117*4882a593Smuzhiyun     pMod->Flags = rrmode.modeFlags;
118*4882a593Smuzhiyun     pMod->Clock = rrmode.dotClock / 1000.0;
119*4882a593Smuzhiyun     pMod->VRefresh = mode_refresh(&rrmode); /* Or RRVerticalRefresh() */
120*4882a593Smuzhiyun     pMod->HSync = mode_hsync(&rrmode);
121*4882a593Smuzhiyun     *mode = pMod;
122*4882a593Smuzhiyun 
123*4882a593Smuzhiyun     if (dotClock != NULL)
124*4882a593Smuzhiyun         *dotClock = rrmode.dotClock / 1000.0;
125*4882a593Smuzhiyun 
126*4882a593Smuzhiyun     return TRUE;
127*4882a593Smuzhiyun }
128*4882a593Smuzhiyun 
129*4882a593Smuzhiyun static vidMonitorValue
xwlVidModeGetMonitorValue(ScreenPtr pScreen,int valtyp,int indx)130*4882a593Smuzhiyun xwlVidModeGetMonitorValue(ScreenPtr pScreen, int valtyp, int indx)
131*4882a593Smuzhiyun {
132*4882a593Smuzhiyun     vidMonitorValue ret = { NULL, };
133*4882a593Smuzhiyun     DisplayModePtr pMod;
134*4882a593Smuzhiyun 
135*4882a593Smuzhiyun     if (!xwlVidModeGetCurrentModeline(pScreen, &pMod, NULL))
136*4882a593Smuzhiyun         return ret;
137*4882a593Smuzhiyun 
138*4882a593Smuzhiyun     switch (valtyp) {
139*4882a593Smuzhiyun     case VIDMODE_MON_VENDOR:
140*4882a593Smuzhiyun         ret.ptr = XVENDORNAME;
141*4882a593Smuzhiyun         break;
142*4882a593Smuzhiyun     case VIDMODE_MON_MODEL:
143*4882a593Smuzhiyun         ret.ptr = "XWAYLAND";
144*4882a593Smuzhiyun         break;
145*4882a593Smuzhiyun     case VIDMODE_MON_NHSYNC:
146*4882a593Smuzhiyun         ret.i = 1;
147*4882a593Smuzhiyun         break;
148*4882a593Smuzhiyun     case VIDMODE_MON_NVREFRESH:
149*4882a593Smuzhiyun         ret.i = 1;
150*4882a593Smuzhiyun         break;
151*4882a593Smuzhiyun     case VIDMODE_MON_HSYNC_LO:
152*4882a593Smuzhiyun     case VIDMODE_MON_HSYNC_HI:
153*4882a593Smuzhiyun         ret.f = 100.0 * pMod->HSync;
154*4882a593Smuzhiyun         break;
155*4882a593Smuzhiyun     case VIDMODE_MON_VREFRESH_LO:
156*4882a593Smuzhiyun     case VIDMODE_MON_VREFRESH_HI:
157*4882a593Smuzhiyun         ret.f = 100.0 * pMod->VRefresh;
158*4882a593Smuzhiyun         break;
159*4882a593Smuzhiyun     }
160*4882a593Smuzhiyun     return ret;
161*4882a593Smuzhiyun }
162*4882a593Smuzhiyun 
163*4882a593Smuzhiyun static int
xwlVidModeGetDotClock(ScreenPtr pScreen,int Clock)164*4882a593Smuzhiyun xwlVidModeGetDotClock(ScreenPtr pScreen, int Clock)
165*4882a593Smuzhiyun {
166*4882a593Smuzhiyun     DisplayModePtr pMod;
167*4882a593Smuzhiyun 
168*4882a593Smuzhiyun     if (!xwlVidModeGetCurrentModeline(pScreen, &pMod, NULL))
169*4882a593Smuzhiyun         return 0;
170*4882a593Smuzhiyun 
171*4882a593Smuzhiyun     return pMod->Clock;
172*4882a593Smuzhiyun 
173*4882a593Smuzhiyun }
174*4882a593Smuzhiyun 
175*4882a593Smuzhiyun static int
xwlVidModeGetNumOfClocks(ScreenPtr pScreen,Bool * progClock)176*4882a593Smuzhiyun xwlVidModeGetNumOfClocks(ScreenPtr pScreen, Bool *progClock)
177*4882a593Smuzhiyun {
178*4882a593Smuzhiyun     return 1;
179*4882a593Smuzhiyun }
180*4882a593Smuzhiyun 
181*4882a593Smuzhiyun static Bool
xwlVidModeGetClocks(ScreenPtr pScreen,int * Clocks)182*4882a593Smuzhiyun xwlVidModeGetClocks(ScreenPtr pScreen, int *Clocks)
183*4882a593Smuzhiyun {
184*4882a593Smuzhiyun     *Clocks = xwlVidModeGetDotClock(pScreen, 0);
185*4882a593Smuzhiyun 
186*4882a593Smuzhiyun     return TRUE;
187*4882a593Smuzhiyun }
188*4882a593Smuzhiyun 
189*4882a593Smuzhiyun static Bool
xwlVidModeGetNextModeline(ScreenPtr pScreen,DisplayModePtr * mode,int * dotClock)190*4882a593Smuzhiyun xwlVidModeGetNextModeline(ScreenPtr pScreen, DisplayModePtr *mode, int *dotClock)
191*4882a593Smuzhiyun {
192*4882a593Smuzhiyun     return FALSE;
193*4882a593Smuzhiyun }
194*4882a593Smuzhiyun 
195*4882a593Smuzhiyun static Bool
xwlVidModeGetFirstModeline(ScreenPtr pScreen,DisplayModePtr * mode,int * dotClock)196*4882a593Smuzhiyun xwlVidModeGetFirstModeline(ScreenPtr pScreen, DisplayModePtr *mode, int *dotClock)
197*4882a593Smuzhiyun {
198*4882a593Smuzhiyun     return xwlVidModeGetCurrentModeline(pScreen, mode, dotClock);
199*4882a593Smuzhiyun }
200*4882a593Smuzhiyun 
201*4882a593Smuzhiyun static Bool
xwlVidModeDeleteModeline(ScreenPtr pScreen,DisplayModePtr mode)202*4882a593Smuzhiyun xwlVidModeDeleteModeline(ScreenPtr pScreen, DisplayModePtr mode)
203*4882a593Smuzhiyun {
204*4882a593Smuzhiyun     /* Unsupported */
205*4882a593Smuzhiyun     return FALSE;
206*4882a593Smuzhiyun }
207*4882a593Smuzhiyun 
208*4882a593Smuzhiyun static Bool
xwlVidModeZoomViewport(ScreenPtr pScreen,int zoom)209*4882a593Smuzhiyun xwlVidModeZoomViewport(ScreenPtr pScreen, int zoom)
210*4882a593Smuzhiyun {
211*4882a593Smuzhiyun     /* Support only no zoom */
212*4882a593Smuzhiyun     return (zoom == 1);
213*4882a593Smuzhiyun }
214*4882a593Smuzhiyun 
215*4882a593Smuzhiyun static Bool
xwlVidModeSetViewPort(ScreenPtr pScreen,int x,int y)216*4882a593Smuzhiyun xwlVidModeSetViewPort(ScreenPtr pScreen, int x, int y)
217*4882a593Smuzhiyun {
218*4882a593Smuzhiyun     RROutputPtr output;
219*4882a593Smuzhiyun     RRCrtcPtr crtc;
220*4882a593Smuzhiyun 
221*4882a593Smuzhiyun     output = RRFirstOutput(pScreen);
222*4882a593Smuzhiyun     if (output == NULL)
223*4882a593Smuzhiyun         return FALSE;
224*4882a593Smuzhiyun 
225*4882a593Smuzhiyun     crtc = output->crtc;
226*4882a593Smuzhiyun     if (crtc == NULL)
227*4882a593Smuzhiyun         return FALSE;
228*4882a593Smuzhiyun 
229*4882a593Smuzhiyun     /* Support only default viewport */
230*4882a593Smuzhiyun     return (x == crtc->x && y == crtc->y);
231*4882a593Smuzhiyun }
232*4882a593Smuzhiyun 
233*4882a593Smuzhiyun static Bool
xwlVidModeGetViewPort(ScreenPtr pScreen,int * x,int * y)234*4882a593Smuzhiyun xwlVidModeGetViewPort(ScreenPtr pScreen, int *x, int *y)
235*4882a593Smuzhiyun {
236*4882a593Smuzhiyun     RROutputPtr output;
237*4882a593Smuzhiyun     RRCrtcPtr crtc;
238*4882a593Smuzhiyun 
239*4882a593Smuzhiyun     output = RRFirstOutput(pScreen);
240*4882a593Smuzhiyun     if (output == NULL)
241*4882a593Smuzhiyun         return FALSE;
242*4882a593Smuzhiyun 
243*4882a593Smuzhiyun     crtc = output->crtc;
244*4882a593Smuzhiyun     if (crtc == NULL)
245*4882a593Smuzhiyun         return FALSE;
246*4882a593Smuzhiyun 
247*4882a593Smuzhiyun     *x = crtc->x;
248*4882a593Smuzhiyun     *y = crtc->y;
249*4882a593Smuzhiyun 
250*4882a593Smuzhiyun     return TRUE;
251*4882a593Smuzhiyun }
252*4882a593Smuzhiyun 
253*4882a593Smuzhiyun static Bool
xwlVidModeSwitchMode(ScreenPtr pScreen,DisplayModePtr mode)254*4882a593Smuzhiyun xwlVidModeSwitchMode(ScreenPtr pScreen, DisplayModePtr mode)
255*4882a593Smuzhiyun {
256*4882a593Smuzhiyun     /* Unsupported for now */
257*4882a593Smuzhiyun     return FALSE;
258*4882a593Smuzhiyun }
259*4882a593Smuzhiyun 
260*4882a593Smuzhiyun static Bool
xwlVidModeLockZoom(ScreenPtr pScreen,Bool lock)261*4882a593Smuzhiyun xwlVidModeLockZoom(ScreenPtr pScreen, Bool lock)
262*4882a593Smuzhiyun {
263*4882a593Smuzhiyun     /* Unsupported for now, but pretend it works */
264*4882a593Smuzhiyun     return TRUE;
265*4882a593Smuzhiyun }
266*4882a593Smuzhiyun 
267*4882a593Smuzhiyun static ModeStatus
xwlVidModeCheckModeForMonitor(ScreenPtr pScreen,DisplayModePtr mode)268*4882a593Smuzhiyun xwlVidModeCheckModeForMonitor(ScreenPtr pScreen, DisplayModePtr mode)
269*4882a593Smuzhiyun {
270*4882a593Smuzhiyun     DisplayModePtr pMod;
271*4882a593Smuzhiyun 
272*4882a593Smuzhiyun     /* This should not happen */
273*4882a593Smuzhiyun     if (!xwlVidModeGetCurrentModeline(pScreen, &pMod, NULL))
274*4882a593Smuzhiyun         return MODE_ERROR;
275*4882a593Smuzhiyun 
276*4882a593Smuzhiyun     /* Only support mode with the same HSync/VRefresh as we advertise */
277*4882a593Smuzhiyun     if (mode->HSync == pMod->HSync && mode->VRefresh == pMod->VRefresh)
278*4882a593Smuzhiyun         return MODE_OK;
279*4882a593Smuzhiyun 
280*4882a593Smuzhiyun     /* All the rest is unsupported - If we want to succeed, return MODE_OK instead */
281*4882a593Smuzhiyun     return MODE_ONE_SIZE;
282*4882a593Smuzhiyun }
283*4882a593Smuzhiyun 
284*4882a593Smuzhiyun static ModeStatus
xwlVidModeCheckModeForDriver(ScreenPtr pScreen,DisplayModePtr mode)285*4882a593Smuzhiyun xwlVidModeCheckModeForDriver(ScreenPtr pScreen, DisplayModePtr mode)
286*4882a593Smuzhiyun {
287*4882a593Smuzhiyun     DisplayModePtr pMod;
288*4882a593Smuzhiyun 
289*4882a593Smuzhiyun     /* This should not happen */
290*4882a593Smuzhiyun     if (!xwlVidModeGetCurrentModeline(pScreen, &pMod, NULL))
291*4882a593Smuzhiyun         return MODE_ERROR;
292*4882a593Smuzhiyun 
293*4882a593Smuzhiyun     if (mode->HTotal != pMod->HTotal)
294*4882a593Smuzhiyun         return MODE_BAD_HVALUE;
295*4882a593Smuzhiyun 
296*4882a593Smuzhiyun     if (mode->VTotal != pMod->VTotal)
297*4882a593Smuzhiyun         return MODE_BAD_VVALUE;
298*4882a593Smuzhiyun 
299*4882a593Smuzhiyun     /* Unsupported for now, but pretend it works */
300*4882a593Smuzhiyun     return MODE_OK;
301*4882a593Smuzhiyun }
302*4882a593Smuzhiyun 
303*4882a593Smuzhiyun static void
xwlVidModeSetCrtcForMode(ScreenPtr pScreen,DisplayModePtr mode)304*4882a593Smuzhiyun xwlVidModeSetCrtcForMode(ScreenPtr pScreen, DisplayModePtr mode)
305*4882a593Smuzhiyun {
306*4882a593Smuzhiyun     /* Unsupported */
307*4882a593Smuzhiyun     return;
308*4882a593Smuzhiyun }
309*4882a593Smuzhiyun 
310*4882a593Smuzhiyun static Bool
xwlVidModeAddModeline(ScreenPtr pScreen,DisplayModePtr mode)311*4882a593Smuzhiyun xwlVidModeAddModeline(ScreenPtr pScreen, DisplayModePtr mode)
312*4882a593Smuzhiyun {
313*4882a593Smuzhiyun     /* Unsupported */
314*4882a593Smuzhiyun     return FALSE;
315*4882a593Smuzhiyun }
316*4882a593Smuzhiyun 
317*4882a593Smuzhiyun static int
xwlVidModeGetNumOfModes(ScreenPtr pScreen)318*4882a593Smuzhiyun xwlVidModeGetNumOfModes(ScreenPtr pScreen)
319*4882a593Smuzhiyun {
320*4882a593Smuzhiyun     /* We have only one mode */
321*4882a593Smuzhiyun     return 1;
322*4882a593Smuzhiyun }
323*4882a593Smuzhiyun 
324*4882a593Smuzhiyun static Bool
xwlVidModeSetGamma(ScreenPtr pScreen,float red,float green,float blue)325*4882a593Smuzhiyun xwlVidModeSetGamma(ScreenPtr pScreen, float red, float green, float blue)
326*4882a593Smuzhiyun {
327*4882a593Smuzhiyun     /* Unsupported for now, but pretend it works */
328*4882a593Smuzhiyun     return TRUE;
329*4882a593Smuzhiyun }
330*4882a593Smuzhiyun 
331*4882a593Smuzhiyun static Bool
xwlVidModeGetGamma(ScreenPtr pScreen,float * red,float * green,float * blue)332*4882a593Smuzhiyun xwlVidModeGetGamma(ScreenPtr pScreen, float *red, float *green, float *blue)
333*4882a593Smuzhiyun {
334*4882a593Smuzhiyun     /* Unsupported for now, but pretend it works */
335*4882a593Smuzhiyun     *red = *green = *blue = 1.0f;
336*4882a593Smuzhiyun     return TRUE;
337*4882a593Smuzhiyun }
338*4882a593Smuzhiyun 
339*4882a593Smuzhiyun static Bool
xwlVidModeSetGammaRamp(ScreenPtr pScreen,int size,CARD16 * r,CARD16 * g,CARD16 * b)340*4882a593Smuzhiyun xwlVidModeSetGammaRamp(ScreenPtr pScreen, int size, CARD16 *r, CARD16 *g, CARD16 *b)
341*4882a593Smuzhiyun {
342*4882a593Smuzhiyun     /* Unsupported for now */
343*4882a593Smuzhiyun     return FALSE;
344*4882a593Smuzhiyun }
345*4882a593Smuzhiyun 
346*4882a593Smuzhiyun static Bool
xwlVidModeGetGammaRamp(ScreenPtr pScreen,int size,CARD16 * r,CARD16 * g,CARD16 * b)347*4882a593Smuzhiyun xwlVidModeGetGammaRamp(ScreenPtr pScreen, int size, CARD16 *r, CARD16 *g, CARD16 *b)
348*4882a593Smuzhiyun {
349*4882a593Smuzhiyun     /* Unsupported for now */
350*4882a593Smuzhiyun     return FALSE;
351*4882a593Smuzhiyun }
352*4882a593Smuzhiyun 
353*4882a593Smuzhiyun static int
xwlVidModeGetGammaRampSize(ScreenPtr pScreen)354*4882a593Smuzhiyun xwlVidModeGetGammaRampSize(ScreenPtr pScreen)
355*4882a593Smuzhiyun {
356*4882a593Smuzhiyun     /* Unsupported for now */
357*4882a593Smuzhiyun     return 0;
358*4882a593Smuzhiyun }
359*4882a593Smuzhiyun 
360*4882a593Smuzhiyun static Bool
xwlVidModeInit(ScreenPtr pScreen)361*4882a593Smuzhiyun xwlVidModeInit(ScreenPtr pScreen)
362*4882a593Smuzhiyun {
363*4882a593Smuzhiyun     VidModePtr pVidMode = NULL;
364*4882a593Smuzhiyun 
365*4882a593Smuzhiyun     pVidMode = VidModeInit(pScreen);
366*4882a593Smuzhiyun     if (!pVidMode)
367*4882a593Smuzhiyun         return FALSE;
368*4882a593Smuzhiyun 
369*4882a593Smuzhiyun     pVidMode->Flags = 0;
370*4882a593Smuzhiyun     pVidMode->Next = NULL;
371*4882a593Smuzhiyun 
372*4882a593Smuzhiyun     pVidMode->GetMonitorValue = xwlVidModeGetMonitorValue;
373*4882a593Smuzhiyun     pVidMode->GetCurrentModeline = xwlVidModeGetCurrentModeline;
374*4882a593Smuzhiyun     pVidMode->GetFirstModeline = xwlVidModeGetFirstModeline;
375*4882a593Smuzhiyun     pVidMode->GetNextModeline = xwlVidModeGetNextModeline;
376*4882a593Smuzhiyun     pVidMode->DeleteModeline = xwlVidModeDeleteModeline;
377*4882a593Smuzhiyun     pVidMode->ZoomViewport = xwlVidModeZoomViewport;
378*4882a593Smuzhiyun     pVidMode->GetViewPort = xwlVidModeGetViewPort;
379*4882a593Smuzhiyun     pVidMode->SetViewPort = xwlVidModeSetViewPort;
380*4882a593Smuzhiyun     pVidMode->SwitchMode = xwlVidModeSwitchMode;
381*4882a593Smuzhiyun     pVidMode->LockZoom = xwlVidModeLockZoom;
382*4882a593Smuzhiyun     pVidMode->GetNumOfClocks = xwlVidModeGetNumOfClocks;
383*4882a593Smuzhiyun     pVidMode->GetClocks = xwlVidModeGetClocks;
384*4882a593Smuzhiyun     pVidMode->CheckModeForMonitor = xwlVidModeCheckModeForMonitor;
385*4882a593Smuzhiyun     pVidMode->CheckModeForDriver = xwlVidModeCheckModeForDriver;
386*4882a593Smuzhiyun     pVidMode->SetCrtcForMode = xwlVidModeSetCrtcForMode;
387*4882a593Smuzhiyun     pVidMode->AddModeline = xwlVidModeAddModeline;
388*4882a593Smuzhiyun     pVidMode->GetDotClock = xwlVidModeGetDotClock;
389*4882a593Smuzhiyun     pVidMode->GetNumOfModes = xwlVidModeGetNumOfModes;
390*4882a593Smuzhiyun     pVidMode->SetGamma = xwlVidModeSetGamma;
391*4882a593Smuzhiyun     pVidMode->GetGamma = xwlVidModeGetGamma;
392*4882a593Smuzhiyun     pVidMode->SetGammaRamp = xwlVidModeSetGammaRamp;
393*4882a593Smuzhiyun     pVidMode->GetGammaRamp = xwlVidModeGetGammaRamp;
394*4882a593Smuzhiyun     pVidMode->GetGammaRampSize = xwlVidModeGetGammaRampSize;
395*4882a593Smuzhiyun 
396*4882a593Smuzhiyun     return TRUE;
397*4882a593Smuzhiyun }
398*4882a593Smuzhiyun 
399*4882a593Smuzhiyun void
xwlVidModeExtensionInit(void)400*4882a593Smuzhiyun xwlVidModeExtensionInit(void)
401*4882a593Smuzhiyun {
402*4882a593Smuzhiyun     int i;
403*4882a593Smuzhiyun     Bool enabled = FALSE;
404*4882a593Smuzhiyun 
405*4882a593Smuzhiyun     for (i = 0; i < screenInfo.numScreens; i++) {
406*4882a593Smuzhiyun         if (xwlVidModeInit (screenInfo.screens[i]))
407*4882a593Smuzhiyun             enabled = TRUE;
408*4882a593Smuzhiyun     }
409*4882a593Smuzhiyun     /* This means that the DDX doesn't want the vidmode extension enabled */
410*4882a593Smuzhiyun     if (!enabled)
411*4882a593Smuzhiyun         return;
412*4882a593Smuzhiyun 
413*4882a593Smuzhiyun     if (!dixRegisterPrivateKey(xwlVidModePrivateKey, PRIVATE_SCREEN,
414*4882a593Smuzhiyun                                sizeof(DisplayModeRec)))
415*4882a593Smuzhiyun         return;
416*4882a593Smuzhiyun 
417*4882a593Smuzhiyun     VidModeAddExtension(FALSE);
418*4882a593Smuzhiyun }
419*4882a593Smuzhiyun 
420*4882a593Smuzhiyun #endif                          /* XF86VIDMODE */
421