xref: /OK3568_Linux_fs/external/xserver/hw/xfree86/common/xf86Helper.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Copyright (c) 1997-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 /*
29*4882a593Smuzhiyun  * Authors: Dirk Hohndel <hohndel@XFree86.Org>
30*4882a593Smuzhiyun  *          David Dawes <dawes@XFree86.Org>
31*4882a593Smuzhiyun  *          ... and others
32*4882a593Smuzhiyun  *
33*4882a593Smuzhiyun  * This file includes the helper functions that the server provides for
34*4882a593Smuzhiyun  * different drivers.
35*4882a593Smuzhiyun  */
36*4882a593Smuzhiyun 
37*4882a593Smuzhiyun #ifdef HAVE_XORG_CONFIG_H
38*4882a593Smuzhiyun #include <xorg-config.h>
39*4882a593Smuzhiyun #endif
40*4882a593Smuzhiyun 
41*4882a593Smuzhiyun #include <X11/X.h>
42*4882a593Smuzhiyun #include "os.h"
43*4882a593Smuzhiyun #include "servermd.h"
44*4882a593Smuzhiyun #include "pixmapstr.h"
45*4882a593Smuzhiyun #include "windowstr.h"
46*4882a593Smuzhiyun #include "propertyst.h"
47*4882a593Smuzhiyun #include "gcstruct.h"
48*4882a593Smuzhiyun #include "loaderProcs.h"
49*4882a593Smuzhiyun #include "xf86.h"
50*4882a593Smuzhiyun #include "xf86Priv.h"
51*4882a593Smuzhiyun #include "xf86_OSlib.h"
52*4882a593Smuzhiyun #include "micmap.h"
53*4882a593Smuzhiyun #include "xf86DDC.h"
54*4882a593Smuzhiyun #include "xf86Xinput.h"
55*4882a593Smuzhiyun #include "xf86InPriv.h"
56*4882a593Smuzhiyun #include "mivalidate.h"
57*4882a593Smuzhiyun 
58*4882a593Smuzhiyun /* For xf86GetClocks */
59*4882a593Smuzhiyun #if defined(CSRG_BASED) || defined(__GNU__)
60*4882a593Smuzhiyun #define HAS_SETPRIORITY
61*4882a593Smuzhiyun #include <sys/resource.h>
62*4882a593Smuzhiyun #endif
63*4882a593Smuzhiyun 
64*4882a593Smuzhiyun static int xf86ScrnInfoPrivateCount = 0;
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun /* Add a pointer to a new DriverRec to xf86DriverList */
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun void
xf86AddDriver(DriverPtr driver,void * module,int flags)69*4882a593Smuzhiyun xf86AddDriver(DriverPtr driver, void *module, int flags)
70*4882a593Smuzhiyun {
71*4882a593Smuzhiyun     /* Don't add null entries */
72*4882a593Smuzhiyun     if (!driver)
73*4882a593Smuzhiyun         return;
74*4882a593Smuzhiyun 
75*4882a593Smuzhiyun     if (xf86DriverList == NULL)
76*4882a593Smuzhiyun         xf86NumDrivers = 0;
77*4882a593Smuzhiyun 
78*4882a593Smuzhiyun     xf86NumDrivers++;
79*4882a593Smuzhiyun     xf86DriverList = xnfreallocarray(xf86DriverList,
80*4882a593Smuzhiyun                                      xf86NumDrivers, sizeof(DriverPtr));
81*4882a593Smuzhiyun     xf86DriverList[xf86NumDrivers - 1] = xnfalloc(sizeof(DriverRec));
82*4882a593Smuzhiyun     *xf86DriverList[xf86NumDrivers - 1] = *driver;
83*4882a593Smuzhiyun     xf86DriverList[xf86NumDrivers - 1]->module = module;
84*4882a593Smuzhiyun     xf86DriverList[xf86NumDrivers - 1]->refCount = 0;
85*4882a593Smuzhiyun }
86*4882a593Smuzhiyun 
87*4882a593Smuzhiyun void
xf86DeleteDriver(int drvIndex)88*4882a593Smuzhiyun xf86DeleteDriver(int drvIndex)
89*4882a593Smuzhiyun {
90*4882a593Smuzhiyun     if (xf86DriverList[drvIndex]
91*4882a593Smuzhiyun         && (!xf86DriverHasEntities(xf86DriverList[drvIndex]))) {
92*4882a593Smuzhiyun         if (xf86DriverList[drvIndex]->module)
93*4882a593Smuzhiyun             UnloadModule(xf86DriverList[drvIndex]->module);
94*4882a593Smuzhiyun         free(xf86DriverList[drvIndex]);
95*4882a593Smuzhiyun         xf86DriverList[drvIndex] = NULL;
96*4882a593Smuzhiyun     }
97*4882a593Smuzhiyun }
98*4882a593Smuzhiyun 
99*4882a593Smuzhiyun /* Add a pointer to a new InputDriverRec to xf86InputDriverList */
100*4882a593Smuzhiyun 
101*4882a593Smuzhiyun void
xf86AddInputDriver(InputDriverPtr driver,void * module,int flags)102*4882a593Smuzhiyun xf86AddInputDriver(InputDriverPtr driver, void *module, int flags)
103*4882a593Smuzhiyun {
104*4882a593Smuzhiyun     /* Don't add null entries */
105*4882a593Smuzhiyun     if (!driver)
106*4882a593Smuzhiyun         return;
107*4882a593Smuzhiyun 
108*4882a593Smuzhiyun     if (xf86InputDriverList == NULL)
109*4882a593Smuzhiyun         xf86NumInputDrivers = 0;
110*4882a593Smuzhiyun 
111*4882a593Smuzhiyun     xf86NumInputDrivers++;
112*4882a593Smuzhiyun     xf86InputDriverList = xnfreallocarray(xf86InputDriverList,
113*4882a593Smuzhiyun                                           xf86NumInputDrivers,
114*4882a593Smuzhiyun                                           sizeof(InputDriverPtr));
115*4882a593Smuzhiyun     xf86InputDriverList[xf86NumInputDrivers - 1] =
116*4882a593Smuzhiyun         xnfalloc(sizeof(InputDriverRec));
117*4882a593Smuzhiyun     *xf86InputDriverList[xf86NumInputDrivers - 1] = *driver;
118*4882a593Smuzhiyun     xf86InputDriverList[xf86NumInputDrivers - 1]->module = module;
119*4882a593Smuzhiyun }
120*4882a593Smuzhiyun 
121*4882a593Smuzhiyun void
xf86DeleteInputDriver(int drvIndex)122*4882a593Smuzhiyun xf86DeleteInputDriver(int drvIndex)
123*4882a593Smuzhiyun {
124*4882a593Smuzhiyun     if (xf86InputDriverList[drvIndex] && xf86InputDriverList[drvIndex]->module)
125*4882a593Smuzhiyun         UnloadModule(xf86InputDriverList[drvIndex]->module);
126*4882a593Smuzhiyun     free(xf86InputDriverList[drvIndex]);
127*4882a593Smuzhiyun     xf86InputDriverList[drvIndex] = NULL;
128*4882a593Smuzhiyun }
129*4882a593Smuzhiyun 
130*4882a593Smuzhiyun InputDriverPtr
xf86LookupInputDriver(const char * name)131*4882a593Smuzhiyun xf86LookupInputDriver(const char *name)
132*4882a593Smuzhiyun {
133*4882a593Smuzhiyun     int i;
134*4882a593Smuzhiyun 
135*4882a593Smuzhiyun     for (i = 0; i < xf86NumInputDrivers; i++) {
136*4882a593Smuzhiyun         if (xf86InputDriverList[i] && xf86InputDriverList[i]->driverName &&
137*4882a593Smuzhiyun             xf86NameCmp(name, xf86InputDriverList[i]->driverName) == 0)
138*4882a593Smuzhiyun             return xf86InputDriverList[i];
139*4882a593Smuzhiyun     }
140*4882a593Smuzhiyun     return NULL;
141*4882a593Smuzhiyun }
142*4882a593Smuzhiyun 
143*4882a593Smuzhiyun InputInfoPtr
xf86LookupInput(const char * name)144*4882a593Smuzhiyun xf86LookupInput(const char *name)
145*4882a593Smuzhiyun {
146*4882a593Smuzhiyun     InputInfoPtr p;
147*4882a593Smuzhiyun 
148*4882a593Smuzhiyun     for (p = xf86InputDevs; p != NULL; p = p->next) {
149*4882a593Smuzhiyun         if (strcmp(name, p->name) == 0)
150*4882a593Smuzhiyun             return p;
151*4882a593Smuzhiyun     }
152*4882a593Smuzhiyun 
153*4882a593Smuzhiyun     return NULL;
154*4882a593Smuzhiyun }
155*4882a593Smuzhiyun 
156*4882a593Smuzhiyun /* Allocate a new ScrnInfoRec in xf86Screens */
157*4882a593Smuzhiyun 
158*4882a593Smuzhiyun ScrnInfoPtr
xf86AllocateScreen(DriverPtr drv,int flags)159*4882a593Smuzhiyun xf86AllocateScreen(DriverPtr drv, int flags)
160*4882a593Smuzhiyun {
161*4882a593Smuzhiyun     int i;
162*4882a593Smuzhiyun     ScrnInfoPtr pScrn;
163*4882a593Smuzhiyun 
164*4882a593Smuzhiyun     if (flags & XF86_ALLOCATE_GPU_SCREEN) {
165*4882a593Smuzhiyun         if (xf86GPUScreens == NULL)
166*4882a593Smuzhiyun             xf86NumGPUScreens = 0;
167*4882a593Smuzhiyun         i = xf86NumGPUScreens++;
168*4882a593Smuzhiyun         xf86GPUScreens = xnfreallocarray(xf86GPUScreens, xf86NumGPUScreens,
169*4882a593Smuzhiyun                                          sizeof(ScrnInfoPtr));
170*4882a593Smuzhiyun         xf86GPUScreens[i] = xnfcalloc(sizeof(ScrnInfoRec), 1);
171*4882a593Smuzhiyun         pScrn = xf86GPUScreens[i];
172*4882a593Smuzhiyun         pScrn->scrnIndex = i + GPU_SCREEN_OFFSET;      /* Changes when a screen is removed */
173*4882a593Smuzhiyun         pScrn->is_gpu = TRUE;
174*4882a593Smuzhiyun     } else {
175*4882a593Smuzhiyun         if (xf86Screens == NULL)
176*4882a593Smuzhiyun             xf86NumScreens = 0;
177*4882a593Smuzhiyun 
178*4882a593Smuzhiyun         i = xf86NumScreens++;
179*4882a593Smuzhiyun         xf86Screens = xnfreallocarray(xf86Screens, xf86NumScreens,
180*4882a593Smuzhiyun                                       sizeof(ScrnInfoPtr));
181*4882a593Smuzhiyun         xf86Screens[i] = xnfcalloc(sizeof(ScrnInfoRec), 1);
182*4882a593Smuzhiyun         pScrn = xf86Screens[i];
183*4882a593Smuzhiyun 
184*4882a593Smuzhiyun         pScrn->scrnIndex = i;      /* Changes when a screen is removed */
185*4882a593Smuzhiyun     }
186*4882a593Smuzhiyun 
187*4882a593Smuzhiyun     pScrn->origIndex = pScrn->scrnIndex;      /* This never changes */
188*4882a593Smuzhiyun     pScrn->privates = xnfcalloc(sizeof(DevUnion), xf86ScrnInfoPrivateCount);
189*4882a593Smuzhiyun     /*
190*4882a593Smuzhiyun      * EnableDisableFBAccess now gets initialized in InitOutput()
191*4882a593Smuzhiyun      * pScrn->EnableDisableFBAccess = xf86EnableDisableFBAccess;
192*4882a593Smuzhiyun      */
193*4882a593Smuzhiyun 
194*4882a593Smuzhiyun     pScrn->drv = drv;
195*4882a593Smuzhiyun     drv->refCount++;
196*4882a593Smuzhiyun     pScrn->module = DuplicateModule(drv->module, NULL);
197*4882a593Smuzhiyun 
198*4882a593Smuzhiyun     pScrn->DriverFunc = drv->driverFunc;
199*4882a593Smuzhiyun 
200*4882a593Smuzhiyun     return pScrn;
201*4882a593Smuzhiyun }
202*4882a593Smuzhiyun 
203*4882a593Smuzhiyun /*
204*4882a593Smuzhiyun  * Remove an entry from xf86Screens.  Ideally it should free all allocated
205*4882a593Smuzhiyun  * data.  To do this properly may require a driver hook.
206*4882a593Smuzhiyun  */
207*4882a593Smuzhiyun 
208*4882a593Smuzhiyun void
xf86DeleteScreen(ScrnInfoPtr pScrn)209*4882a593Smuzhiyun xf86DeleteScreen(ScrnInfoPtr pScrn)
210*4882a593Smuzhiyun {
211*4882a593Smuzhiyun     int i;
212*4882a593Smuzhiyun     int scrnIndex;
213*4882a593Smuzhiyun     Bool is_gpu = FALSE;
214*4882a593Smuzhiyun 
215*4882a593Smuzhiyun     if (!pScrn)
216*4882a593Smuzhiyun         return;
217*4882a593Smuzhiyun 
218*4882a593Smuzhiyun     if (pScrn->is_gpu) {
219*4882a593Smuzhiyun         /* First check if the screen is valid */
220*4882a593Smuzhiyun         if (xf86NumGPUScreens == 0 || xf86GPUScreens == NULL)
221*4882a593Smuzhiyun             return;
222*4882a593Smuzhiyun         is_gpu = TRUE;
223*4882a593Smuzhiyun     } else {
224*4882a593Smuzhiyun         /* First check if the screen is valid */
225*4882a593Smuzhiyun         if (xf86NumScreens == 0 || xf86Screens == NULL)
226*4882a593Smuzhiyun             return;
227*4882a593Smuzhiyun     }
228*4882a593Smuzhiyun 
229*4882a593Smuzhiyun     scrnIndex = pScrn->scrnIndex;
230*4882a593Smuzhiyun     /* If a FreeScreen function is defined, call it here */
231*4882a593Smuzhiyun     if (pScrn->FreeScreen != NULL)
232*4882a593Smuzhiyun         pScrn->FreeScreen(pScrn);
233*4882a593Smuzhiyun 
234*4882a593Smuzhiyun     while (pScrn->modes)
235*4882a593Smuzhiyun         xf86DeleteMode(&pScrn->modes, pScrn->modes);
236*4882a593Smuzhiyun 
237*4882a593Smuzhiyun     while (pScrn->modePool)
238*4882a593Smuzhiyun         xf86DeleteMode(&pScrn->modePool, pScrn->modePool);
239*4882a593Smuzhiyun 
240*4882a593Smuzhiyun     xf86OptionListFree(pScrn->options);
241*4882a593Smuzhiyun 
242*4882a593Smuzhiyun     if (pScrn->module)
243*4882a593Smuzhiyun         UnloadModule(pScrn->module);
244*4882a593Smuzhiyun 
245*4882a593Smuzhiyun     if (pScrn->drv)
246*4882a593Smuzhiyun         pScrn->drv->refCount--;
247*4882a593Smuzhiyun 
248*4882a593Smuzhiyun     free(pScrn->privates);
249*4882a593Smuzhiyun 
250*4882a593Smuzhiyun     xf86ClearEntityListForScreen(pScrn);
251*4882a593Smuzhiyun 
252*4882a593Smuzhiyun     free(pScrn);
253*4882a593Smuzhiyun 
254*4882a593Smuzhiyun     /* Move the other entries down, updating their scrnIndex fields */
255*4882a593Smuzhiyun 
256*4882a593Smuzhiyun     if (is_gpu) {
257*4882a593Smuzhiyun         xf86NumGPUScreens--;
258*4882a593Smuzhiyun         scrnIndex -= GPU_SCREEN_OFFSET;
259*4882a593Smuzhiyun         for (i = scrnIndex; i < xf86NumGPUScreens; i++) {
260*4882a593Smuzhiyun             xf86GPUScreens[i] = xf86GPUScreens[i + 1];
261*4882a593Smuzhiyun             xf86GPUScreens[i]->scrnIndex = i + GPU_SCREEN_OFFSET;
262*4882a593Smuzhiyun             /* Also need to take care of the screen layout settings */
263*4882a593Smuzhiyun         }
264*4882a593Smuzhiyun     }
265*4882a593Smuzhiyun     else {
266*4882a593Smuzhiyun         xf86NumScreens--;
267*4882a593Smuzhiyun 
268*4882a593Smuzhiyun         for (i = scrnIndex; i < xf86NumScreens; i++) {
269*4882a593Smuzhiyun             xf86Screens[i] = xf86Screens[i + 1];
270*4882a593Smuzhiyun             xf86Screens[i]->scrnIndex = i;
271*4882a593Smuzhiyun             /* Also need to take care of the screen layout settings */
272*4882a593Smuzhiyun         }
273*4882a593Smuzhiyun     }
274*4882a593Smuzhiyun }
275*4882a593Smuzhiyun 
276*4882a593Smuzhiyun /*
277*4882a593Smuzhiyun  * Allocate a private in ScrnInfoRec.
278*4882a593Smuzhiyun  */
279*4882a593Smuzhiyun 
280*4882a593Smuzhiyun int
xf86AllocateScrnInfoPrivateIndex(void)281*4882a593Smuzhiyun xf86AllocateScrnInfoPrivateIndex(void)
282*4882a593Smuzhiyun {
283*4882a593Smuzhiyun     int idx, i;
284*4882a593Smuzhiyun     ScrnInfoPtr pScr;
285*4882a593Smuzhiyun     DevUnion *nprivs;
286*4882a593Smuzhiyun 
287*4882a593Smuzhiyun     idx = xf86ScrnInfoPrivateCount++;
288*4882a593Smuzhiyun     for (i = 0; i < xf86NumScreens; i++) {
289*4882a593Smuzhiyun         pScr = xf86Screens[i];
290*4882a593Smuzhiyun         nprivs = xnfreallocarray(pScr->privates,
291*4882a593Smuzhiyun                                  xf86ScrnInfoPrivateCount, sizeof(DevUnion));
292*4882a593Smuzhiyun         /* Zero the new private */
293*4882a593Smuzhiyun         memset(&nprivs[idx], 0, sizeof(DevUnion));
294*4882a593Smuzhiyun         pScr->privates = nprivs;
295*4882a593Smuzhiyun     }
296*4882a593Smuzhiyun     for (i = 0; i < xf86NumGPUScreens; i++) {
297*4882a593Smuzhiyun         pScr = xf86GPUScreens[i];
298*4882a593Smuzhiyun         nprivs = xnfreallocarray(pScr->privates,
299*4882a593Smuzhiyun                                  xf86ScrnInfoPrivateCount, sizeof(DevUnion));
300*4882a593Smuzhiyun         /* Zero the new private */
301*4882a593Smuzhiyun         memset(&nprivs[idx], 0, sizeof(DevUnion));
302*4882a593Smuzhiyun         pScr->privates = nprivs;
303*4882a593Smuzhiyun     }
304*4882a593Smuzhiyun     return idx;
305*4882a593Smuzhiyun }
306*4882a593Smuzhiyun 
307*4882a593Smuzhiyun Bool
xf86AddPixFormat(ScrnInfoPtr pScrn,int depth,int bpp,int pad)308*4882a593Smuzhiyun xf86AddPixFormat(ScrnInfoPtr pScrn, int depth, int bpp, int pad)
309*4882a593Smuzhiyun {
310*4882a593Smuzhiyun     int i;
311*4882a593Smuzhiyun 
312*4882a593Smuzhiyun     if (pScrn->numFormats >= MAXFORMATS)
313*4882a593Smuzhiyun         return FALSE;
314*4882a593Smuzhiyun 
315*4882a593Smuzhiyun     if (bpp <= 0) {
316*4882a593Smuzhiyun         if (depth == 1)
317*4882a593Smuzhiyun             bpp = 1;
318*4882a593Smuzhiyun         else if (depth <= 8)
319*4882a593Smuzhiyun             bpp = 8;
320*4882a593Smuzhiyun         else if (depth <= 16)
321*4882a593Smuzhiyun             bpp = 16;
322*4882a593Smuzhiyun         else if (depth <= 32)
323*4882a593Smuzhiyun             bpp = 32;
324*4882a593Smuzhiyun         else
325*4882a593Smuzhiyun             return FALSE;
326*4882a593Smuzhiyun     }
327*4882a593Smuzhiyun     if (pad <= 0)
328*4882a593Smuzhiyun         pad = BITMAP_SCANLINE_PAD;
329*4882a593Smuzhiyun 
330*4882a593Smuzhiyun     i = pScrn->numFormats++;
331*4882a593Smuzhiyun     pScrn->formats[i].depth = depth;
332*4882a593Smuzhiyun     pScrn->formats[i].bitsPerPixel = bpp;
333*4882a593Smuzhiyun     pScrn->formats[i].scanlinePad = pad;
334*4882a593Smuzhiyun     return TRUE;
335*4882a593Smuzhiyun }
336*4882a593Smuzhiyun 
337*4882a593Smuzhiyun /*
338*4882a593Smuzhiyun  * Set the depth we are using based on (in the following order of preference):
339*4882a593Smuzhiyun  *  - values given on the command line
340*4882a593Smuzhiyun  *  - values given in the config file
341*4882a593Smuzhiyun  *  - values provided by the driver
342*4882a593Smuzhiyun  *  - an overall default when nothing else is given
343*4882a593Smuzhiyun  *
344*4882a593Smuzhiyun  * Also find a Display subsection matching the depth/bpp found.
345*4882a593Smuzhiyun  *
346*4882a593Smuzhiyun  * Sets the following ScrnInfoRec fields:
347*4882a593Smuzhiyun  *     bitsPerPixel, depth, display, imageByteOrder,
348*4882a593Smuzhiyun  *     bitmapScanlinePad, bitmapScanlineUnit, bitmapBitOrder, numFormats,
349*4882a593Smuzhiyun  *     formats, fbFormat.
350*4882a593Smuzhiyun  */
351*4882a593Smuzhiyun 
352*4882a593Smuzhiyun /* Can the screen handle 32 bpp pixmaps */
353*4882a593Smuzhiyun #define DO_PIX32(f) ((f & Support32bppFb) || \
354*4882a593Smuzhiyun 		     ((f & Support24bppFb) && (f & SupportConvert32to24)))
355*4882a593Smuzhiyun 
356*4882a593Smuzhiyun #ifndef GLOBAL_DEFAULT_DEPTH
357*4882a593Smuzhiyun #define GLOBAL_DEFAULT_DEPTH 24
358*4882a593Smuzhiyun #endif
359*4882a593Smuzhiyun 
360*4882a593Smuzhiyun Bool
xf86SetDepthBpp(ScrnInfoPtr scrp,int depth,int dummy,int fbbpp,int depth24flags)361*4882a593Smuzhiyun xf86SetDepthBpp(ScrnInfoPtr scrp, int depth, int dummy, int fbbpp,
362*4882a593Smuzhiyun                 int depth24flags)
363*4882a593Smuzhiyun {
364*4882a593Smuzhiyun     int i;
365*4882a593Smuzhiyun     DispPtr disp;
366*4882a593Smuzhiyun 
367*4882a593Smuzhiyun     scrp->bitsPerPixel = -1;
368*4882a593Smuzhiyun     scrp->depth = -1;
369*4882a593Smuzhiyun     scrp->bitsPerPixelFrom = X_DEFAULT;
370*4882a593Smuzhiyun     scrp->depthFrom = X_DEFAULT;
371*4882a593Smuzhiyun 
372*4882a593Smuzhiyun     if (xf86FbBpp > 0) {
373*4882a593Smuzhiyun         if (xf86FbBpp == 24) /* lol no */
374*4882a593Smuzhiyun             xf86FbBpp = 32;
375*4882a593Smuzhiyun         scrp->bitsPerPixel = xf86FbBpp;
376*4882a593Smuzhiyun         scrp->bitsPerPixelFrom = X_CMDLINE;
377*4882a593Smuzhiyun     }
378*4882a593Smuzhiyun 
379*4882a593Smuzhiyun     if (xf86Depth > 0) {
380*4882a593Smuzhiyun         scrp->depth = xf86Depth;
381*4882a593Smuzhiyun         scrp->depthFrom = X_CMDLINE;
382*4882a593Smuzhiyun     }
383*4882a593Smuzhiyun 
384*4882a593Smuzhiyun     if (xf86FbBpp < 0 && xf86Depth < 0) {
385*4882a593Smuzhiyun         if (scrp->confScreen->defaultfbbpp > 0) {
386*4882a593Smuzhiyun             scrp->bitsPerPixel = scrp->confScreen->defaultfbbpp;
387*4882a593Smuzhiyun             scrp->bitsPerPixelFrom = X_CONFIG;
388*4882a593Smuzhiyun         }
389*4882a593Smuzhiyun         if (scrp->confScreen->defaultdepth > 0) {
390*4882a593Smuzhiyun             scrp->depth = scrp->confScreen->defaultdepth;
391*4882a593Smuzhiyun             scrp->depthFrom = X_CONFIG;
392*4882a593Smuzhiyun         }
393*4882a593Smuzhiyun 
394*4882a593Smuzhiyun         if (scrp->confScreen->defaultfbbpp <= 0 &&
395*4882a593Smuzhiyun             scrp->confScreen->defaultdepth <= 0) {
396*4882a593Smuzhiyun             /*
397*4882a593Smuzhiyun              * Check for DefaultDepth and DefaultFbBpp options in the
398*4882a593Smuzhiyun              * Device sections.
399*4882a593Smuzhiyun              */
400*4882a593Smuzhiyun             GDevPtr device;
401*4882a593Smuzhiyun             Bool found = FALSE;
402*4882a593Smuzhiyun 
403*4882a593Smuzhiyun             for (i = 0; i < scrp->numEntities; i++) {
404*4882a593Smuzhiyun                 device = xf86GetDevFromEntity(scrp->entityList[i],
405*4882a593Smuzhiyun                                               scrp->entityInstanceList[i]);
406*4882a593Smuzhiyun                 if (device && device->options) {
407*4882a593Smuzhiyun                     if (xf86FindOption(device->options, "DefaultDepth")) {
408*4882a593Smuzhiyun                         scrp->depth = xf86SetIntOption(device->options,
409*4882a593Smuzhiyun                                                        "DefaultDepth", -1);
410*4882a593Smuzhiyun                         scrp->depthFrom = X_CONFIG;
411*4882a593Smuzhiyun                         found = TRUE;
412*4882a593Smuzhiyun                     }
413*4882a593Smuzhiyun                     if (xf86FindOption(device->options, "DefaultFbBpp")) {
414*4882a593Smuzhiyun                         scrp->bitsPerPixel = xf86SetIntOption(device->options,
415*4882a593Smuzhiyun                                                               "DefaultFbBpp",
416*4882a593Smuzhiyun                                                               -1);
417*4882a593Smuzhiyun                         scrp->bitsPerPixelFrom = X_CONFIG;
418*4882a593Smuzhiyun                         found = TRUE;
419*4882a593Smuzhiyun                     }
420*4882a593Smuzhiyun                 }
421*4882a593Smuzhiyun                 if (found)
422*4882a593Smuzhiyun                     break;
423*4882a593Smuzhiyun             }
424*4882a593Smuzhiyun         }
425*4882a593Smuzhiyun     }
426*4882a593Smuzhiyun 
427*4882a593Smuzhiyun     /* If none of these is set, pick a default */
428*4882a593Smuzhiyun     if (scrp->bitsPerPixel < 0 && scrp->depth < 0) {
429*4882a593Smuzhiyun         if (fbbpp > 0 || depth > 0) {
430*4882a593Smuzhiyun             if (fbbpp > 0)
431*4882a593Smuzhiyun                 scrp->bitsPerPixel = fbbpp;
432*4882a593Smuzhiyun             if (depth > 0)
433*4882a593Smuzhiyun                 scrp->depth = depth;
434*4882a593Smuzhiyun         }
435*4882a593Smuzhiyun         else {
436*4882a593Smuzhiyun             scrp->depth = GLOBAL_DEFAULT_DEPTH;
437*4882a593Smuzhiyun         }
438*4882a593Smuzhiyun     }
439*4882a593Smuzhiyun 
440*4882a593Smuzhiyun     /* If any are not given, determine a default for the others */
441*4882a593Smuzhiyun 
442*4882a593Smuzhiyun     if (scrp->bitsPerPixel < 0) {
443*4882a593Smuzhiyun         /* The depth must be set */
444*4882a593Smuzhiyun         if (scrp->depth > -1) {
445*4882a593Smuzhiyun             if (scrp->depth == 1)
446*4882a593Smuzhiyun                 scrp->bitsPerPixel = 1;
447*4882a593Smuzhiyun             else if (scrp->depth <= 4)
448*4882a593Smuzhiyun                 scrp->bitsPerPixel = 4;
449*4882a593Smuzhiyun             else if (scrp->depth <= 8)
450*4882a593Smuzhiyun                 scrp->bitsPerPixel = 8;
451*4882a593Smuzhiyun             else if (scrp->depth <= 16)
452*4882a593Smuzhiyun                 scrp->bitsPerPixel = 16;
453*4882a593Smuzhiyun             else if (scrp->depth <= 24 && DO_PIX32(depth24flags)) {
454*4882a593Smuzhiyun                 scrp->bitsPerPixel = 32;
455*4882a593Smuzhiyun             }
456*4882a593Smuzhiyun             else if (scrp->depth <= 32)
457*4882a593Smuzhiyun                 scrp->bitsPerPixel = 32;
458*4882a593Smuzhiyun             else {
459*4882a593Smuzhiyun                 xf86DrvMsg(scrp->scrnIndex, X_ERROR,
460*4882a593Smuzhiyun                            "No bpp for depth (%d)\n", scrp->depth);
461*4882a593Smuzhiyun                 return FALSE;
462*4882a593Smuzhiyun             }
463*4882a593Smuzhiyun         }
464*4882a593Smuzhiyun         else {
465*4882a593Smuzhiyun             xf86DrvMsg(scrp->scrnIndex, X_ERROR,
466*4882a593Smuzhiyun                        "xf86SetDepthBpp: internal error: depth and fbbpp"
467*4882a593Smuzhiyun                        " are both not set\n");
468*4882a593Smuzhiyun             return FALSE;
469*4882a593Smuzhiyun         }
470*4882a593Smuzhiyun         if (scrp->bitsPerPixel < 0) {
471*4882a593Smuzhiyun             if ((depth24flags & (Support24bppFb | Support32bppFb)) ==
472*4882a593Smuzhiyun                      NoDepth24Support)
473*4882a593Smuzhiyun                 xf86DrvMsg(scrp->scrnIndex, X_ERROR,
474*4882a593Smuzhiyun                            "Driver can't support depth 24\n");
475*4882a593Smuzhiyun             else
476*4882a593Smuzhiyun                 xf86DrvMsg(scrp->scrnIndex, X_ERROR,
477*4882a593Smuzhiyun                            "Can't find fbbpp for depth 24\n");
478*4882a593Smuzhiyun             return FALSE;
479*4882a593Smuzhiyun         }
480*4882a593Smuzhiyun         scrp->bitsPerPixelFrom = X_PROBED;
481*4882a593Smuzhiyun     }
482*4882a593Smuzhiyun 
483*4882a593Smuzhiyun     if (scrp->depth <= 0) {
484*4882a593Smuzhiyun         /* bitsPerPixel is already set */
485*4882a593Smuzhiyun         switch (scrp->bitsPerPixel) {
486*4882a593Smuzhiyun         case 32:
487*4882a593Smuzhiyun             scrp->depth = 24;
488*4882a593Smuzhiyun             break;
489*4882a593Smuzhiyun         default:
490*4882a593Smuzhiyun             /* 1, 4, 8, 16 and 24 */
491*4882a593Smuzhiyun             scrp->depth = scrp->bitsPerPixel;
492*4882a593Smuzhiyun             break;
493*4882a593Smuzhiyun         }
494*4882a593Smuzhiyun         scrp->depthFrom = X_PROBED;
495*4882a593Smuzhiyun     }
496*4882a593Smuzhiyun 
497*4882a593Smuzhiyun     /* Sanity checks */
498*4882a593Smuzhiyun     if (scrp->depth < 1 || scrp->depth > 32) {
499*4882a593Smuzhiyun         xf86DrvMsg(scrp->scrnIndex, X_ERROR,
500*4882a593Smuzhiyun                    "Specified depth (%d) is not in the range 1-32\n",
501*4882a593Smuzhiyun                    scrp->depth);
502*4882a593Smuzhiyun         return FALSE;
503*4882a593Smuzhiyun     }
504*4882a593Smuzhiyun     switch (scrp->bitsPerPixel) {
505*4882a593Smuzhiyun     case 1:
506*4882a593Smuzhiyun     case 4:
507*4882a593Smuzhiyun     case 8:
508*4882a593Smuzhiyun     case 16:
509*4882a593Smuzhiyun     case 32:
510*4882a593Smuzhiyun         break;
511*4882a593Smuzhiyun     default:
512*4882a593Smuzhiyun         xf86DrvMsg(scrp->scrnIndex, X_ERROR,
513*4882a593Smuzhiyun                    "Specified fbbpp (%d) is not a permitted value\n",
514*4882a593Smuzhiyun                    scrp->bitsPerPixel);
515*4882a593Smuzhiyun         return FALSE;
516*4882a593Smuzhiyun     }
517*4882a593Smuzhiyun     if (scrp->depth > scrp->bitsPerPixel) {
518*4882a593Smuzhiyun         xf86DrvMsg(scrp->scrnIndex, X_ERROR,
519*4882a593Smuzhiyun                    "Specified depth (%d) is greater than the fbbpp (%d)\n",
520*4882a593Smuzhiyun                    scrp->depth, scrp->bitsPerPixel);
521*4882a593Smuzhiyun         return FALSE;
522*4882a593Smuzhiyun     }
523*4882a593Smuzhiyun 
524*4882a593Smuzhiyun     /*
525*4882a593Smuzhiyun      * Find the Display subsection matching the depth/fbbpp and initialise
526*4882a593Smuzhiyun      * scrp->display with it.
527*4882a593Smuzhiyun      */
528*4882a593Smuzhiyun     for (i = 0, disp = scrp->confScreen->displays;
529*4882a593Smuzhiyun          i < scrp->confScreen->numdisplays; i++, disp++) {
530*4882a593Smuzhiyun         if ((disp->depth == scrp->depth && disp->fbbpp == scrp->bitsPerPixel)
531*4882a593Smuzhiyun             || (disp->depth == scrp->depth && disp->fbbpp <= 0)
532*4882a593Smuzhiyun             || (disp->fbbpp == scrp->bitsPerPixel && disp->depth <= 0)) {
533*4882a593Smuzhiyun             scrp->display = disp;
534*4882a593Smuzhiyun             break;
535*4882a593Smuzhiyun         }
536*4882a593Smuzhiyun     }
537*4882a593Smuzhiyun 
538*4882a593Smuzhiyun     /*
539*4882a593Smuzhiyun      * If an exact match can't be found, see if there is one with no
540*4882a593Smuzhiyun      * depth or fbbpp specified.
541*4882a593Smuzhiyun      */
542*4882a593Smuzhiyun     if (i == scrp->confScreen->numdisplays) {
543*4882a593Smuzhiyun         for (i = 0, disp = scrp->confScreen->displays;
544*4882a593Smuzhiyun              i < scrp->confScreen->numdisplays; i++, disp++) {
545*4882a593Smuzhiyun             if (disp->depth <= 0 && disp->fbbpp <= 0) {
546*4882a593Smuzhiyun                 scrp->display = disp;
547*4882a593Smuzhiyun                 break;
548*4882a593Smuzhiyun             }
549*4882a593Smuzhiyun         }
550*4882a593Smuzhiyun     }
551*4882a593Smuzhiyun 
552*4882a593Smuzhiyun     /*
553*4882a593Smuzhiyun      * If all else fails, create a default one.
554*4882a593Smuzhiyun      */
555*4882a593Smuzhiyun     if (i == scrp->confScreen->numdisplays) {
556*4882a593Smuzhiyun         scrp->confScreen->numdisplays++;
557*4882a593Smuzhiyun 
558*4882a593Smuzhiyun 	/**
559*4882a593Smuzhiyun 	 * HACK: Realloc would free the old displays and damage other
560*4882a593Smuzhiyun 	 * scrp's display.
561*4882a593Smuzhiyun 	 */
562*4882a593Smuzhiyun #if 0
563*4882a593Smuzhiyun         scrp->confScreen->displays =
564*4882a593Smuzhiyun             xnfreallocarray(scrp->confScreen->displays,
565*4882a593Smuzhiyun                             scrp->confScreen->numdisplays, sizeof(DispRec));
566*4882a593Smuzhiyun #endif
567*4882a593Smuzhiyun 
568*4882a593Smuzhiyun         xf86DrvMsg(scrp->scrnIndex, X_INFO,
569*4882a593Smuzhiyun                    "Creating default Display subsection in Screen section\n"
570*4882a593Smuzhiyun                    "\t\"%s\" for depth/fbbpp %d/%d\n",
571*4882a593Smuzhiyun                    scrp->confScreen->id, scrp->depth, scrp->bitsPerPixel);
572*4882a593Smuzhiyun         memset(&scrp->confScreen->displays[i], 0, sizeof(DispRec));
573*4882a593Smuzhiyun         scrp->confScreen->displays[i].blackColour.red = -1;
574*4882a593Smuzhiyun         scrp->confScreen->displays[i].blackColour.green = -1;
575*4882a593Smuzhiyun         scrp->confScreen->displays[i].blackColour.blue = -1;
576*4882a593Smuzhiyun         scrp->confScreen->displays[i].whiteColour.red = -1;
577*4882a593Smuzhiyun         scrp->confScreen->displays[i].whiteColour.green = -1;
578*4882a593Smuzhiyun         scrp->confScreen->displays[i].whiteColour.blue = -1;
579*4882a593Smuzhiyun         scrp->confScreen->displays[i].defaultVisual = -1;
580*4882a593Smuzhiyun         scrp->confScreen->displays[i].modes = xnfalloc(sizeof(char *));
581*4882a593Smuzhiyun         scrp->confScreen->displays[i].modes[0] = NULL;
582*4882a593Smuzhiyun         scrp->confScreen->displays[i].depth = depth;
583*4882a593Smuzhiyun         scrp->confScreen->displays[i].fbbpp = fbbpp;
584*4882a593Smuzhiyun         scrp->display = &scrp->confScreen->displays[i];
585*4882a593Smuzhiyun     }
586*4882a593Smuzhiyun 
587*4882a593Smuzhiyun     /*
588*4882a593Smuzhiyun      * Setup defaults for the display-wide attributes the framebuffer will
589*4882a593Smuzhiyun      * need.  These defaults should eventually be set globally, and not
590*4882a593Smuzhiyun      * dependent on the screens.
591*4882a593Smuzhiyun      */
592*4882a593Smuzhiyun     scrp->imageByteOrder = IMAGE_BYTE_ORDER;
593*4882a593Smuzhiyun     scrp->bitmapScanlinePad = BITMAP_SCANLINE_PAD;
594*4882a593Smuzhiyun     if (scrp->depth < 8) {
595*4882a593Smuzhiyun         /* Planar modes need these settings */
596*4882a593Smuzhiyun         scrp->bitmapScanlineUnit = 8;
597*4882a593Smuzhiyun         scrp->bitmapBitOrder = MSBFirst;
598*4882a593Smuzhiyun     }
599*4882a593Smuzhiyun     else {
600*4882a593Smuzhiyun         scrp->bitmapScanlineUnit = BITMAP_SCANLINE_UNIT;
601*4882a593Smuzhiyun         scrp->bitmapBitOrder = BITMAP_BIT_ORDER;
602*4882a593Smuzhiyun     }
603*4882a593Smuzhiyun 
604*4882a593Smuzhiyun     /*
605*4882a593Smuzhiyun      * If an unusual depth is required, add it to scrp->formats.  The formats
606*4882a593Smuzhiyun      * for the common depths are handled globally in InitOutput
607*4882a593Smuzhiyun      */
608*4882a593Smuzhiyun     switch (scrp->depth) {
609*4882a593Smuzhiyun     case 1:
610*4882a593Smuzhiyun     case 4:
611*4882a593Smuzhiyun     case 8:
612*4882a593Smuzhiyun     case 15:
613*4882a593Smuzhiyun     case 16:
614*4882a593Smuzhiyun     case 24:
615*4882a593Smuzhiyun         /* Common depths.  Nothing to do for them */
616*4882a593Smuzhiyun         break;
617*4882a593Smuzhiyun     default:
618*4882a593Smuzhiyun         if (!xf86AddPixFormat(scrp, scrp->depth, 0, 0)) {
619*4882a593Smuzhiyun             xf86DrvMsg(scrp->scrnIndex, X_ERROR,
620*4882a593Smuzhiyun                        "Can't add pixmap format for depth %d\n", scrp->depth);
621*4882a593Smuzhiyun             return FALSE;
622*4882a593Smuzhiyun         }
623*4882a593Smuzhiyun     }
624*4882a593Smuzhiyun 
625*4882a593Smuzhiyun     /* Initialise the framebuffer format for this screen */
626*4882a593Smuzhiyun     scrp->fbFormat.depth = scrp->depth;
627*4882a593Smuzhiyun     scrp->fbFormat.bitsPerPixel = scrp->bitsPerPixel;
628*4882a593Smuzhiyun     scrp->fbFormat.scanlinePad = BITMAP_SCANLINE_PAD;
629*4882a593Smuzhiyun 
630*4882a593Smuzhiyun     return TRUE;
631*4882a593Smuzhiyun }
632*4882a593Smuzhiyun 
633*4882a593Smuzhiyun /*
634*4882a593Smuzhiyun  * Print out the selected depth and bpp.
635*4882a593Smuzhiyun  */
636*4882a593Smuzhiyun void
xf86PrintDepthBpp(ScrnInfoPtr scrp)637*4882a593Smuzhiyun xf86PrintDepthBpp(ScrnInfoPtr scrp)
638*4882a593Smuzhiyun {
639*4882a593Smuzhiyun     xf86DrvMsg(scrp->scrnIndex, scrp->depthFrom, "Depth %d, ", scrp->depth);
640*4882a593Smuzhiyun     xf86Msg(scrp->bitsPerPixelFrom, "framebuffer bpp %d\n", scrp->bitsPerPixel);
641*4882a593Smuzhiyun }
642*4882a593Smuzhiyun 
643*4882a593Smuzhiyun /*
644*4882a593Smuzhiyun  * xf86SetWeight sets scrp->weight, scrp->mask, scrp->offset, and for depths
645*4882a593Smuzhiyun  * greater than MAX_PSEUDO_DEPTH also scrp->rgbBits.
646*4882a593Smuzhiyun  */
647*4882a593Smuzhiyun Bool
xf86SetWeight(ScrnInfoPtr scrp,rgb weight,rgb mask)648*4882a593Smuzhiyun xf86SetWeight(ScrnInfoPtr scrp, rgb weight, rgb mask)
649*4882a593Smuzhiyun {
650*4882a593Smuzhiyun     MessageType weightFrom = X_DEFAULT;
651*4882a593Smuzhiyun 
652*4882a593Smuzhiyun     scrp->weight.red = 0;
653*4882a593Smuzhiyun     scrp->weight.green = 0;
654*4882a593Smuzhiyun     scrp->weight.blue = 0;
655*4882a593Smuzhiyun 
656*4882a593Smuzhiyun     if (xf86Weight.red > 0 && xf86Weight.green > 0 && xf86Weight.blue > 0) {
657*4882a593Smuzhiyun         scrp->weight = xf86Weight;
658*4882a593Smuzhiyun         weightFrom = X_CMDLINE;
659*4882a593Smuzhiyun     }
660*4882a593Smuzhiyun     else if (scrp->display->weight.red > 0 && scrp->display->weight.green > 0
661*4882a593Smuzhiyun              && scrp->display->weight.blue > 0) {
662*4882a593Smuzhiyun         scrp->weight = scrp->display->weight;
663*4882a593Smuzhiyun         weightFrom = X_CONFIG;
664*4882a593Smuzhiyun     }
665*4882a593Smuzhiyun     else if (weight.red > 0 && weight.green > 0 && weight.blue > 0) {
666*4882a593Smuzhiyun         scrp->weight = weight;
667*4882a593Smuzhiyun     }
668*4882a593Smuzhiyun     else {
669*4882a593Smuzhiyun         switch (scrp->depth) {
670*4882a593Smuzhiyun         case 1:
671*4882a593Smuzhiyun         case 4:
672*4882a593Smuzhiyun         case 8:
673*4882a593Smuzhiyun             scrp->weight.red = scrp->weight.green =
674*4882a593Smuzhiyun                 scrp->weight.blue = scrp->rgbBits;
675*4882a593Smuzhiyun             break;
676*4882a593Smuzhiyun         case 15:
677*4882a593Smuzhiyun             scrp->weight.red = scrp->weight.green = scrp->weight.blue = 5;
678*4882a593Smuzhiyun             break;
679*4882a593Smuzhiyun         case 16:
680*4882a593Smuzhiyun             scrp->weight.red = scrp->weight.blue = 5;
681*4882a593Smuzhiyun             scrp->weight.green = 6;
682*4882a593Smuzhiyun             break;
683*4882a593Smuzhiyun         case 18:
684*4882a593Smuzhiyun             scrp->weight.red = scrp->weight.green = scrp->weight.blue = 6;
685*4882a593Smuzhiyun             break;
686*4882a593Smuzhiyun         case 24:
687*4882a593Smuzhiyun             scrp->weight.red = scrp->weight.green = scrp->weight.blue = 8;
688*4882a593Smuzhiyun             break;
689*4882a593Smuzhiyun         case 30:
690*4882a593Smuzhiyun             scrp->weight.red = scrp->weight.green = scrp->weight.blue = 10;
691*4882a593Smuzhiyun             break;
692*4882a593Smuzhiyun         }
693*4882a593Smuzhiyun     }
694*4882a593Smuzhiyun 
695*4882a593Smuzhiyun     if (scrp->weight.red)
696*4882a593Smuzhiyun         xf86DrvMsg(scrp->scrnIndex, weightFrom, "RGB weight %d%d%d\n",
697*4882a593Smuzhiyun                    (int) scrp->weight.red, (int) scrp->weight.green,
698*4882a593Smuzhiyun                    (int) scrp->weight.blue);
699*4882a593Smuzhiyun 
700*4882a593Smuzhiyun     if (scrp->depth > MAX_PSEUDO_DEPTH &&
701*4882a593Smuzhiyun         (scrp->depth != scrp->weight.red + scrp->weight.green +
702*4882a593Smuzhiyun          scrp->weight.blue)) {
703*4882a593Smuzhiyun         xf86DrvMsg(scrp->scrnIndex, X_ERROR,
704*4882a593Smuzhiyun                    "Weight given (%d%d%d) is inconsistent with the "
705*4882a593Smuzhiyun                    "depth (%d)\n",
706*4882a593Smuzhiyun                    (int) scrp->weight.red, (int) scrp->weight.green,
707*4882a593Smuzhiyun                    (int) scrp->weight.blue, scrp->depth);
708*4882a593Smuzhiyun         return FALSE;
709*4882a593Smuzhiyun     }
710*4882a593Smuzhiyun     if (scrp->depth > MAX_PSEUDO_DEPTH && scrp->weight.red) {
711*4882a593Smuzhiyun         /*
712*4882a593Smuzhiyun          * XXX Does this even mean anything for TrueColor visuals?
713*4882a593Smuzhiyun          * If not, we shouldn't even be setting it here.  However, this
714*4882a593Smuzhiyun          * matches the behaviour of 3.x versions of XFree86.
715*4882a593Smuzhiyun          */
716*4882a593Smuzhiyun         scrp->rgbBits = scrp->weight.red;
717*4882a593Smuzhiyun         if (scrp->weight.green > scrp->rgbBits)
718*4882a593Smuzhiyun             scrp->rgbBits = scrp->weight.green;
719*4882a593Smuzhiyun         if (scrp->weight.blue > scrp->rgbBits)
720*4882a593Smuzhiyun             scrp->rgbBits = scrp->weight.blue;
721*4882a593Smuzhiyun     }
722*4882a593Smuzhiyun 
723*4882a593Smuzhiyun     /* Set the mask and offsets */
724*4882a593Smuzhiyun     if (mask.red == 0 || mask.green == 0 || mask.blue == 0) {
725*4882a593Smuzhiyun         /* Default to a setting common to PC hardware */
726*4882a593Smuzhiyun         scrp->offset.red = scrp->weight.green + scrp->weight.blue;
727*4882a593Smuzhiyun         scrp->offset.green = scrp->weight.blue;
728*4882a593Smuzhiyun         scrp->offset.blue = 0;
729*4882a593Smuzhiyun         scrp->mask.red = ((1 << scrp->weight.red) - 1) << scrp->offset.red;
730*4882a593Smuzhiyun         scrp->mask.green = ((1 << scrp->weight.green) - 1)
731*4882a593Smuzhiyun             << scrp->offset.green;
732*4882a593Smuzhiyun         scrp->mask.blue = (1 << scrp->weight.blue) - 1;
733*4882a593Smuzhiyun     }
734*4882a593Smuzhiyun     else {
735*4882a593Smuzhiyun         /* Initialise to the values passed */
736*4882a593Smuzhiyun         scrp->mask.red = mask.red;
737*4882a593Smuzhiyun         scrp->mask.green = mask.green;
738*4882a593Smuzhiyun         scrp->mask.blue = mask.blue;
739*4882a593Smuzhiyun         scrp->offset.red = ffs(mask.red);
740*4882a593Smuzhiyun         scrp->offset.green = ffs(mask.green);
741*4882a593Smuzhiyun         scrp->offset.blue = ffs(mask.blue);
742*4882a593Smuzhiyun     }
743*4882a593Smuzhiyun     return TRUE;
744*4882a593Smuzhiyun }
745*4882a593Smuzhiyun 
746*4882a593Smuzhiyun Bool
xf86SetDefaultVisual(ScrnInfoPtr scrp,int visual)747*4882a593Smuzhiyun xf86SetDefaultVisual(ScrnInfoPtr scrp, int visual)
748*4882a593Smuzhiyun {
749*4882a593Smuzhiyun     MessageType visualFrom = X_DEFAULT;
750*4882a593Smuzhiyun 
751*4882a593Smuzhiyun     if (defaultColorVisualClass >= 0) {
752*4882a593Smuzhiyun         scrp->defaultVisual = defaultColorVisualClass;
753*4882a593Smuzhiyun         visualFrom = X_CMDLINE;
754*4882a593Smuzhiyun     }
755*4882a593Smuzhiyun     else if (scrp->display->defaultVisual >= 0) {
756*4882a593Smuzhiyun         scrp->defaultVisual = scrp->display->defaultVisual;
757*4882a593Smuzhiyun         visualFrom = X_CONFIG;
758*4882a593Smuzhiyun     }
759*4882a593Smuzhiyun     else if (visual >= 0) {
760*4882a593Smuzhiyun         scrp->defaultVisual = visual;
761*4882a593Smuzhiyun     }
762*4882a593Smuzhiyun     else {
763*4882a593Smuzhiyun         if (scrp->depth == 1)
764*4882a593Smuzhiyun             scrp->defaultVisual = StaticGray;
765*4882a593Smuzhiyun         else if (scrp->depth == 4)
766*4882a593Smuzhiyun             scrp->defaultVisual = StaticColor;
767*4882a593Smuzhiyun         else if (scrp->depth <= MAX_PSEUDO_DEPTH)
768*4882a593Smuzhiyun             scrp->defaultVisual = PseudoColor;
769*4882a593Smuzhiyun         else
770*4882a593Smuzhiyun             scrp->defaultVisual = TrueColor;
771*4882a593Smuzhiyun     }
772*4882a593Smuzhiyun     switch (scrp->defaultVisual) {
773*4882a593Smuzhiyun     case StaticGray:
774*4882a593Smuzhiyun     case GrayScale:
775*4882a593Smuzhiyun     case StaticColor:
776*4882a593Smuzhiyun     case PseudoColor:
777*4882a593Smuzhiyun     case TrueColor:
778*4882a593Smuzhiyun     case DirectColor:
779*4882a593Smuzhiyun         xf86DrvMsg(scrp->scrnIndex, visualFrom, "Default visual is %s\n",
780*4882a593Smuzhiyun                    xf86VisualNames[scrp->defaultVisual]);
781*4882a593Smuzhiyun         return TRUE;
782*4882a593Smuzhiyun     default:
783*4882a593Smuzhiyun 
784*4882a593Smuzhiyun         xf86DrvMsg(scrp->scrnIndex, X_ERROR,
785*4882a593Smuzhiyun                    "Invalid default visual class (%d)\n", scrp->defaultVisual);
786*4882a593Smuzhiyun         return FALSE;
787*4882a593Smuzhiyun     }
788*4882a593Smuzhiyun }
789*4882a593Smuzhiyun 
790*4882a593Smuzhiyun #define TEST_GAMMA(g) \
791*4882a593Smuzhiyun 	(g).red > GAMMA_ZERO || (g).green > GAMMA_ZERO || (g).blue > GAMMA_ZERO
792*4882a593Smuzhiyun 
793*4882a593Smuzhiyun #define SET_GAMMA(g) \
794*4882a593Smuzhiyun 	(g) > GAMMA_ZERO ? (g) : 1.0
795*4882a593Smuzhiyun 
796*4882a593Smuzhiyun Bool
xf86SetGamma(ScrnInfoPtr scrp,Gamma gamma)797*4882a593Smuzhiyun xf86SetGamma(ScrnInfoPtr scrp, Gamma gamma)
798*4882a593Smuzhiyun {
799*4882a593Smuzhiyun     MessageType from = X_DEFAULT;
800*4882a593Smuzhiyun 
801*4882a593Smuzhiyun #if 0
802*4882a593Smuzhiyun     xf86MonPtr DDC = (xf86MonPtr) (scrp->monitor->DDC);
803*4882a593Smuzhiyun #endif
804*4882a593Smuzhiyun     if (TEST_GAMMA(xf86Gamma)) {
805*4882a593Smuzhiyun         from = X_CMDLINE;
806*4882a593Smuzhiyun         scrp->gamma.red = SET_GAMMA(xf86Gamma.red);
807*4882a593Smuzhiyun         scrp->gamma.green = SET_GAMMA(xf86Gamma.green);
808*4882a593Smuzhiyun         scrp->gamma.blue = SET_GAMMA(xf86Gamma.blue);
809*4882a593Smuzhiyun     }
810*4882a593Smuzhiyun     else if (TEST_GAMMA(scrp->monitor->gamma)) {
811*4882a593Smuzhiyun         from = X_CONFIG;
812*4882a593Smuzhiyun         scrp->gamma.red = SET_GAMMA(scrp->monitor->gamma.red);
813*4882a593Smuzhiyun         scrp->gamma.green = SET_GAMMA(scrp->monitor->gamma.green);
814*4882a593Smuzhiyun         scrp->gamma.blue = SET_GAMMA(scrp->monitor->gamma.blue);
815*4882a593Smuzhiyun #if 0
816*4882a593Smuzhiyun     }
817*4882a593Smuzhiyun     else if (DDC && DDC->features.gamma > GAMMA_ZERO) {
818*4882a593Smuzhiyun         from = X_PROBED;
819*4882a593Smuzhiyun         scrp->gamma.red = SET_GAMMA(DDC->features.gamma);
820*4882a593Smuzhiyun         scrp->gamma.green = SET_GAMMA(DDC->features.gamma);
821*4882a593Smuzhiyun         scrp->gamma.blue = SET_GAMMA(DDC->features.gamma);
822*4882a593Smuzhiyun         /* EDID structure version 2 gives optional seperate red, green & blue gamma values
823*4882a593Smuzhiyun          * in bytes 0x57-0x59 */
824*4882a593Smuzhiyun #endif
825*4882a593Smuzhiyun     }
826*4882a593Smuzhiyun     else if (TEST_GAMMA(gamma)) {
827*4882a593Smuzhiyun         scrp->gamma.red = SET_GAMMA(gamma.red);
828*4882a593Smuzhiyun         scrp->gamma.green = SET_GAMMA(gamma.green);
829*4882a593Smuzhiyun         scrp->gamma.blue = SET_GAMMA(gamma.blue);
830*4882a593Smuzhiyun     }
831*4882a593Smuzhiyun     else {
832*4882a593Smuzhiyun         scrp->gamma.red = 1.0;
833*4882a593Smuzhiyun         scrp->gamma.green = 1.0;
834*4882a593Smuzhiyun         scrp->gamma.blue = 1.0;
835*4882a593Smuzhiyun     }
836*4882a593Smuzhiyun 
837*4882a593Smuzhiyun     xf86DrvMsg(scrp->scrnIndex, from,
838*4882a593Smuzhiyun                "Using gamma correction (%.1f, %.1f, %.1f)\n",
839*4882a593Smuzhiyun                scrp->gamma.red, scrp->gamma.green, scrp->gamma.blue);
840*4882a593Smuzhiyun 
841*4882a593Smuzhiyun     return TRUE;
842*4882a593Smuzhiyun }
843*4882a593Smuzhiyun 
844*4882a593Smuzhiyun #undef TEST_GAMMA
845*4882a593Smuzhiyun #undef SET_GAMMA
846*4882a593Smuzhiyun 
847*4882a593Smuzhiyun /*
848*4882a593Smuzhiyun  * Set the DPI from the command line option.  XXX should allow it to be
849*4882a593Smuzhiyun  * calculated from the widthmm/heightmm values.
850*4882a593Smuzhiyun  */
851*4882a593Smuzhiyun 
852*4882a593Smuzhiyun #undef MMPERINCH
853*4882a593Smuzhiyun #define MMPERINCH 25.4
854*4882a593Smuzhiyun 
855*4882a593Smuzhiyun void
xf86SetDpi(ScrnInfoPtr pScrn,int x,int y)856*4882a593Smuzhiyun xf86SetDpi(ScrnInfoPtr pScrn, int x, int y)
857*4882a593Smuzhiyun {
858*4882a593Smuzhiyun     MessageType from = X_DEFAULT;
859*4882a593Smuzhiyun     xf86MonPtr DDC = (xf86MonPtr) (pScrn->monitor->DDC);
860*4882a593Smuzhiyun     int ddcWidthmm, ddcHeightmm;
861*4882a593Smuzhiyun     int widthErr, heightErr;
862*4882a593Smuzhiyun 
863*4882a593Smuzhiyun     /* XXX Maybe there is no need for widthmm/heightmm in ScrnInfoRec */
864*4882a593Smuzhiyun     pScrn->widthmm = pScrn->monitor->widthmm;
865*4882a593Smuzhiyun     pScrn->heightmm = pScrn->monitor->heightmm;
866*4882a593Smuzhiyun 
867*4882a593Smuzhiyun     if (DDC && (DDC->features.hsize > 0 && DDC->features.vsize > 0)) {
868*4882a593Smuzhiyun         /* DDC gives display size in mm for individual modes,
869*4882a593Smuzhiyun          * but cm for monitor
870*4882a593Smuzhiyun          */
871*4882a593Smuzhiyun         ddcWidthmm = DDC->features.hsize * 10;  /* 10mm in 1cm */
872*4882a593Smuzhiyun         ddcHeightmm = DDC->features.vsize * 10; /* 10mm in 1cm */
873*4882a593Smuzhiyun     }
874*4882a593Smuzhiyun     else {
875*4882a593Smuzhiyun         ddcWidthmm = ddcHeightmm = 0;
876*4882a593Smuzhiyun     }
877*4882a593Smuzhiyun 
878*4882a593Smuzhiyun     if (monitorResolution > 0) {
879*4882a593Smuzhiyun         pScrn->xDpi = monitorResolution;
880*4882a593Smuzhiyun         pScrn->yDpi = monitorResolution;
881*4882a593Smuzhiyun         from = X_CMDLINE;
882*4882a593Smuzhiyun     }
883*4882a593Smuzhiyun     else if (pScrn->widthmm > 0 || pScrn->heightmm > 0) {
884*4882a593Smuzhiyun         from = X_CONFIG;
885*4882a593Smuzhiyun         if (pScrn->widthmm > 0) {
886*4882a593Smuzhiyun             pScrn->xDpi =
887*4882a593Smuzhiyun                 (int) ((double) pScrn->virtualX * MMPERINCH / pScrn->widthmm);
888*4882a593Smuzhiyun         }
889*4882a593Smuzhiyun         if (pScrn->heightmm > 0) {
890*4882a593Smuzhiyun             pScrn->yDpi =
891*4882a593Smuzhiyun                 (int) ((double) pScrn->virtualY * MMPERINCH / pScrn->heightmm);
892*4882a593Smuzhiyun         }
893*4882a593Smuzhiyun         if (pScrn->xDpi > 0 && pScrn->yDpi <= 0)
894*4882a593Smuzhiyun             pScrn->yDpi = pScrn->xDpi;
895*4882a593Smuzhiyun         if (pScrn->yDpi > 0 && pScrn->xDpi <= 0)
896*4882a593Smuzhiyun             pScrn->xDpi = pScrn->yDpi;
897*4882a593Smuzhiyun         xf86DrvMsg(pScrn->scrnIndex, from, "Display dimensions: (%d, %d) mm\n",
898*4882a593Smuzhiyun                    pScrn->widthmm, pScrn->heightmm);
899*4882a593Smuzhiyun 
900*4882a593Smuzhiyun         /* Warn if config and probe disagree about display size */
901*4882a593Smuzhiyun         if (ddcWidthmm && ddcHeightmm) {
902*4882a593Smuzhiyun             if (pScrn->widthmm > 0) {
903*4882a593Smuzhiyun                 widthErr = abs(ddcWidthmm - pScrn->widthmm);
904*4882a593Smuzhiyun             }
905*4882a593Smuzhiyun             else {
906*4882a593Smuzhiyun                 widthErr = 0;
907*4882a593Smuzhiyun             }
908*4882a593Smuzhiyun             if (pScrn->heightmm > 0) {
909*4882a593Smuzhiyun                 heightErr = abs(ddcHeightmm - pScrn->heightmm);
910*4882a593Smuzhiyun             }
911*4882a593Smuzhiyun             else {
912*4882a593Smuzhiyun                 heightErr = 0;
913*4882a593Smuzhiyun             }
914*4882a593Smuzhiyun             if (widthErr > 10 || heightErr > 10) {
915*4882a593Smuzhiyun                 /* Should include config file name for monitor here */
916*4882a593Smuzhiyun                 xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
917*4882a593Smuzhiyun                            "Probed monitor is %dx%d mm, using Displaysize %dx%d mm\n",
918*4882a593Smuzhiyun                            ddcWidthmm, ddcHeightmm, pScrn->widthmm,
919*4882a593Smuzhiyun                            pScrn->heightmm);
920*4882a593Smuzhiyun             }
921*4882a593Smuzhiyun         }
922*4882a593Smuzhiyun     }
923*4882a593Smuzhiyun     else if (ddcWidthmm && ddcHeightmm) {
924*4882a593Smuzhiyun         from = X_PROBED;
925*4882a593Smuzhiyun         xf86DrvMsg(pScrn->scrnIndex, from, "Display dimensions: (%d, %d) mm\n",
926*4882a593Smuzhiyun                    ddcWidthmm, ddcHeightmm);
927*4882a593Smuzhiyun         pScrn->widthmm = ddcWidthmm;
928*4882a593Smuzhiyun         pScrn->heightmm = ddcHeightmm;
929*4882a593Smuzhiyun         if (pScrn->widthmm > 0) {
930*4882a593Smuzhiyun             pScrn->xDpi =
931*4882a593Smuzhiyun                 (int) ((double) pScrn->virtualX * MMPERINCH / pScrn->widthmm);
932*4882a593Smuzhiyun         }
933*4882a593Smuzhiyun         if (pScrn->heightmm > 0) {
934*4882a593Smuzhiyun             pScrn->yDpi =
935*4882a593Smuzhiyun                 (int) ((double) pScrn->virtualY * MMPERINCH / pScrn->heightmm);
936*4882a593Smuzhiyun         }
937*4882a593Smuzhiyun         if (pScrn->xDpi > 0 && pScrn->yDpi <= 0)
938*4882a593Smuzhiyun             pScrn->yDpi = pScrn->xDpi;
939*4882a593Smuzhiyun         if (pScrn->yDpi > 0 && pScrn->xDpi <= 0)
940*4882a593Smuzhiyun             pScrn->xDpi = pScrn->yDpi;
941*4882a593Smuzhiyun     }
942*4882a593Smuzhiyun     else {
943*4882a593Smuzhiyun         if (x > 0)
944*4882a593Smuzhiyun             pScrn->xDpi = x;
945*4882a593Smuzhiyun         else
946*4882a593Smuzhiyun             pScrn->xDpi = DEFAULT_DPI;
947*4882a593Smuzhiyun         if (y > 0)
948*4882a593Smuzhiyun             pScrn->yDpi = y;
949*4882a593Smuzhiyun         else
950*4882a593Smuzhiyun             pScrn->yDpi = DEFAULT_DPI;
951*4882a593Smuzhiyun     }
952*4882a593Smuzhiyun     xf86DrvMsg(pScrn->scrnIndex, from, "DPI set to (%d, %d)\n",
953*4882a593Smuzhiyun                pScrn->xDpi, pScrn->yDpi);
954*4882a593Smuzhiyun }
955*4882a593Smuzhiyun 
956*4882a593Smuzhiyun #undef MMPERINCH
957*4882a593Smuzhiyun 
958*4882a593Smuzhiyun void
xf86SetBlackWhitePixels(ScreenPtr pScreen)959*4882a593Smuzhiyun xf86SetBlackWhitePixels(ScreenPtr pScreen)
960*4882a593Smuzhiyun {
961*4882a593Smuzhiyun     if (xf86FlipPixels) {
962*4882a593Smuzhiyun         pScreen->whitePixel = 0;
963*4882a593Smuzhiyun         pScreen->blackPixel = 1;
964*4882a593Smuzhiyun     }
965*4882a593Smuzhiyun     else {
966*4882a593Smuzhiyun         pScreen->whitePixel = 1;
967*4882a593Smuzhiyun         pScreen->blackPixel = 0;
968*4882a593Smuzhiyun     }
969*4882a593Smuzhiyun }
970*4882a593Smuzhiyun 
971*4882a593Smuzhiyun /*
972*4882a593Smuzhiyun  * Function to enable/disable access to the frame buffer
973*4882a593Smuzhiyun  *
974*4882a593Smuzhiyun  * This is used when VT switching and when entering/leaving DGA direct mode.
975*4882a593Smuzhiyun  *
976*4882a593Smuzhiyun  * This has been rewritten again to eliminate the saved pixmap.  The
977*4882a593Smuzhiyun  * devPrivate field in the screen pixmap is set to NULL to catch code
978*4882a593Smuzhiyun  * accidentally referencing the frame buffer while the X server is not
979*4882a593Smuzhiyun  * supposed to touch it.
980*4882a593Smuzhiyun  *
981*4882a593Smuzhiyun  * Here, we exchange the pixmap private data, rather than the pixmaps
982*4882a593Smuzhiyun  * themselves to avoid having to find and change any references to the screen
983*4882a593Smuzhiyun  * pixmap such as GC's, window privates etc.  This also means that this code
984*4882a593Smuzhiyun  * does not need to know exactly how the pixmap pixels are accessed.  Further,
985*4882a593Smuzhiyun  * this exchange is >not< done through the screen's ModifyPixmapHeader()
986*4882a593Smuzhiyun  * vector.  This means the called frame buffer code layers can determine
987*4882a593Smuzhiyun  * whether they are switched in or out by keeping track of the root pixmap's
988*4882a593Smuzhiyun  * private data, and therefore don't need to access pScrnInfo->vtSema.
989*4882a593Smuzhiyun  */
990*4882a593Smuzhiyun void
xf86EnableDisableFBAccess(ScrnInfoPtr pScrnInfo,Bool enable)991*4882a593Smuzhiyun xf86EnableDisableFBAccess(ScrnInfoPtr pScrnInfo, Bool enable)
992*4882a593Smuzhiyun {
993*4882a593Smuzhiyun     ScreenPtr pScreen = pScrnInfo->pScreen;
994*4882a593Smuzhiyun 
995*4882a593Smuzhiyun     if (enable) {
996*4882a593Smuzhiyun         /*
997*4882a593Smuzhiyun          * Restore all of the clip lists on the screen
998*4882a593Smuzhiyun          */
999*4882a593Smuzhiyun         if (!xf86Resetting)
1000*4882a593Smuzhiyun             SetRootClip(pScreen, ROOT_CLIP_FULL);
1001*4882a593Smuzhiyun 
1002*4882a593Smuzhiyun     }
1003*4882a593Smuzhiyun     else {
1004*4882a593Smuzhiyun         /*
1005*4882a593Smuzhiyun          * Empty all of the clip lists on the screen
1006*4882a593Smuzhiyun          */
1007*4882a593Smuzhiyun         SetRootClip(pScreen, ROOT_CLIP_NONE);
1008*4882a593Smuzhiyun     }
1009*4882a593Smuzhiyun }
1010*4882a593Smuzhiyun 
1011*4882a593Smuzhiyun /* Print driver messages in the standard format of
1012*4882a593Smuzhiyun    (<type>) <screen name>(<screen index>): <message> */
1013*4882a593Smuzhiyun void
xf86VDrvMsgVerb(int scrnIndex,MessageType type,int verb,const char * format,va_list args)1014*4882a593Smuzhiyun xf86VDrvMsgVerb(int scrnIndex, MessageType type, int verb, const char *format,
1015*4882a593Smuzhiyun                 va_list args)
1016*4882a593Smuzhiyun {
1017*4882a593Smuzhiyun     /* Prefix the scrnIndex name to the format string. */
1018*4882a593Smuzhiyun     if (scrnIndex >= 0 && scrnIndex < xf86NumScreens &&
1019*4882a593Smuzhiyun         xf86Screens[scrnIndex]->name)
1020*4882a593Smuzhiyun         LogHdrMessageVerb(type, verb, format, args, "%s(%d): ",
1021*4882a593Smuzhiyun                           xf86Screens[scrnIndex]->name, scrnIndex);
1022*4882a593Smuzhiyun     else if (scrnIndex >= GPU_SCREEN_OFFSET &&
1023*4882a593Smuzhiyun              scrnIndex < GPU_SCREEN_OFFSET + xf86NumGPUScreens &&
1024*4882a593Smuzhiyun              xf86GPUScreens[scrnIndex - GPU_SCREEN_OFFSET]->name)
1025*4882a593Smuzhiyun         LogHdrMessageVerb(type, verb, format, args, "%s(G%d): ",
1026*4882a593Smuzhiyun                           xf86GPUScreens[scrnIndex - GPU_SCREEN_OFFSET]->name, scrnIndex - GPU_SCREEN_OFFSET);
1027*4882a593Smuzhiyun     else
1028*4882a593Smuzhiyun         LogVMessageVerb(type, verb, format, args);
1029*4882a593Smuzhiyun }
1030*4882a593Smuzhiyun 
1031*4882a593Smuzhiyun /* Print driver messages, with verbose level specified directly */
1032*4882a593Smuzhiyun void
xf86DrvMsgVerb(int scrnIndex,MessageType type,int verb,const char * format,...)1033*4882a593Smuzhiyun xf86DrvMsgVerb(int scrnIndex, MessageType type, int verb, const char *format,
1034*4882a593Smuzhiyun                ...)
1035*4882a593Smuzhiyun {
1036*4882a593Smuzhiyun     va_list ap;
1037*4882a593Smuzhiyun 
1038*4882a593Smuzhiyun     va_start(ap, format);
1039*4882a593Smuzhiyun     xf86VDrvMsgVerb(scrnIndex, type, verb, format, ap);
1040*4882a593Smuzhiyun     va_end(ap);
1041*4882a593Smuzhiyun }
1042*4882a593Smuzhiyun 
1043*4882a593Smuzhiyun /* Print driver messages, with verbose level of 1 (default) */
1044*4882a593Smuzhiyun void
xf86DrvMsg(int scrnIndex,MessageType type,const char * format,...)1045*4882a593Smuzhiyun xf86DrvMsg(int scrnIndex, MessageType type, const char *format, ...)
1046*4882a593Smuzhiyun {
1047*4882a593Smuzhiyun     va_list ap;
1048*4882a593Smuzhiyun 
1049*4882a593Smuzhiyun     va_start(ap, format);
1050*4882a593Smuzhiyun     xf86VDrvMsgVerb(scrnIndex, type, 1, format, ap);
1051*4882a593Smuzhiyun     va_end(ap);
1052*4882a593Smuzhiyun }
1053*4882a593Smuzhiyun 
1054*4882a593Smuzhiyun /* Print input driver messages in the standard format of
1055*4882a593Smuzhiyun    (<type>) <driver>: <device name>: <message> */
1056*4882a593Smuzhiyun void
xf86VIDrvMsgVerb(InputInfoPtr dev,MessageType type,int verb,const char * format,va_list args)1057*4882a593Smuzhiyun xf86VIDrvMsgVerb(InputInfoPtr dev, MessageType type, int verb,
1058*4882a593Smuzhiyun                  const char *format, va_list args)
1059*4882a593Smuzhiyun {
1060*4882a593Smuzhiyun     const char *driverName = NULL;
1061*4882a593Smuzhiyun     const char *deviceName = NULL;
1062*4882a593Smuzhiyun 
1063*4882a593Smuzhiyun     /* Prefix driver and device names to formatted message. */
1064*4882a593Smuzhiyun     if (dev) {
1065*4882a593Smuzhiyun         deviceName = dev->name;
1066*4882a593Smuzhiyun         if (dev->drv)
1067*4882a593Smuzhiyun             driverName = dev->drv->driverName;
1068*4882a593Smuzhiyun     }
1069*4882a593Smuzhiyun 
1070*4882a593Smuzhiyun     LogHdrMessageVerb(type, verb, format, args, "%s: %s: ", driverName,
1071*4882a593Smuzhiyun                       deviceName);
1072*4882a593Smuzhiyun }
1073*4882a593Smuzhiyun 
1074*4882a593Smuzhiyun /* Print input driver message, with verbose level specified directly */
1075*4882a593Smuzhiyun void
xf86IDrvMsgVerb(InputInfoPtr dev,MessageType type,int verb,const char * format,...)1076*4882a593Smuzhiyun xf86IDrvMsgVerb(InputInfoPtr dev, MessageType type, int verb,
1077*4882a593Smuzhiyun                 const char *format, ...)
1078*4882a593Smuzhiyun {
1079*4882a593Smuzhiyun     va_list ap;
1080*4882a593Smuzhiyun 
1081*4882a593Smuzhiyun     va_start(ap, format);
1082*4882a593Smuzhiyun     xf86VIDrvMsgVerb(dev, type, verb, format, ap);
1083*4882a593Smuzhiyun     va_end(ap);
1084*4882a593Smuzhiyun }
1085*4882a593Smuzhiyun 
1086*4882a593Smuzhiyun /* Print input driver messages, with verbose level of 1 (default) */
1087*4882a593Smuzhiyun void
xf86IDrvMsg(InputInfoPtr dev,MessageType type,const char * format,...)1088*4882a593Smuzhiyun xf86IDrvMsg(InputInfoPtr dev, MessageType type, const char *format, ...)
1089*4882a593Smuzhiyun {
1090*4882a593Smuzhiyun     va_list ap;
1091*4882a593Smuzhiyun 
1092*4882a593Smuzhiyun     va_start(ap, format);
1093*4882a593Smuzhiyun     xf86VIDrvMsgVerb(dev, type, 1, format, ap);
1094*4882a593Smuzhiyun     va_end(ap);
1095*4882a593Smuzhiyun }
1096*4882a593Smuzhiyun 
1097*4882a593Smuzhiyun /* Print non-driver messages with verbose level specified directly */
1098*4882a593Smuzhiyun void
xf86MsgVerb(MessageType type,int verb,const char * format,...)1099*4882a593Smuzhiyun xf86MsgVerb(MessageType type, int verb, const char *format, ...)
1100*4882a593Smuzhiyun {
1101*4882a593Smuzhiyun     va_list ap;
1102*4882a593Smuzhiyun 
1103*4882a593Smuzhiyun     va_start(ap, format);
1104*4882a593Smuzhiyun     LogVMessageVerb(type, verb, format, ap);
1105*4882a593Smuzhiyun     va_end(ap);
1106*4882a593Smuzhiyun }
1107*4882a593Smuzhiyun 
1108*4882a593Smuzhiyun /* Print non-driver messages with verbose level of 1 (default) */
1109*4882a593Smuzhiyun void
xf86Msg(MessageType type,const char * format,...)1110*4882a593Smuzhiyun xf86Msg(MessageType type, const char *format, ...)
1111*4882a593Smuzhiyun {
1112*4882a593Smuzhiyun     va_list ap;
1113*4882a593Smuzhiyun 
1114*4882a593Smuzhiyun     va_start(ap, format);
1115*4882a593Smuzhiyun     LogVMessageVerb(type, 1, format, ap);
1116*4882a593Smuzhiyun     va_end(ap);
1117*4882a593Smuzhiyun }
1118*4882a593Smuzhiyun 
1119*4882a593Smuzhiyun /* Just like ErrorF, but with the verbose level checked */
1120*4882a593Smuzhiyun void
xf86ErrorFVerb(int verb,const char * format,...)1121*4882a593Smuzhiyun xf86ErrorFVerb(int verb, const char *format, ...)
1122*4882a593Smuzhiyun {
1123*4882a593Smuzhiyun     va_list ap;
1124*4882a593Smuzhiyun 
1125*4882a593Smuzhiyun     va_start(ap, format);
1126*4882a593Smuzhiyun     if (xf86Verbose >= verb || xf86LogVerbose >= verb)
1127*4882a593Smuzhiyun         LogVWrite(verb, format, ap);
1128*4882a593Smuzhiyun     va_end(ap);
1129*4882a593Smuzhiyun }
1130*4882a593Smuzhiyun 
1131*4882a593Smuzhiyun /* Like xf86ErrorFVerb, but with an implied verbose level of 1 */
1132*4882a593Smuzhiyun void
xf86ErrorF(const char * format,...)1133*4882a593Smuzhiyun xf86ErrorF(const char *format, ...)
1134*4882a593Smuzhiyun {
1135*4882a593Smuzhiyun     va_list ap;
1136*4882a593Smuzhiyun 
1137*4882a593Smuzhiyun     va_start(ap, format);
1138*4882a593Smuzhiyun     if (xf86Verbose >= 1 || xf86LogVerbose >= 1)
1139*4882a593Smuzhiyun         LogVWrite(1, format, ap);
1140*4882a593Smuzhiyun     va_end(ap);
1141*4882a593Smuzhiyun }
1142*4882a593Smuzhiyun 
1143*4882a593Smuzhiyun /* Note temporarily modifies the passed in buffer! */
xf86_mkdir_p(char * path)1144*4882a593Smuzhiyun static void xf86_mkdir_p(char *path)
1145*4882a593Smuzhiyun {
1146*4882a593Smuzhiyun     char *sep = path;
1147*4882a593Smuzhiyun 
1148*4882a593Smuzhiyun     while ((sep = strchr(sep + 1, '/'))) {
1149*4882a593Smuzhiyun         *sep = 0;
1150*4882a593Smuzhiyun         (void)mkdir(path, 0777);
1151*4882a593Smuzhiyun         *sep = '/';
1152*4882a593Smuzhiyun     }
1153*4882a593Smuzhiyun     (void)mkdir(path, 0777);
1154*4882a593Smuzhiyun }
1155*4882a593Smuzhiyun 
1156*4882a593Smuzhiyun void
xf86LogInit(void)1157*4882a593Smuzhiyun xf86LogInit(void)
1158*4882a593Smuzhiyun {
1159*4882a593Smuzhiyun     char *env, *lf = NULL;
1160*4882a593Smuzhiyun     char buf[PATH_MAX];
1161*4882a593Smuzhiyun 
1162*4882a593Smuzhiyun #define LOGSUFFIX ".log"
1163*4882a593Smuzhiyun #define LOGOLDSUFFIX ".old"
1164*4882a593Smuzhiyun 
1165*4882a593Smuzhiyun     /* Get the log file name */
1166*4882a593Smuzhiyun     if (xf86LogFileFrom == X_DEFAULT) {
1167*4882a593Smuzhiyun         /* When not running as root, we won't be able to write to /var/log */
1168*4882a593Smuzhiyun         if (geteuid() != 0) {
1169*4882a593Smuzhiyun             if ((env = getenv("XDG_DATA_HOME")))
1170*4882a593Smuzhiyun                 snprintf(buf, sizeof(buf), "%s/%s", env,
1171*4882a593Smuzhiyun                          DEFAULT_XDG_DATA_HOME_LOGDIR);
1172*4882a593Smuzhiyun             else if ((env = getenv("HOME")))
1173*4882a593Smuzhiyun                 snprintf(buf, sizeof(buf), "%s/%s/%s", env,
1174*4882a593Smuzhiyun                          DEFAULT_XDG_DATA_HOME, DEFAULT_XDG_DATA_HOME_LOGDIR);
1175*4882a593Smuzhiyun 
1176*4882a593Smuzhiyun             if (env) {
1177*4882a593Smuzhiyun                 xf86_mkdir_p(buf);
1178*4882a593Smuzhiyun                 strlcat(buf, "/" DEFAULT_LOGPREFIX, sizeof(buf));
1179*4882a593Smuzhiyun                 xf86LogFile = buf;
1180*4882a593Smuzhiyun             }
1181*4882a593Smuzhiyun         }
1182*4882a593Smuzhiyun         /* Append the display number and ".log" */
1183*4882a593Smuzhiyun         if (asprintf(&lf, "%s%%s" LOGSUFFIX, xf86LogFile) == -1)
1184*4882a593Smuzhiyun             FatalError("Cannot allocate space for the log file name\n");
1185*4882a593Smuzhiyun         xf86LogFile = lf;
1186*4882a593Smuzhiyun     }
1187*4882a593Smuzhiyun 
1188*4882a593Smuzhiyun     xf86LogFile = LogInit(xf86LogFile, LOGOLDSUFFIX);
1189*4882a593Smuzhiyun     xf86LogFileWasOpened = TRUE;
1190*4882a593Smuzhiyun 
1191*4882a593Smuzhiyun     xf86SetVerbosity(xf86Verbose);
1192*4882a593Smuzhiyun     xf86SetLogVerbosity(xf86LogVerbose);
1193*4882a593Smuzhiyun 
1194*4882a593Smuzhiyun #undef LOGSUFFIX
1195*4882a593Smuzhiyun #undef LOGOLDSUFFIX
1196*4882a593Smuzhiyun 
1197*4882a593Smuzhiyun     free(lf);
1198*4882a593Smuzhiyun }
1199*4882a593Smuzhiyun 
1200*4882a593Smuzhiyun void
xf86CloseLog(enum ExitCode error)1201*4882a593Smuzhiyun xf86CloseLog(enum ExitCode error)
1202*4882a593Smuzhiyun {
1203*4882a593Smuzhiyun     LogClose(error);
1204*4882a593Smuzhiyun }
1205*4882a593Smuzhiyun 
1206*4882a593Smuzhiyun /*
1207*4882a593Smuzhiyun  * Drivers can use these for using their own SymTabRecs.
1208*4882a593Smuzhiyun  */
1209*4882a593Smuzhiyun 
1210*4882a593Smuzhiyun const char *
xf86TokenToString(SymTabPtr table,int token)1211*4882a593Smuzhiyun xf86TokenToString(SymTabPtr table, int token)
1212*4882a593Smuzhiyun {
1213*4882a593Smuzhiyun     int i;
1214*4882a593Smuzhiyun 
1215*4882a593Smuzhiyun     for (i = 0; table[i].token >= 0 && table[i].token != token; i++);
1216*4882a593Smuzhiyun 
1217*4882a593Smuzhiyun     if (table[i].token < 0)
1218*4882a593Smuzhiyun         return NULL;
1219*4882a593Smuzhiyun     else
1220*4882a593Smuzhiyun         return table[i].name;
1221*4882a593Smuzhiyun }
1222*4882a593Smuzhiyun 
1223*4882a593Smuzhiyun int
xf86StringToToken(SymTabPtr table,const char * string)1224*4882a593Smuzhiyun xf86StringToToken(SymTabPtr table, const char *string)
1225*4882a593Smuzhiyun {
1226*4882a593Smuzhiyun     int i;
1227*4882a593Smuzhiyun 
1228*4882a593Smuzhiyun     if (string == NULL)
1229*4882a593Smuzhiyun         return -1;
1230*4882a593Smuzhiyun 
1231*4882a593Smuzhiyun     for (i = 0; table[i].token >= 0 && xf86NameCmp(string, table[i].name); i++);
1232*4882a593Smuzhiyun 
1233*4882a593Smuzhiyun     return table[i].token;
1234*4882a593Smuzhiyun }
1235*4882a593Smuzhiyun 
1236*4882a593Smuzhiyun /*
1237*4882a593Smuzhiyun  * helper to display the clocks found on a card
1238*4882a593Smuzhiyun  */
1239*4882a593Smuzhiyun void
xf86ShowClocks(ScrnInfoPtr scrp,MessageType from)1240*4882a593Smuzhiyun xf86ShowClocks(ScrnInfoPtr scrp, MessageType from)
1241*4882a593Smuzhiyun {
1242*4882a593Smuzhiyun     int j;
1243*4882a593Smuzhiyun 
1244*4882a593Smuzhiyun     xf86DrvMsg(scrp->scrnIndex, from, "Pixel clocks available:");
1245*4882a593Smuzhiyun     for (j = 0; j < scrp->numClocks; j++) {
1246*4882a593Smuzhiyun         if ((j % 4) == 0) {
1247*4882a593Smuzhiyun             xf86ErrorF("\n");
1248*4882a593Smuzhiyun             xf86DrvMsg(scrp->scrnIndex, from, "pixel clocks:");
1249*4882a593Smuzhiyun         }
1250*4882a593Smuzhiyun         xf86ErrorF(" %7.3f", (double) scrp->clock[j] / 1000.0);
1251*4882a593Smuzhiyun     }
1252*4882a593Smuzhiyun     xf86ErrorF("\n");
1253*4882a593Smuzhiyun }
1254*4882a593Smuzhiyun 
1255*4882a593Smuzhiyun /*
1256*4882a593Smuzhiyun  * This prints out the driver identify message, including the names of
1257*4882a593Smuzhiyun  * the supported chipsets.
1258*4882a593Smuzhiyun  *
1259*4882a593Smuzhiyun  * XXX This makes assumptions about the line width, etc.  Maybe we could
1260*4882a593Smuzhiyun  * use a more general "pretty print" function for messages.
1261*4882a593Smuzhiyun  */
1262*4882a593Smuzhiyun void
xf86PrintChipsets(const char * drvname,const char * drvmsg,SymTabPtr chips)1263*4882a593Smuzhiyun xf86PrintChipsets(const char *drvname, const char *drvmsg, SymTabPtr chips)
1264*4882a593Smuzhiyun {
1265*4882a593Smuzhiyun     int len, i;
1266*4882a593Smuzhiyun 
1267*4882a593Smuzhiyun     len = 6 + strlen(drvname) + 2 + strlen(drvmsg) + 2;
1268*4882a593Smuzhiyun     xf86Msg(X_INFO, "%s: %s:", drvname, drvmsg);
1269*4882a593Smuzhiyun     for (i = 0; chips[i].name != NULL; i++) {
1270*4882a593Smuzhiyun         if (i != 0) {
1271*4882a593Smuzhiyun             xf86ErrorF(",");
1272*4882a593Smuzhiyun             len++;
1273*4882a593Smuzhiyun         }
1274*4882a593Smuzhiyun         if (len + 2 + strlen(chips[i].name) < 78) {
1275*4882a593Smuzhiyun             xf86ErrorF(" ");
1276*4882a593Smuzhiyun             len++;
1277*4882a593Smuzhiyun         }
1278*4882a593Smuzhiyun         else {
1279*4882a593Smuzhiyun             xf86ErrorF("\n\t");
1280*4882a593Smuzhiyun             len = 8;
1281*4882a593Smuzhiyun         }
1282*4882a593Smuzhiyun         xf86ErrorF("%s", chips[i].name);
1283*4882a593Smuzhiyun         len += strlen(chips[i].name);
1284*4882a593Smuzhiyun     }
1285*4882a593Smuzhiyun     xf86ErrorF("\n");
1286*4882a593Smuzhiyun }
1287*4882a593Smuzhiyun 
1288*4882a593Smuzhiyun int
xf86MatchDevice(const char * drivername,GDevPtr ** sectlist)1289*4882a593Smuzhiyun xf86MatchDevice(const char *drivername, GDevPtr ** sectlist)
1290*4882a593Smuzhiyun {
1291*4882a593Smuzhiyun     GDevPtr gdp, *pgdp = NULL;
1292*4882a593Smuzhiyun     confScreenPtr screensecptr;
1293*4882a593Smuzhiyun     int i, j, k;
1294*4882a593Smuzhiyun 
1295*4882a593Smuzhiyun     if (sectlist)
1296*4882a593Smuzhiyun         *sectlist = NULL;
1297*4882a593Smuzhiyun 
1298*4882a593Smuzhiyun     /*
1299*4882a593Smuzhiyun      * This can happen when running Xorg -showopts and a module like ati
1300*4882a593Smuzhiyun      * or vmware tries to load its submodules when xf86ConfigLayout is empty
1301*4882a593Smuzhiyun      */
1302*4882a593Smuzhiyun     if (!xf86ConfigLayout.screens)
1303*4882a593Smuzhiyun         return 0;
1304*4882a593Smuzhiyun 
1305*4882a593Smuzhiyun     /*
1306*4882a593Smuzhiyun      * This is a very important function that matches the device sections
1307*4882a593Smuzhiyun      * as they show up in the config file with the drivers that the server
1308*4882a593Smuzhiyun      * loads at run time.
1309*4882a593Smuzhiyun      *
1310*4882a593Smuzhiyun      * ChipProbe can call
1311*4882a593Smuzhiyun      * int xf86MatchDevice(char * drivername, GDevPtr ** sectlist)
1312*4882a593Smuzhiyun      * with its driver name. The function allocates an array of GDevPtr and
1313*4882a593Smuzhiyun      * returns this via sectlist and returns the number of elements in
1314*4882a593Smuzhiyun      * this list as return value. 0 means none found, -1 means fatal error.
1315*4882a593Smuzhiyun      *
1316*4882a593Smuzhiyun      * It can figure out which of the Device sections to use for which card
1317*4882a593Smuzhiyun      * (using things like the Card statement, etc). For single headed servers
1318*4882a593Smuzhiyun      * there will of course be just one such Device section.
1319*4882a593Smuzhiyun      */
1320*4882a593Smuzhiyun     i = 0;
1321*4882a593Smuzhiyun 
1322*4882a593Smuzhiyun     /*
1323*4882a593Smuzhiyun      * first we need to loop over all the Screens sections to get to all
1324*4882a593Smuzhiyun      * 'active' device sections
1325*4882a593Smuzhiyun      */
1326*4882a593Smuzhiyun     for (j = 0; xf86ConfigLayout.screens[j].screen != NULL; j++) {
1327*4882a593Smuzhiyun         screensecptr = xf86ConfigLayout.screens[j].screen;
1328*4882a593Smuzhiyun         if ((screensecptr->device->driver != NULL)
1329*4882a593Smuzhiyun             && (xf86NameCmp(screensecptr->device->driver, drivername) == 0)
1330*4882a593Smuzhiyun             && (!screensecptr->device->claimed)) {
1331*4882a593Smuzhiyun             /*
1332*4882a593Smuzhiyun              * we have a matching driver that wasn't claimed, yet
1333*4882a593Smuzhiyun              */
1334*4882a593Smuzhiyun             pgdp = xnfreallocarray(pgdp, i + 2, sizeof(GDevPtr));
1335*4882a593Smuzhiyun             pgdp[i++] = screensecptr->device;
1336*4882a593Smuzhiyun         }
1337*4882a593Smuzhiyun         for (k = 0; k < screensecptr->num_gpu_devices; k++) {
1338*4882a593Smuzhiyun             if ((screensecptr->gpu_devices[k]->driver != NULL)
1339*4882a593Smuzhiyun             && (xf86NameCmp(screensecptr->gpu_devices[k]->driver, drivername) == 0)
1340*4882a593Smuzhiyun                 && (!screensecptr->gpu_devices[k]->claimed)) {
1341*4882a593Smuzhiyun                 /*
1342*4882a593Smuzhiyun                  * we have a matching driver that wasn't claimed, yet
1343*4882a593Smuzhiyun                  */
1344*4882a593Smuzhiyun                 pgdp = xnfrealloc(pgdp, (i + 2) * sizeof(GDevPtr));
1345*4882a593Smuzhiyun                 pgdp[i++] = screensecptr->gpu_devices[k];
1346*4882a593Smuzhiyun             }
1347*4882a593Smuzhiyun         }
1348*4882a593Smuzhiyun     }
1349*4882a593Smuzhiyun 
1350*4882a593Smuzhiyun     /* Then handle the inactive devices */
1351*4882a593Smuzhiyun     j = 0;
1352*4882a593Smuzhiyun     while (xf86ConfigLayout.inactives[j].identifier) {
1353*4882a593Smuzhiyun         gdp = &xf86ConfigLayout.inactives[j];
1354*4882a593Smuzhiyun         if (gdp->driver && !gdp->claimed &&
1355*4882a593Smuzhiyun             !xf86NameCmp(gdp->driver, drivername)) {
1356*4882a593Smuzhiyun             /* we have a matching driver that wasn't claimed yet */
1357*4882a593Smuzhiyun             pgdp = xnfreallocarray(pgdp, i + 2, sizeof(GDevPtr));
1358*4882a593Smuzhiyun             pgdp[i++] = gdp;
1359*4882a593Smuzhiyun         }
1360*4882a593Smuzhiyun         j++;
1361*4882a593Smuzhiyun     }
1362*4882a593Smuzhiyun 
1363*4882a593Smuzhiyun     /*
1364*4882a593Smuzhiyun      * make the array NULL terminated and return its address
1365*4882a593Smuzhiyun      */
1366*4882a593Smuzhiyun     if (i)
1367*4882a593Smuzhiyun         pgdp[i] = NULL;
1368*4882a593Smuzhiyun 
1369*4882a593Smuzhiyun     if (sectlist)
1370*4882a593Smuzhiyun         *sectlist = pgdp;
1371*4882a593Smuzhiyun     else
1372*4882a593Smuzhiyun         free(pgdp);
1373*4882a593Smuzhiyun     return i;
1374*4882a593Smuzhiyun }
1375*4882a593Smuzhiyun 
1376*4882a593Smuzhiyun const char *
xf86GetVisualName(int visual)1377*4882a593Smuzhiyun xf86GetVisualName(int visual)
1378*4882a593Smuzhiyun {
1379*4882a593Smuzhiyun     if (visual < 0 || visual > DirectColor)
1380*4882a593Smuzhiyun         return NULL;
1381*4882a593Smuzhiyun 
1382*4882a593Smuzhiyun     return xf86VisualNames[visual];
1383*4882a593Smuzhiyun }
1384*4882a593Smuzhiyun 
1385*4882a593Smuzhiyun int
xf86GetVerbosity(void)1386*4882a593Smuzhiyun xf86GetVerbosity(void)
1387*4882a593Smuzhiyun {
1388*4882a593Smuzhiyun     return max(xf86Verbose, xf86LogVerbose);
1389*4882a593Smuzhiyun }
1390*4882a593Smuzhiyun 
1391*4882a593Smuzhiyun int
xf86GetDepth(void)1392*4882a593Smuzhiyun xf86GetDepth(void)
1393*4882a593Smuzhiyun {
1394*4882a593Smuzhiyun     return xf86Depth;
1395*4882a593Smuzhiyun }
1396*4882a593Smuzhiyun 
1397*4882a593Smuzhiyun rgb
xf86GetWeight(void)1398*4882a593Smuzhiyun xf86GetWeight(void)
1399*4882a593Smuzhiyun {
1400*4882a593Smuzhiyun     return xf86Weight;
1401*4882a593Smuzhiyun }
1402*4882a593Smuzhiyun 
1403*4882a593Smuzhiyun Gamma
xf86GetGamma(void)1404*4882a593Smuzhiyun xf86GetGamma(void)
1405*4882a593Smuzhiyun {
1406*4882a593Smuzhiyun     return xf86Gamma;
1407*4882a593Smuzhiyun }
1408*4882a593Smuzhiyun 
1409*4882a593Smuzhiyun Bool
xf86GetFlipPixels(void)1410*4882a593Smuzhiyun xf86GetFlipPixels(void)
1411*4882a593Smuzhiyun {
1412*4882a593Smuzhiyun     return xf86FlipPixels;
1413*4882a593Smuzhiyun }
1414*4882a593Smuzhiyun 
1415*4882a593Smuzhiyun const char *
xf86GetServerName(void)1416*4882a593Smuzhiyun xf86GetServerName(void)
1417*4882a593Smuzhiyun {
1418*4882a593Smuzhiyun     return xf86ServerName;
1419*4882a593Smuzhiyun }
1420*4882a593Smuzhiyun 
1421*4882a593Smuzhiyun Bool
xf86ServerIsExiting(void)1422*4882a593Smuzhiyun xf86ServerIsExiting(void)
1423*4882a593Smuzhiyun {
1424*4882a593Smuzhiyun     return (dispatchException & DE_TERMINATE) == DE_TERMINATE;
1425*4882a593Smuzhiyun }
1426*4882a593Smuzhiyun 
1427*4882a593Smuzhiyun Bool
xf86ServerIsResetting(void)1428*4882a593Smuzhiyun xf86ServerIsResetting(void)
1429*4882a593Smuzhiyun {
1430*4882a593Smuzhiyun     return xf86Resetting;
1431*4882a593Smuzhiyun }
1432*4882a593Smuzhiyun 
1433*4882a593Smuzhiyun Bool
xf86ServerIsOnlyDetecting(void)1434*4882a593Smuzhiyun xf86ServerIsOnlyDetecting(void)
1435*4882a593Smuzhiyun {
1436*4882a593Smuzhiyun     return xf86DoConfigure;
1437*4882a593Smuzhiyun }
1438*4882a593Smuzhiyun 
1439*4882a593Smuzhiyun Bool
xf86GetVidModeAllowNonLocal(void)1440*4882a593Smuzhiyun xf86GetVidModeAllowNonLocal(void)
1441*4882a593Smuzhiyun {
1442*4882a593Smuzhiyun     return xf86Info.vidModeAllowNonLocal;
1443*4882a593Smuzhiyun }
1444*4882a593Smuzhiyun 
1445*4882a593Smuzhiyun Bool
xf86GetVidModeEnabled(void)1446*4882a593Smuzhiyun xf86GetVidModeEnabled(void)
1447*4882a593Smuzhiyun {
1448*4882a593Smuzhiyun     return xf86Info.vidModeEnabled;
1449*4882a593Smuzhiyun }
1450*4882a593Smuzhiyun 
1451*4882a593Smuzhiyun Bool
xf86GetModInDevAllowNonLocal(void)1452*4882a593Smuzhiyun xf86GetModInDevAllowNonLocal(void)
1453*4882a593Smuzhiyun {
1454*4882a593Smuzhiyun     return xf86Info.miscModInDevAllowNonLocal;
1455*4882a593Smuzhiyun }
1456*4882a593Smuzhiyun 
1457*4882a593Smuzhiyun Bool
xf86GetModInDevEnabled(void)1458*4882a593Smuzhiyun xf86GetModInDevEnabled(void)
1459*4882a593Smuzhiyun {
1460*4882a593Smuzhiyun     return xf86Info.miscModInDevEnabled;
1461*4882a593Smuzhiyun }
1462*4882a593Smuzhiyun 
1463*4882a593Smuzhiyun Bool
xf86GetAllowMouseOpenFail(void)1464*4882a593Smuzhiyun xf86GetAllowMouseOpenFail(void)
1465*4882a593Smuzhiyun {
1466*4882a593Smuzhiyun     return xf86Info.allowMouseOpenFail;
1467*4882a593Smuzhiyun }
1468*4882a593Smuzhiyun 
1469*4882a593Smuzhiyun CARD32
xf86GetModuleVersion(void * module)1470*4882a593Smuzhiyun xf86GetModuleVersion(void *module)
1471*4882a593Smuzhiyun {
1472*4882a593Smuzhiyun     return (CARD32) LoaderGetModuleVersion(module);
1473*4882a593Smuzhiyun }
1474*4882a593Smuzhiyun 
1475*4882a593Smuzhiyun void *
xf86LoadDrvSubModule(DriverPtr drv,const char * name)1476*4882a593Smuzhiyun xf86LoadDrvSubModule(DriverPtr drv, const char *name)
1477*4882a593Smuzhiyun {
1478*4882a593Smuzhiyun     void *ret;
1479*4882a593Smuzhiyun     int errmaj = 0, errmin = 0;
1480*4882a593Smuzhiyun 
1481*4882a593Smuzhiyun     ret = LoadSubModule(drv->module, name, NULL, NULL, NULL, NULL,
1482*4882a593Smuzhiyun                         &errmaj, &errmin);
1483*4882a593Smuzhiyun     if (!ret)
1484*4882a593Smuzhiyun         LoaderErrorMsg(NULL, name, errmaj, errmin);
1485*4882a593Smuzhiyun     return ret;
1486*4882a593Smuzhiyun }
1487*4882a593Smuzhiyun 
1488*4882a593Smuzhiyun void *
xf86LoadSubModule(ScrnInfoPtr pScrn,const char * name)1489*4882a593Smuzhiyun xf86LoadSubModule(ScrnInfoPtr pScrn, const char *name)
1490*4882a593Smuzhiyun {
1491*4882a593Smuzhiyun     void *ret;
1492*4882a593Smuzhiyun     int errmaj = 0, errmin = 0;
1493*4882a593Smuzhiyun 
1494*4882a593Smuzhiyun     ret = LoadSubModule(pScrn->module, name, NULL, NULL, NULL, NULL,
1495*4882a593Smuzhiyun                         &errmaj, &errmin);
1496*4882a593Smuzhiyun     if (!ret)
1497*4882a593Smuzhiyun         LoaderErrorMsg(pScrn->name, name, errmaj, errmin);
1498*4882a593Smuzhiyun     return ret;
1499*4882a593Smuzhiyun }
1500*4882a593Smuzhiyun 
1501*4882a593Smuzhiyun /*
1502*4882a593Smuzhiyun  * xf86LoadOneModule loads a single module.
1503*4882a593Smuzhiyun  */
1504*4882a593Smuzhiyun void *
xf86LoadOneModule(const char * name,void * opt)1505*4882a593Smuzhiyun xf86LoadOneModule(const char *name, void *opt)
1506*4882a593Smuzhiyun {
1507*4882a593Smuzhiyun     int errmaj;
1508*4882a593Smuzhiyun     char *Name;
1509*4882a593Smuzhiyun     void *mod;
1510*4882a593Smuzhiyun 
1511*4882a593Smuzhiyun     if (!name)
1512*4882a593Smuzhiyun         return NULL;
1513*4882a593Smuzhiyun 
1514*4882a593Smuzhiyun     /* Normalise the module name */
1515*4882a593Smuzhiyun     Name = xf86NormalizeName(name);
1516*4882a593Smuzhiyun 
1517*4882a593Smuzhiyun     /* Skip empty names */
1518*4882a593Smuzhiyun     if (Name == NULL)
1519*4882a593Smuzhiyun         return NULL;
1520*4882a593Smuzhiyun     if (*Name == '\0') {
1521*4882a593Smuzhiyun         free(Name);
1522*4882a593Smuzhiyun         return NULL;
1523*4882a593Smuzhiyun     }
1524*4882a593Smuzhiyun 
1525*4882a593Smuzhiyun     mod = LoadModule(Name, opt, NULL, &errmaj);
1526*4882a593Smuzhiyun     if (!mod)
1527*4882a593Smuzhiyun         LoaderErrorMsg(NULL, Name, errmaj, 0);
1528*4882a593Smuzhiyun     free(Name);
1529*4882a593Smuzhiyun     return mod;
1530*4882a593Smuzhiyun }
1531*4882a593Smuzhiyun 
1532*4882a593Smuzhiyun void
xf86UnloadSubModule(void * mod)1533*4882a593Smuzhiyun xf86UnloadSubModule(void *mod)
1534*4882a593Smuzhiyun {
1535*4882a593Smuzhiyun     UnloadSubModule(mod);
1536*4882a593Smuzhiyun }
1537*4882a593Smuzhiyun 
1538*4882a593Smuzhiyun Bool
xf86LoaderCheckSymbol(const char * name)1539*4882a593Smuzhiyun xf86LoaderCheckSymbol(const char *name)
1540*4882a593Smuzhiyun {
1541*4882a593Smuzhiyun     return LoaderSymbol(name) != NULL;
1542*4882a593Smuzhiyun }
1543*4882a593Smuzhiyun 
1544*4882a593Smuzhiyun typedef enum {
1545*4882a593Smuzhiyun     OPTION_BACKING_STORE
1546*4882a593Smuzhiyun } BSOpts;
1547*4882a593Smuzhiyun 
1548*4882a593Smuzhiyun static const OptionInfoRec BSOptions[] = {
1549*4882a593Smuzhiyun     {OPTION_BACKING_STORE, "BackingStore", OPTV_BOOLEAN, {0}, FALSE},
1550*4882a593Smuzhiyun     {-1, NULL, OPTV_NONE, {0}, FALSE}
1551*4882a593Smuzhiyun };
1552*4882a593Smuzhiyun 
1553*4882a593Smuzhiyun void
xf86SetBackingStore(ScreenPtr pScreen)1554*4882a593Smuzhiyun xf86SetBackingStore(ScreenPtr pScreen)
1555*4882a593Smuzhiyun {
1556*4882a593Smuzhiyun     Bool useBS = FALSE;
1557*4882a593Smuzhiyun     MessageType from = X_DEFAULT;
1558*4882a593Smuzhiyun     ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
1559*4882a593Smuzhiyun     OptionInfoPtr options;
1560*4882a593Smuzhiyun 
1561*4882a593Smuzhiyun     options = xnfalloc(sizeof(BSOptions));
1562*4882a593Smuzhiyun     (void) memcpy(options, BSOptions, sizeof(BSOptions));
1563*4882a593Smuzhiyun     xf86ProcessOptions(pScrn->scrnIndex, pScrn->options, options);
1564*4882a593Smuzhiyun 
1565*4882a593Smuzhiyun     /* check for commandline option here */
1566*4882a593Smuzhiyun     if (xf86bsEnableFlag) {
1567*4882a593Smuzhiyun         from = X_CMDLINE;
1568*4882a593Smuzhiyun         useBS = TRUE;
1569*4882a593Smuzhiyun     }
1570*4882a593Smuzhiyun     else if (xf86bsDisableFlag) {
1571*4882a593Smuzhiyun         from = X_CMDLINE;
1572*4882a593Smuzhiyun         useBS = FALSE;
1573*4882a593Smuzhiyun     }
1574*4882a593Smuzhiyun     else {
1575*4882a593Smuzhiyun         if (xf86GetOptValBool(options, OPTION_BACKING_STORE, &useBS))
1576*4882a593Smuzhiyun             from = X_CONFIG;
1577*4882a593Smuzhiyun #ifdef COMPOSITE
1578*4882a593Smuzhiyun         if (from != X_CONFIG)
1579*4882a593Smuzhiyun             useBS = xf86ReturnOptValBool(options, OPTION_BACKING_STORE,
1580*4882a593Smuzhiyun                                          !noCompositeExtension);
1581*4882a593Smuzhiyun #endif
1582*4882a593Smuzhiyun     }
1583*4882a593Smuzhiyun     free(options);
1584*4882a593Smuzhiyun     pScreen->backingStoreSupport = useBS ? WhenMapped : NotUseful;
1585*4882a593Smuzhiyun     if (serverGeneration == 1)
1586*4882a593Smuzhiyun         xf86DrvMsg(pScreen->myNum, from, "Backing store %s\n",
1587*4882a593Smuzhiyun                    useBS ? "enabled" : "disabled");
1588*4882a593Smuzhiyun }
1589*4882a593Smuzhiyun 
1590*4882a593Smuzhiyun typedef enum {
1591*4882a593Smuzhiyun     OPTION_SILKEN_MOUSE
1592*4882a593Smuzhiyun } SMOpts;
1593*4882a593Smuzhiyun 
1594*4882a593Smuzhiyun static const OptionInfoRec SMOptions[] = {
1595*4882a593Smuzhiyun     {OPTION_SILKEN_MOUSE, "SilkenMouse", OPTV_BOOLEAN, {0}, FALSE},
1596*4882a593Smuzhiyun     {-1, NULL, OPTV_NONE, {0}, FALSE}
1597*4882a593Smuzhiyun };
1598*4882a593Smuzhiyun 
1599*4882a593Smuzhiyun void
xf86SetSilkenMouse(ScreenPtr pScreen)1600*4882a593Smuzhiyun xf86SetSilkenMouse(ScreenPtr pScreen)
1601*4882a593Smuzhiyun {
1602*4882a593Smuzhiyun     Bool useSM = TRUE;
1603*4882a593Smuzhiyun     MessageType from = X_DEFAULT;
1604*4882a593Smuzhiyun     ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
1605*4882a593Smuzhiyun     OptionInfoPtr options;
1606*4882a593Smuzhiyun 
1607*4882a593Smuzhiyun     options = xnfalloc(sizeof(SMOptions));
1608*4882a593Smuzhiyun     (void) memcpy(options, SMOptions, sizeof(SMOptions));
1609*4882a593Smuzhiyun     xf86ProcessOptions(pScrn->scrnIndex, pScrn->options, options);
1610*4882a593Smuzhiyun 
1611*4882a593Smuzhiyun     /* check for commandline option here */
1612*4882a593Smuzhiyun     /* disable if screen shares resources */
1613*4882a593Smuzhiyun     /* TODO VGA arb disable silken mouse */
1614*4882a593Smuzhiyun     if (xf86silkenMouseDisableFlag) {
1615*4882a593Smuzhiyun         from = X_CMDLINE;
1616*4882a593Smuzhiyun         useSM = FALSE;
1617*4882a593Smuzhiyun     }
1618*4882a593Smuzhiyun     else {
1619*4882a593Smuzhiyun         if (xf86GetOptValBool(options, OPTION_SILKEN_MOUSE, &useSM))
1620*4882a593Smuzhiyun             from = X_CONFIG;
1621*4882a593Smuzhiyun     }
1622*4882a593Smuzhiyun     free(options);
1623*4882a593Smuzhiyun     /*
1624*4882a593Smuzhiyun      * Use silken mouse if requested and if we have threaded input
1625*4882a593Smuzhiyun      */
1626*4882a593Smuzhiyun     pScrn->silkenMouse = useSM && InputThreadEnable;
1627*4882a593Smuzhiyun     if (serverGeneration == 1)
1628*4882a593Smuzhiyun         xf86DrvMsg(pScreen->myNum, from, "Silken mouse %s\n",
1629*4882a593Smuzhiyun                    pScrn->silkenMouse ? "enabled" : "disabled");
1630*4882a593Smuzhiyun }
1631*4882a593Smuzhiyun 
1632*4882a593Smuzhiyun /* Wrote this function for the PM2 Xv driver, preliminary. */
1633*4882a593Smuzhiyun 
1634*4882a593Smuzhiyun void *
xf86FindXvOptions(ScrnInfoPtr pScrn,int adaptor_index,const char * port_name,const char ** adaptor_name,void ** adaptor_options)1635*4882a593Smuzhiyun xf86FindXvOptions(ScrnInfoPtr pScrn, int adaptor_index, const char *port_name,
1636*4882a593Smuzhiyun                   const char **adaptor_name, void **adaptor_options)
1637*4882a593Smuzhiyun {
1638*4882a593Smuzhiyun     confXvAdaptorPtr adaptor;
1639*4882a593Smuzhiyun     int i;
1640*4882a593Smuzhiyun 
1641*4882a593Smuzhiyun     if (adaptor_index >= pScrn->confScreen->numxvadaptors) {
1642*4882a593Smuzhiyun         if (adaptor_name)
1643*4882a593Smuzhiyun             *adaptor_name = NULL;
1644*4882a593Smuzhiyun         if (adaptor_options)
1645*4882a593Smuzhiyun             *adaptor_options = NULL;
1646*4882a593Smuzhiyun         return NULL;
1647*4882a593Smuzhiyun     }
1648*4882a593Smuzhiyun 
1649*4882a593Smuzhiyun     adaptor = &pScrn->confScreen->xvadaptors[adaptor_index];
1650*4882a593Smuzhiyun     if (adaptor_name)
1651*4882a593Smuzhiyun         *adaptor_name = adaptor->identifier;
1652*4882a593Smuzhiyun     if (adaptor_options)
1653*4882a593Smuzhiyun         *adaptor_options = adaptor->options;
1654*4882a593Smuzhiyun 
1655*4882a593Smuzhiyun     for (i = 0; i < adaptor->numports; i++)
1656*4882a593Smuzhiyun         if (!xf86NameCmp(adaptor->ports[i].identifier, port_name))
1657*4882a593Smuzhiyun             return adaptor->ports[i].options;
1658*4882a593Smuzhiyun 
1659*4882a593Smuzhiyun     return NULL;
1660*4882a593Smuzhiyun }
1661*4882a593Smuzhiyun 
1662*4882a593Smuzhiyun static void
xf86ConfigFbEntityInactive(EntityInfoPtr pEnt,EntityProc init,EntityProc enter,EntityProc leave,void * private)1663*4882a593Smuzhiyun xf86ConfigFbEntityInactive(EntityInfoPtr pEnt, EntityProc init,
1664*4882a593Smuzhiyun                            EntityProc enter, EntityProc leave, void *private)
1665*4882a593Smuzhiyun {
1666*4882a593Smuzhiyun     ScrnInfoPtr pScrn;
1667*4882a593Smuzhiyun 
1668*4882a593Smuzhiyun     if ((pScrn = xf86FindScreenForEntity(pEnt->index)))
1669*4882a593Smuzhiyun         xf86RemoveEntityFromScreen(pScrn, pEnt->index);
1670*4882a593Smuzhiyun }
1671*4882a593Smuzhiyun 
1672*4882a593Smuzhiyun ScrnInfoPtr
xf86ConfigFbEntity(ScrnInfoPtr pScrn,int scrnFlag,int entityIndex,EntityProc init,EntityProc enter,EntityProc leave,void * private)1673*4882a593Smuzhiyun xf86ConfigFbEntity(ScrnInfoPtr pScrn, int scrnFlag, int entityIndex,
1674*4882a593Smuzhiyun                    EntityProc init, EntityProc enter, EntityProc leave,
1675*4882a593Smuzhiyun                    void *private)
1676*4882a593Smuzhiyun {
1677*4882a593Smuzhiyun     EntityInfoPtr pEnt = xf86GetEntityInfo(entityIndex);
1678*4882a593Smuzhiyun 
1679*4882a593Smuzhiyun     if (init || enter || leave)
1680*4882a593Smuzhiyun         FatalError("Legacy entity access functions are unsupported\n");
1681*4882a593Smuzhiyun 
1682*4882a593Smuzhiyun     if (!pEnt)
1683*4882a593Smuzhiyun         return pScrn;
1684*4882a593Smuzhiyun 
1685*4882a593Smuzhiyun     if (!(pEnt->location.type == BUS_NONE)) {
1686*4882a593Smuzhiyun         free(pEnt);
1687*4882a593Smuzhiyun         return pScrn;
1688*4882a593Smuzhiyun     }
1689*4882a593Smuzhiyun 
1690*4882a593Smuzhiyun     if (!pEnt->active) {
1691*4882a593Smuzhiyun         xf86ConfigFbEntityInactive(pEnt, init, enter, leave, private);
1692*4882a593Smuzhiyun         free(pEnt);
1693*4882a593Smuzhiyun         return pScrn;
1694*4882a593Smuzhiyun     }
1695*4882a593Smuzhiyun 
1696*4882a593Smuzhiyun     if (!pScrn)
1697*4882a593Smuzhiyun         pScrn = xf86AllocateScreen(pEnt->driver, scrnFlag);
1698*4882a593Smuzhiyun     xf86AddEntityToScreen(pScrn, entityIndex);
1699*4882a593Smuzhiyun 
1700*4882a593Smuzhiyun     free(pEnt);
1701*4882a593Smuzhiyun     return pScrn;
1702*4882a593Smuzhiyun }
1703*4882a593Smuzhiyun 
1704*4882a593Smuzhiyun Bool
xf86IsScreenPrimary(ScrnInfoPtr pScrn)1705*4882a593Smuzhiyun xf86IsScreenPrimary(ScrnInfoPtr pScrn)
1706*4882a593Smuzhiyun {
1707*4882a593Smuzhiyun     int i;
1708*4882a593Smuzhiyun 
1709*4882a593Smuzhiyun     for (i = 0; i < pScrn->numEntities; i++) {
1710*4882a593Smuzhiyun         if (xf86IsEntityPrimary(i))
1711*4882a593Smuzhiyun             return TRUE;
1712*4882a593Smuzhiyun     }
1713*4882a593Smuzhiyun     return FALSE;
1714*4882a593Smuzhiyun }
1715*4882a593Smuzhiyun 
1716*4882a593Smuzhiyun Bool
xf86IsUnblank(int mode)1717*4882a593Smuzhiyun xf86IsUnblank(int mode)
1718*4882a593Smuzhiyun {
1719*4882a593Smuzhiyun     switch (mode) {
1720*4882a593Smuzhiyun     case SCREEN_SAVER_OFF:
1721*4882a593Smuzhiyun     case SCREEN_SAVER_FORCER:
1722*4882a593Smuzhiyun         return TRUE;
1723*4882a593Smuzhiyun     case SCREEN_SAVER_ON:
1724*4882a593Smuzhiyun     case SCREEN_SAVER_CYCLE:
1725*4882a593Smuzhiyun         return FALSE;
1726*4882a593Smuzhiyun     default:
1727*4882a593Smuzhiyun         xf86MsgVerb(X_WARNING, 0, "Unexpected save screen mode: %d\n", mode);
1728*4882a593Smuzhiyun         return TRUE;
1729*4882a593Smuzhiyun     }
1730*4882a593Smuzhiyun }
1731*4882a593Smuzhiyun 
1732*4882a593Smuzhiyun void
xf86MotionHistoryAllocate(InputInfoPtr pInfo)1733*4882a593Smuzhiyun xf86MotionHistoryAllocate(InputInfoPtr pInfo)
1734*4882a593Smuzhiyun {
1735*4882a593Smuzhiyun     AllocateMotionHistory(pInfo->dev);
1736*4882a593Smuzhiyun }
1737*4882a593Smuzhiyun 
1738*4882a593Smuzhiyun ScrnInfoPtr
xf86ScreenToScrn(ScreenPtr pScreen)1739*4882a593Smuzhiyun xf86ScreenToScrn(ScreenPtr pScreen)
1740*4882a593Smuzhiyun {
1741*4882a593Smuzhiyun     if (pScreen->isGPU) {
1742*4882a593Smuzhiyun         assert(pScreen->myNum - GPU_SCREEN_OFFSET < xf86NumGPUScreens);
1743*4882a593Smuzhiyun         return xf86GPUScreens[pScreen->myNum - GPU_SCREEN_OFFSET];
1744*4882a593Smuzhiyun     } else {
1745*4882a593Smuzhiyun         assert(pScreen->myNum < xf86NumScreens);
1746*4882a593Smuzhiyun         return xf86Screens[pScreen->myNum];
1747*4882a593Smuzhiyun     }
1748*4882a593Smuzhiyun }
1749*4882a593Smuzhiyun 
1750*4882a593Smuzhiyun ScreenPtr
xf86ScrnToScreen(ScrnInfoPtr pScrn)1751*4882a593Smuzhiyun xf86ScrnToScreen(ScrnInfoPtr pScrn)
1752*4882a593Smuzhiyun {
1753*4882a593Smuzhiyun     if (pScrn->is_gpu) {
1754*4882a593Smuzhiyun         assert(pScrn->scrnIndex - GPU_SCREEN_OFFSET < screenInfo.numGPUScreens);
1755*4882a593Smuzhiyun         return screenInfo.gpuscreens[pScrn->scrnIndex - GPU_SCREEN_OFFSET];
1756*4882a593Smuzhiyun     } else {
1757*4882a593Smuzhiyun         assert(pScrn->scrnIndex < screenInfo.numScreens);
1758*4882a593Smuzhiyun         return screenInfo.screens[pScrn->scrnIndex];
1759*4882a593Smuzhiyun     }
1760*4882a593Smuzhiyun }
1761*4882a593Smuzhiyun 
1762*4882a593Smuzhiyun void
xf86UpdateDesktopDimensions(void)1763*4882a593Smuzhiyun xf86UpdateDesktopDimensions(void)
1764*4882a593Smuzhiyun {
1765*4882a593Smuzhiyun     update_desktop_dimensions();
1766*4882a593Smuzhiyun }
1767