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.
24 #include <kdrive-config.h>
28 extern int KdTsPhyScreen
;
31 fakeInitialize (KdCardInfo
*card
, FakePriv
*priv
)
34 priv
->bytes_per_line
= 0;
39 fakeCardInit (KdCardInfo
*card
)
43 priv
= (FakePriv
*) xalloc (sizeof (FakePriv
));
47 if (!fakeInitialize (card
, priv
))
58 fakeScreenInitialize (KdScreenInfo
*screen
, FakeScrPriv
*scrpriv
)
60 if (!screen
->width
|| !screen
->height
)
67 if (screen
->width
<= 0)
69 if (screen
->height
<= 0)
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
) |
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);
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
);
120 fakeScreenInit (KdScreenInfo
*screen
)
122 FakeScrPriv
*scrpriv
;
124 scrpriv
= xalloc (sizeof (FakeScrPriv
));
127 memset (scrpriv
, '\0', sizeof (FakeScrPriv
));
128 screen
->driver
= scrpriv
;
129 if (!fakeScreenInitialize (screen
, scrpriv
))
139 fakeWindowLinear (ScreenPtr pScreen
,
146 KdScreenPriv(pScreen
);
147 FakePriv
*priv
= pScreenPriv
->card
->driver
;
149 if (!pScreenPriv
->enabled
)
151 *size
= priv
->bytes_per_line
;
152 return priv
->base
+ row
* priv
->bytes_per_line
;
156 fakeMapFramebuffer (KdScreenInfo
*screen
)
158 FakeScrPriv
*scrpriv
= screen
->driver
;
160 FakePriv
*priv
= screen
->card
->driver
;
162 if (scrpriv
->randr
!= RR_Rotate_0
)
163 scrpriv
->shadow
= TRUE
;
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;
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;
181 if (!KdShadowFbAlloc (screen
, 0,
182 scrpriv
->randr
& (RR_Rotate_90
|RR_Rotate_270
)))
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
);
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
;
212 pScreen
->width
= screen
->width
;
213 pScreen
->height
= screen
->height
;
214 pScreen
->mmWidth
= screen
->height_mm
;
215 pScreen
->mmHeight
= screen
->width_mm
;
220 fakeUnmapFramebuffer (KdScreenInfo
*screen
)
222 FakePriv
*priv
= screen
->card
->driver
;
223 KdShadowFbFree (screen
, 0);
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
;
244 update
= shadowUpdateRotatePacked
;
246 update
= shadowUpdatePacked
;
247 return KdShadowSet (pScreen
, scrpriv
->randr
, update
, window
);
253 fakeRandRGetInfo (ScreenPtr pScreen
, Rotation
*rotations
)
255 KdScreenPriv(pScreen
);
256 KdScreenInfo
*screen
= pScreenPriv
->screen
;
257 FakeScrPriv
*scrpriv
= screen
->driver
;
258 RRScreenSizePtr pSize
;
262 *rotations
= RR_Rotate_All
|RR_Reflect_All
;
264 for (n
= 0; n
< pScreen
->numDepths
; n
++)
265 if (pScreen
->allowedDepths
[n
].numVids
)
267 if (n
== pScreen
->numDepths
)
270 pSize
= RRRegisterSize (pScreen
,
276 randr
= KdSubRotation (scrpriv
->randr
, screen
->randr
);
278 RRSetCurrentConfig (pScreen
, randr
, 0, pSize
);
284 fakeRandRSetConfig (ScreenPtr pScreen
,
287 RRScreenSizePtr pSize
)
289 KdScreenPriv(pScreen
);
290 KdScreenInfo
*screen
= pScreenPriv
->screen
;
291 FakeScrPriv
*scrpriv
= screen
->driver
;
292 Bool wasEnabled
= pScreenPriv
->enabled
;
298 int newwidth
, newheight
;
300 if (screen
->randr
& (RR_Rotate_0
|RR_Rotate_180
))
302 newwidth
= pSize
->width
;
303 newheight
= pSize
->height
;
307 newwidth
= pSize
->height
;
308 newheight
= pSize
->width
;
312 KdDisableScreen (pScreen
);
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
))
334 KdShadowUnset (screen
->pScreen
);
336 if (!fakeSetShadow (screen
->pScreen
))
339 fakeSetScreenSizes (screen
->pScreen
);
342 * Set frame buffer mapping
344 (*pScreen
->ModifyPixmapHeader
) (fbGetScreenPixmap (pScreen
),
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
);
356 KdEnableScreen (pScreen
);
361 fakeUnmapFramebuffer (screen
);
363 (void) fakeMapFramebuffer (screen
);
364 pScreen
->width
= oldwidth
;
365 pScreen
->height
= oldheight
;
366 pScreen
->mmWidth
= oldmmwidth
;
367 pScreen
->mmHeight
= oldmmheight
;
370 KdEnableScreen (pScreen
);
375 fakeRandRInit (ScreenPtr pScreen
)
377 rrScrPrivPtr pScrPriv
;
379 if (!RRScreenInit (pScreen
))
382 pScrPriv
= rrGetScrPriv(pScreen
);
383 pScrPriv
->rrGetInfo
= fakeRandRGetInfo
;
384 pScrPriv
->rrSetConfig
= fakeRandRSetConfig
;
390 fakeCreateColormap (ColormapPtr pmap
)
392 return fbInitializeColormap (pmap
);
396 fakeInitScreen (ScreenPtr pScreen
)
399 KdTsPhyScreen
= pScreen
->myNum
;
402 pScreen
->CreateColormap
= fakeCreateColormap
;
407 fakeFinishInitScreen (ScreenPtr pScreen
)
409 if (!shadowSetup (pScreen
))
413 if (!fakeRandRInit (pScreen
))
422 fakeCreateResources (ScreenPtr pScreen
)
424 return fakeSetShadow (pScreen
);
428 fakePreserve (KdCardInfo
*card
)
433 fakeEnable (ScreenPtr pScreen
)
439 fakeDPMS (ScreenPtr pScreen
, int mode
)
445 fakeDisable (ScreenPtr pScreen
)
450 fakeRestore (KdCardInfo
*card
)
455 fakeScreenFini (KdScreenInfo
*screen
)
460 fakeCardFini (KdCardInfo
*card
)
462 FakePriv
*priv
= card
->driver
;
470 fakeGetColors (ScreenPtr pScreen
, int fb
, int n
, xColorItem
*pdefs
)
482 fakePutColors (ScreenPtr pScreen
, int fb
, int n
, xColorItem
*pdefs
)