fake.c revision 706f2543
1/*
2 * Copyright © 2004 Keith Packard
3 *
4 * Permission to use, copy, modify, distribute, and sell this software and its
5 * documentation for any purpose is hereby granted without fee, provided that
6 * the above copyright notice appear in all copies and that both that
7 * copyright notice and this permission notice appear in supporting
8 * documentation, and that the name of Keith Packard not be used in
9 * advertising or publicity pertaining to distribution of the software without
10 * specific, written prior permission.  Keith Packard makes no
11 * representations about the suitability of this software for any purpose.  It
12 * is provided "as is" without express or implied warranty.
13 *
14 * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
15 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
16 * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
17 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
18 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
19 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
20 * PERFORMANCE OF THIS SOFTWARE.
21 */
22
23#ifdef HAVE_CONFIG_H
24#include <kdrive-config.h>
25#endif
26#include "fake.h"
27
28extern int KdTsPhyScreen;
29
30Bool
31fakeInitialize (KdCardInfo *card, FakePriv *priv)
32{
33    priv->base = 0;
34    priv->bytes_per_line = 0;
35    return TRUE;
36}
37
38Bool
39fakeCardInit (KdCardInfo *card)
40{
41    FakePriv	*priv;
42
43    priv = (FakePriv *) malloc(sizeof (FakePriv));
44    if (!priv)
45	return FALSE;
46
47    if (!fakeInitialize (card, priv))
48    {
49	free(priv);
50	return FALSE;
51    }
52    card->driver = priv;
53
54    return TRUE;
55}
56
57Bool
58fakeScreenInitialize (KdScreenInfo *screen, FakeScrPriv *scrpriv)
59{
60    if (!screen->width || !screen->height)
61    {
62	screen->width = 1024;
63	screen->height = 768;
64	screen->rate = 72;
65    }
66
67    if (screen->width <= 0)
68	screen->width = 1;
69    if (screen->height <= 0)
70	screen->height = 1;
71
72    if (!screen->fb.depth)
73	screen->fb.depth = 16;
74
75    if (screen->fb.depth <= 8)
76    {
77	screen->fb.visuals = ((1 << StaticGray) |
78			      (1 << GrayScale) |
79			      (1 << StaticColor) |
80			      (1 << PseudoColor) |
81			      (1 << TrueColor) |
82			      (1 << DirectColor));
83    }
84    else
85    {
86	screen->fb.visuals = (1 << TrueColor);
87#define Mask(o,l)   (((1 << l) - 1) << o)
88	if (screen->fb.depth <= 15)
89	{
90	    screen->fb.depth = 15;
91	    screen->fb.bitsPerPixel = 16;
92	    screen->fb.redMask = Mask (10, 5);
93	    screen->fb.greenMask = Mask (5, 5);
94	    screen->fb.blueMask = Mask (0, 5);
95	}
96	else if (screen->fb.depth <= 16)
97	{
98	    screen->fb.depth = 16;
99	    screen->fb.bitsPerPixel = 16;
100	    screen->fb.redMask = Mask (11, 5);
101	    screen->fb.greenMask = Mask (5, 6);
102	    screen->fb.blueMask = Mask (0, 5);
103	}
104	else
105	{
106	    screen->fb.depth = 24;
107	    screen->fb.bitsPerPixel = 32;
108	    screen->fb.redMask = Mask (16, 8);
109	    screen->fb.greenMask = Mask (8, 8);
110	    screen->fb.blueMask = Mask (0, 8);
111	}
112    }
113
114    scrpriv->randr = screen->randr;
115
116    return fakeMapFramebuffer (screen);
117}
118
119Bool
120fakeScreenInit (KdScreenInfo *screen)
121{
122    FakeScrPriv *scrpriv;
123
124    scrpriv = calloc(1, sizeof (FakeScrPriv));
125    if (!scrpriv)
126	return FALSE;
127    screen->driver = scrpriv;
128    if (!fakeScreenInitialize (screen, scrpriv))
129    {
130	screen->driver = 0;
131	free(scrpriv);
132	return FALSE;
133    }
134    return TRUE;
135}
136
137void *
138fakeWindowLinear (ScreenPtr	pScreen,
139		   CARD32	row,
140		   CARD32	offset,
141		   int		mode,
142		   CARD32	*size,
143		   void		*closure)
144{
145    KdScreenPriv(pScreen);
146    FakePriv	    *priv = pScreenPriv->card->driver;
147
148    if (!pScreenPriv->enabled)
149	return 0;
150    *size = priv->bytes_per_line;
151    return priv->base + row * priv->bytes_per_line;
152}
153
154Bool
155fakeMapFramebuffer (KdScreenInfo *screen)
156{
157    FakeScrPriv	*scrpriv = screen->driver;
158    KdPointerMatrix	m;
159    FakePriv		*priv = screen->card->driver;
160
161    if (scrpriv->randr != RR_Rotate_0)
162	scrpriv->shadow = TRUE;
163    else
164	scrpriv->shadow = FALSE;
165
166    KdComputePointerMatrix (&m, scrpriv->randr, screen->width, screen->height);
167
168    KdSetPointerMatrix (&m);
169
170    priv->bytes_per_line = ((screen->width * screen->fb.bitsPerPixel + 31) >> 5) << 2;
171    free(priv->base);
172    priv->base = malloc (priv->bytes_per_line * screen->height);
173
174    if (scrpriv->shadow)
175    {
176	if (!KdShadowFbAlloc (screen, scrpriv->randr & (RR_Rotate_90|RR_Rotate_270)))
177	    return FALSE;
178    }
179    else
180    {
181        screen->fb.byteStride = priv->bytes_per_line;
182        screen->fb.pixelStride = (priv->bytes_per_line * 8/
183				     screen->fb.bitsPerPixel);
184        screen->fb.frameBuffer = (CARD8 *) (priv->base);
185    }
186
187    return TRUE;
188}
189
190void
191fakeSetScreenSizes (ScreenPtr pScreen)
192{
193    KdScreenPriv(pScreen);
194    KdScreenInfo	*screen = pScreenPriv->screen;
195    FakeScrPriv	*scrpriv = screen->driver;
196
197    if (scrpriv->randr & (RR_Rotate_0|RR_Rotate_180))
198    {
199	pScreen->width = screen->width;
200	pScreen->height = screen->height;
201	pScreen->mmWidth = screen->width_mm;
202	pScreen->mmHeight = screen->height_mm;
203    }
204    else
205    {
206	pScreen->width = screen->width;
207	pScreen->height = screen->height;
208	pScreen->mmWidth = screen->height_mm;
209	pScreen->mmHeight = screen->width_mm;
210    }
211}
212
213Bool
214fakeUnmapFramebuffer (KdScreenInfo *screen)
215{
216    FakePriv		*priv = screen->card->driver;
217    KdShadowFbFree (screen);
218    free(priv->base);
219    priv->base = NULL;
220    return TRUE;
221}
222
223Bool
224fakeSetShadow (ScreenPtr pScreen)
225{
226    KdScreenPriv(pScreen);
227    KdScreenInfo	*screen = pScreenPriv->screen;
228    FakeScrPriv	*scrpriv = screen->driver;
229    ShadowUpdateProc	update;
230    ShadowWindowProc	window;
231
232    window = fakeWindowLinear;
233    update = 0;
234    if (scrpriv->randr)
235	update = shadowUpdateRotatePacked;
236    else
237	update = shadowUpdatePacked;
238    return KdShadowSet (pScreen, scrpriv->randr, update, window);
239}
240
241
242#ifdef RANDR
243Bool
244fakeRandRGetInfo (ScreenPtr pScreen, Rotation *rotations)
245{
246    KdScreenPriv(pScreen);
247    KdScreenInfo	    *screen = pScreenPriv->screen;
248    FakeScrPriv	    *scrpriv = screen->driver;
249    RRScreenSizePtr	    pSize;
250    Rotation		    randr;
251    int			    n;
252
253    *rotations = RR_Rotate_All|RR_Reflect_All;
254
255    for (n = 0; n < pScreen->numDepths; n++)
256	if (pScreen->allowedDepths[n].numVids)
257	    break;
258    if (n == pScreen->numDepths)
259	return FALSE;
260
261    pSize = RRRegisterSize (pScreen,
262			    screen->width,
263			    screen->height,
264			    screen->width_mm,
265			    screen->height_mm);
266
267    randr = KdSubRotation (scrpriv->randr, screen->randr);
268
269    RRSetCurrentConfig (pScreen, randr, 0, pSize);
270
271    return TRUE;
272}
273
274Bool
275fakeRandRSetConfig (ScreenPtr		pScreen,
276		     Rotation		randr,
277		     int		rate,
278		     RRScreenSizePtr	pSize)
279{
280    KdScreenPriv(pScreen);
281    KdScreenInfo	*screen = pScreenPriv->screen;
282    FakeScrPriv	*scrpriv = screen->driver;
283    Bool		wasEnabled = pScreenPriv->enabled;
284    FakeScrPriv	oldscr;
285    int			oldwidth;
286    int			oldheight;
287    int			oldmmwidth;
288    int			oldmmheight;
289    int			newwidth, newheight;
290
291    if (screen->randr & (RR_Rotate_0|RR_Rotate_180))
292    {
293	newwidth = pSize->width;
294	newheight = pSize->height;
295    }
296    else
297    {
298	newwidth = pSize->height;
299	newheight = pSize->width;
300    }
301
302    if (wasEnabled)
303	KdDisableScreen (pScreen);
304
305    oldscr = *scrpriv;
306
307    oldwidth = screen->width;
308    oldheight = screen->height;
309    oldmmwidth = pScreen->mmWidth;
310    oldmmheight = pScreen->mmHeight;
311
312    /*
313     * Set new configuration
314     */
315
316    scrpriv->randr = KdAddRotation (screen->randr, randr);
317
318    fakeUnmapFramebuffer (screen);
319
320    if (!fakeMapFramebuffer (screen))
321	goto bail4;
322
323    KdShadowUnset (screen->pScreen);
324
325    if (!fakeSetShadow (screen->pScreen))
326	goto bail4;
327
328    fakeSetScreenSizes (screen->pScreen);
329
330    /*
331     * Set frame buffer mapping
332     */
333    (*pScreen->ModifyPixmapHeader) (fbGetScreenPixmap (pScreen),
334				    pScreen->width,
335				    pScreen->height,
336				    screen->fb.depth,
337				    screen->fb.bitsPerPixel,
338				    screen->fb.byteStride,
339				    screen->fb.frameBuffer);
340
341    /* set the subpixel order */
342
343    KdSetSubpixelOrder (pScreen, scrpriv->randr);
344    if (wasEnabled)
345	KdEnableScreen (pScreen);
346
347    return TRUE;
348
349bail4:
350    fakeUnmapFramebuffer (screen);
351    *scrpriv = oldscr;
352    (void) fakeMapFramebuffer (screen);
353    pScreen->width = oldwidth;
354    pScreen->height = oldheight;
355    pScreen->mmWidth = oldmmwidth;
356    pScreen->mmHeight = oldmmheight;
357
358    if (wasEnabled)
359	KdEnableScreen (pScreen);
360    return FALSE;
361}
362
363Bool
364fakeRandRInit (ScreenPtr pScreen)
365{
366    rrScrPrivPtr    pScrPriv;
367
368    if (!RRScreenInit (pScreen))
369	return FALSE;
370
371    pScrPriv = rrGetScrPriv(pScreen);
372    pScrPriv->rrGetInfo = fakeRandRGetInfo;
373    pScrPriv->rrSetConfig = fakeRandRSetConfig;
374    return TRUE;
375}
376#endif
377
378Bool
379fakeCreateColormap (ColormapPtr pmap)
380{
381    return fbInitializeColormap (pmap);
382}
383
384Bool
385fakeInitScreen (ScreenPtr pScreen)
386{
387#ifdef TOUCHSCREEN
388    KdTsPhyScreen = pScreen->myNum;
389#endif
390
391    pScreen->CreateColormap = fakeCreateColormap;
392    return TRUE;
393}
394
395Bool
396fakeFinishInitScreen (ScreenPtr pScreen)
397{
398    if (!shadowSetup (pScreen))
399	return FALSE;
400
401#ifdef RANDR
402    if (!fakeRandRInit (pScreen))
403	return FALSE;
404#endif
405
406    return TRUE;
407}
408
409
410Bool
411fakeCreateResources (ScreenPtr pScreen)
412{
413    return fakeSetShadow (pScreen);
414}
415
416void
417fakePreserve (KdCardInfo *card)
418{
419}
420
421Bool
422fakeEnable (ScreenPtr pScreen)
423{
424    return TRUE;
425}
426
427Bool
428fakeDPMS (ScreenPtr pScreen, int mode)
429{
430    return TRUE;
431}
432
433void
434fakeDisable (ScreenPtr pScreen)
435{
436}
437
438void
439fakeRestore (KdCardInfo *card)
440{
441}
442
443void
444fakeScreenFini (KdScreenInfo *screen)
445{
446}
447
448void
449fakeCardFini (KdCardInfo *card)
450{
451    FakePriv	*priv = card->driver;
452
453    free (priv->base);
454    free(priv);
455}
456
457void
458fakeGetColors (ScreenPtr pScreen, int n, xColorItem *pdefs)
459{
460    while (n--)
461    {
462	pdefs->red = 0;
463	pdefs->green = 0;
464	pdefs->blue = 0;
465	pdefs++;
466    }
467}
468
469void
470fakePutColors (ScreenPtr pScreen, int n, xColorItem *pdefs)
471{
472}
473