First import
[xorg_rtime.git] / xorg-server-1.4 / hw / kdrive / fake / fake.c
blob6211ab8712cd095cf28f2ce29d3b7879a7b4db08
1 /*
2 * Copyright © 2004 Keith Packard
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.
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.
23 #ifdef HAVE_CONFIG_H
24 #include <kdrive-config.h>
25 #endif
26 #include "fake.h"
28 extern int KdTsPhyScreen;
30 Bool
31 fakeInitialize (KdCardInfo *card, FakePriv *priv)
33 priv->base = 0;
34 priv->bytes_per_line = 0;
35 return TRUE;
38 Bool
39 fakeCardInit (KdCardInfo *card)
41 FakePriv *priv;
43 priv = (FakePriv *) xalloc (sizeof (FakePriv));
44 if (!priv)
45 return FALSE;
47 if (!fakeInitialize (card, priv))
49 xfree (priv);
50 return FALSE;
52 card->driver = priv;
54 return TRUE;
57 Bool
58 fakeScreenInitialize (KdScreenInfo *screen, FakeScrPriv *scrpriv)
60 if (!screen->width || !screen->height)
62 screen->width = 1024;
63 screen->height = 768;
64 screen->rate = 72;
67 if (screen->width <= 0)
68 screen->width = 1;
69 if (screen->height <= 0)
70 screen->height = 1;
72 if (!screen->fb[0].depth)
73 screen->fb[0].depth = 16;
75 if (screen->fb[0].depth <= 8)
77 screen->fb[0].visuals = ((1 << StaticGray) |
78 (1 << GrayScale) |
79 (1 << StaticColor) |
80 (1 << PseudoColor) |
81 (1 << TrueColor) |
82 (1 << DirectColor));
84 else
86 screen->fb[0].visuals = (1 << TrueColor);
87 #define Mask(o,l) (((1 << l) - 1) << o)
88 if (screen->fb[0].depth <= 15)
90 screen->fb[0].depth = 15;
91 screen->fb[0].bitsPerPixel = 16;
92 screen->fb[0].redMask = Mask (10, 5);
93 screen->fb[0].greenMask = Mask (5, 5);
94 screen->fb[0].blueMask = Mask (0, 5);
96 else if (screen->fb[0].depth <= 16)
98 screen->fb[0].depth = 16;
99 screen->fb[0].bitsPerPixel = 16;
100 screen->fb[0].redMask = Mask (11, 5);
101 screen->fb[0].greenMask = Mask (5, 6);
102 screen->fb[0].blueMask = Mask (0, 5);
104 else
106 screen->fb[0].depth = 24;
107 screen->fb[0].bitsPerPixel = 32;
108 screen->fb[0].redMask = Mask (16, 8);
109 screen->fb[0].greenMask = Mask (8, 8);
110 screen->fb[0].blueMask = Mask (0, 8);
114 scrpriv->randr = screen->randr;
116 return fakeMapFramebuffer (screen);
119 Bool
120 fakeScreenInit (KdScreenInfo *screen)
122 FakeScrPriv *scrpriv;
124 scrpriv = xalloc (sizeof (FakeScrPriv));
125 if (!scrpriv)
126 return FALSE;
127 memset (scrpriv, '\0', sizeof (FakeScrPriv));
128 screen->driver = scrpriv;
129 if (!fakeScreenInitialize (screen, scrpriv))
131 screen->driver = 0;
132 xfree (scrpriv);
133 return FALSE;
135 return TRUE;
138 void *
139 fakeWindowLinear (ScreenPtr pScreen,
140 CARD32 row,
141 CARD32 offset,
142 int mode,
143 CARD32 *size,
144 void *closure)
146 KdScreenPriv(pScreen);
147 FakePriv *priv = pScreenPriv->card->driver;
149 if (!pScreenPriv->enabled)
150 return 0;
151 *size = priv->bytes_per_line;
152 return priv->base + row * priv->bytes_per_line;
155 Bool
156 fakeMapFramebuffer (KdScreenInfo *screen)
158 FakeScrPriv *scrpriv = screen->driver;
159 KdPointerMatrix m;
160 FakePriv *priv = screen->card->driver;
162 if (scrpriv->randr != RR_Rotate_0)
163 scrpriv->shadow = TRUE;
164 else
165 scrpriv->shadow = FALSE;
167 KdComputePointerMatrix (&m, scrpriv->randr, screen->width, screen->height);
169 KdSetPointerMatrix (&m);
171 priv->bytes_per_line = ((screen->width * screen->fb[0].bitsPerPixel + 31) >> 5) << 2;
172 if (priv->base)
173 free (priv->base);
174 priv->base = malloc (priv->bytes_per_line * screen->height);
175 screen->memory_base = (CARD8 *) (priv->base);
176 screen->memory_size = 0;
177 screen->off_screen_base = 0;
179 if (scrpriv->shadow)
181 if (!KdShadowFbAlloc (screen, 0,
182 scrpriv->randr & (RR_Rotate_90|RR_Rotate_270)))
183 return FALSE;
185 else
187 screen->fb[0].byteStride = priv->bytes_per_line;
188 screen->fb[0].pixelStride = (priv->bytes_per_line * 8/
189 screen->fb[0].bitsPerPixel);
190 screen->fb[0].frameBuffer = (CARD8 *) (priv->base);
193 return TRUE;
196 void
197 fakeSetScreenSizes (ScreenPtr pScreen)
199 KdScreenPriv(pScreen);
200 KdScreenInfo *screen = pScreenPriv->screen;
201 FakeScrPriv *scrpriv = screen->driver;
203 if (scrpriv->randr & (RR_Rotate_0|RR_Rotate_180))
205 pScreen->width = screen->width;
206 pScreen->height = screen->height;
207 pScreen->mmWidth = screen->width_mm;
208 pScreen->mmHeight = screen->height_mm;
210 else
212 pScreen->width = screen->width;
213 pScreen->height = screen->height;
214 pScreen->mmWidth = screen->height_mm;
215 pScreen->mmHeight = screen->width_mm;
219 Bool
220 fakeUnmapFramebuffer (KdScreenInfo *screen)
222 FakePriv *priv = screen->card->driver;
223 KdShadowFbFree (screen, 0);
224 if (priv->base)
226 free (priv->base);
227 priv->base = 0;
229 return TRUE;
232 Bool
233 fakeSetShadow (ScreenPtr pScreen)
235 KdScreenPriv(pScreen);
236 KdScreenInfo *screen = pScreenPriv->screen;
237 FakeScrPriv *scrpriv = screen->driver;
238 ShadowUpdateProc update;
239 ShadowWindowProc window;
241 window = fakeWindowLinear;
242 update = 0;
243 if (scrpriv->randr)
244 update = shadowUpdateRotatePacked;
245 else
246 update = shadowUpdatePacked;
247 return KdShadowSet (pScreen, scrpriv->randr, update, window);
251 #ifdef RANDR
252 Bool
253 fakeRandRGetInfo (ScreenPtr pScreen, Rotation *rotations)
255 KdScreenPriv(pScreen);
256 KdScreenInfo *screen = pScreenPriv->screen;
257 FakeScrPriv *scrpriv = screen->driver;
258 RRScreenSizePtr pSize;
259 Rotation randr;
260 int n;
262 *rotations = RR_Rotate_All|RR_Reflect_All;
264 for (n = 0; n < pScreen->numDepths; n++)
265 if (pScreen->allowedDepths[n].numVids)
266 break;
267 if (n == pScreen->numDepths)
268 return FALSE;
270 pSize = RRRegisterSize (pScreen,
271 screen->width,
272 screen->height,
273 screen->width_mm,
274 screen->height_mm);
276 randr = KdSubRotation (scrpriv->randr, screen->randr);
278 RRSetCurrentConfig (pScreen, randr, 0, pSize);
280 return TRUE;
283 Bool
284 fakeRandRSetConfig (ScreenPtr pScreen,
285 Rotation randr,
286 int rate,
287 RRScreenSizePtr pSize)
289 KdScreenPriv(pScreen);
290 KdScreenInfo *screen = pScreenPriv->screen;
291 FakeScrPriv *scrpriv = screen->driver;
292 Bool wasEnabled = pScreenPriv->enabled;
293 FakeScrPriv oldscr;
294 int oldwidth;
295 int oldheight;
296 int oldmmwidth;
297 int oldmmheight;
298 int newwidth, newheight;
300 if (screen->randr & (RR_Rotate_0|RR_Rotate_180))
302 newwidth = pSize->width;
303 newheight = pSize->height;
305 else
307 newwidth = pSize->height;
308 newheight = pSize->width;
311 if (wasEnabled)
312 KdDisableScreen (pScreen);
314 oldscr = *scrpriv;
316 oldwidth = screen->width;
317 oldheight = screen->height;
318 oldmmwidth = pScreen->mmWidth;
319 oldmmheight = pScreen->mmHeight;
322 * Set new configuration
325 scrpriv->randr = KdAddRotation (screen->randr, randr);
327 KdOffscreenSwapOut (screen->pScreen);
329 fakeUnmapFramebuffer (screen);
331 if (!fakeMapFramebuffer (screen))
332 goto bail4;
334 KdShadowUnset (screen->pScreen);
336 if (!fakeSetShadow (screen->pScreen))
337 goto bail4;
339 fakeSetScreenSizes (screen->pScreen);
342 * Set frame buffer mapping
344 (*pScreen->ModifyPixmapHeader) (fbGetScreenPixmap (pScreen),
345 pScreen->width,
346 pScreen->height,
347 screen->fb[0].depth,
348 screen->fb[0].bitsPerPixel,
349 screen->fb[0].byteStride,
350 screen->fb[0].frameBuffer);
352 /* set the subpixel order */
354 KdSetSubpixelOrder (pScreen, scrpriv->randr);
355 if (wasEnabled)
356 KdEnableScreen (pScreen);
358 return TRUE;
360 bail4:
361 fakeUnmapFramebuffer (screen);
362 *scrpriv = oldscr;
363 (void) fakeMapFramebuffer (screen);
364 pScreen->width = oldwidth;
365 pScreen->height = oldheight;
366 pScreen->mmWidth = oldmmwidth;
367 pScreen->mmHeight = oldmmheight;
369 if (wasEnabled)
370 KdEnableScreen (pScreen);
371 return FALSE;
374 Bool
375 fakeRandRInit (ScreenPtr pScreen)
377 rrScrPrivPtr pScrPriv;
379 if (!RRScreenInit (pScreen))
380 return FALSE;
382 pScrPriv = rrGetScrPriv(pScreen);
383 pScrPriv->rrGetInfo = fakeRandRGetInfo;
384 pScrPriv->rrSetConfig = fakeRandRSetConfig;
385 return TRUE;
387 #endif
389 Bool
390 fakeCreateColormap (ColormapPtr pmap)
392 return fbInitializeColormap (pmap);
395 Bool
396 fakeInitScreen (ScreenPtr pScreen)
398 #ifdef TOUCHSCREEN
399 KdTsPhyScreen = pScreen->myNum;
400 #endif
402 pScreen->CreateColormap = fakeCreateColormap;
403 return TRUE;
406 Bool
407 fakeFinishInitScreen (ScreenPtr pScreen)
409 if (!shadowSetup (pScreen))
410 return FALSE;
412 #ifdef RANDR
413 if (!fakeRandRInit (pScreen))
414 return FALSE;
415 #endif
417 return TRUE;
421 Bool
422 fakeCreateResources (ScreenPtr pScreen)
424 return fakeSetShadow (pScreen);
427 void
428 fakePreserve (KdCardInfo *card)
432 Bool
433 fakeEnable (ScreenPtr pScreen)
435 return TRUE;
438 Bool
439 fakeDPMS (ScreenPtr pScreen, int mode)
441 return TRUE;
444 void
445 fakeDisable (ScreenPtr pScreen)
449 void
450 fakeRestore (KdCardInfo *card)
454 void
455 fakeScreenFini (KdScreenInfo *screen)
459 void
460 fakeCardFini (KdCardInfo *card)
462 FakePriv *priv = card->driver;
464 if (priv->base)
465 free (priv->base);
466 xfree (priv);
469 void
470 fakeGetColors (ScreenPtr pScreen, int fb, int n, xColorItem *pdefs)
472 while (n--)
474 pdefs->red = 0;
475 pdefs->green = 0;
476 pdefs->blue = 0;
477 pdefs++;
481 void
482 fakePutColors (ScreenPtr pScreen, int fb, int n, xColorItem *pdefs)