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
*) malloc(sizeof(FakePriv
));
47 if (!fakeInitialize(card
, priv
)) {
57 fakeScreenInitialize(KdScreenInfo
* screen
, FakeScrPriv
* scrpriv
)
59 if (!screen
->width
|| !screen
->height
) {
65 if (screen
->width
<= 0)
67 if (screen
->height
<= 0)
70 if (!screen
->fb
.depth
)
71 screen
->fb
.depth
= 16;
73 if (screen
->fb
.depth
<= 8) {
74 screen
->fb
.visuals
= ((1 << StaticGray
) |
78 (1 << TrueColor
) | (1 << DirectColor
));
81 screen
->fb
.visuals
= (1 << TrueColor
);
82 #define Mask(o,l) (((1 << l) - 1) << o)
83 if (screen
->fb
.depth
<= 15) {
84 screen
->fb
.depth
= 15;
85 screen
->fb
.bitsPerPixel
= 16;
86 screen
->fb
.redMask
= Mask (10, 5);
87 screen
->fb
.greenMask
= Mask (5, 5);
88 screen
->fb
.blueMask
= Mask (0, 5);
90 else if (screen
->fb
.depth
<= 16) {
91 screen
->fb
.depth
= 16;
92 screen
->fb
.bitsPerPixel
= 16;
93 screen
->fb
.redMask
= Mask (11, 5);
94 screen
->fb
.greenMask
= Mask (5, 6);
95 screen
->fb
.blueMask
= Mask (0, 5);
98 screen
->fb
.depth
= 24;
99 screen
->fb
.bitsPerPixel
= 32;
100 screen
->fb
.redMask
= Mask (16, 8);
101 screen
->fb
.greenMask
= Mask (8, 8);
102 screen
->fb
.blueMask
= Mask (0, 8);
106 scrpriv
->randr
= screen
->randr
;
108 return fakeMapFramebuffer(screen
);
112 fakeScreenInit(KdScreenInfo
* screen
)
114 FakeScrPriv
*scrpriv
;
116 scrpriv
= calloc(1, sizeof(FakeScrPriv
));
119 screen
->driver
= scrpriv
;
120 if (!fakeScreenInitialize(screen
, scrpriv
)) {
129 fakeWindowLinear(ScreenPtr pScreen
,
131 CARD32 offset
, int mode
, CARD32
*size
, void *closure
)
133 KdScreenPriv(pScreen
);
134 FakePriv
*priv
= pScreenPriv
->card
->driver
;
136 if (!pScreenPriv
->enabled
)
138 *size
= priv
->bytes_per_line
;
139 return priv
->base
+ row
* priv
->bytes_per_line
;
143 fakeMapFramebuffer(KdScreenInfo
* screen
)
145 FakeScrPriv
*scrpriv
= screen
->driver
;
147 FakePriv
*priv
= screen
->card
->driver
;
149 if (scrpriv
->randr
!= RR_Rotate_0
)
150 scrpriv
->shadow
= TRUE
;
152 scrpriv
->shadow
= FALSE
;
154 KdComputePointerMatrix(&m
, scrpriv
->randr
, screen
->width
, screen
->height
);
156 KdSetPointerMatrix(&m
);
158 priv
->bytes_per_line
=
159 ((screen
->width
* screen
->fb
.bitsPerPixel
+ 31) >> 5) << 2;
161 priv
->base
= malloc(priv
->bytes_per_line
* screen
->height
);
163 if (scrpriv
->shadow
) {
165 (screen
, scrpriv
->randr
& (RR_Rotate_90
| RR_Rotate_270
)))
169 screen
->fb
.byteStride
= priv
->bytes_per_line
;
170 screen
->fb
.pixelStride
= (priv
->bytes_per_line
* 8 /
171 screen
->fb
.bitsPerPixel
);
172 screen
->fb
.frameBuffer
= (CARD8
*) (priv
->base
);
179 fakeSetScreenSizes(ScreenPtr pScreen
)
181 KdScreenPriv(pScreen
);
182 KdScreenInfo
*screen
= pScreenPriv
->screen
;
183 FakeScrPriv
*scrpriv
= screen
->driver
;
185 if (scrpriv
->randr
& (RR_Rotate_0
| RR_Rotate_180
)) {
186 pScreen
->width
= screen
->width
;
187 pScreen
->height
= screen
->height
;
188 pScreen
->mmWidth
= screen
->width_mm
;
189 pScreen
->mmHeight
= screen
->height_mm
;
192 pScreen
->width
= screen
->width
;
193 pScreen
->height
= screen
->height
;
194 pScreen
->mmWidth
= screen
->height_mm
;
195 pScreen
->mmHeight
= screen
->width_mm
;
200 fakeUnmapFramebuffer(KdScreenInfo
* screen
)
202 FakePriv
*priv
= screen
->card
->driver
;
204 KdShadowFbFree(screen
);
211 fakeSetShadow(ScreenPtr pScreen
)
213 KdScreenPriv(pScreen
);
214 KdScreenInfo
*screen
= pScreenPriv
->screen
;
215 FakeScrPriv
*scrpriv
= screen
->driver
;
216 ShadowUpdateProc update
;
217 ShadowWindowProc window
;
219 window
= fakeWindowLinear
;
222 update
= shadowUpdateRotatePacked
;
224 update
= shadowUpdatePacked
;
225 return KdShadowSet(pScreen
, scrpriv
->randr
, update
, window
);
230 fakeRandRGetInfo(ScreenPtr pScreen
, Rotation
* rotations
)
232 KdScreenPriv(pScreen
);
233 KdScreenInfo
*screen
= pScreenPriv
->screen
;
234 FakeScrPriv
*scrpriv
= screen
->driver
;
235 RRScreenSizePtr pSize
;
239 *rotations
= RR_Rotate_All
| RR_Reflect_All
;
241 for (n
= 0; n
< pScreen
->numDepths
; n
++)
242 if (pScreen
->allowedDepths
[n
].numVids
)
244 if (n
== pScreen
->numDepths
)
247 pSize
= RRRegisterSize(pScreen
,
249 screen
->height
, screen
->width_mm
, screen
->height_mm
);
251 randr
= KdSubRotation(scrpriv
->randr
, screen
->randr
);
253 RRSetCurrentConfig(pScreen
, randr
, 0, pSize
);
259 fakeRandRSetConfig(ScreenPtr pScreen
,
260 Rotation randr
, int rate
, RRScreenSizePtr pSize
)
262 KdScreenPriv(pScreen
);
263 KdScreenInfo
*screen
= pScreenPriv
->screen
;
264 FakeScrPriv
*scrpriv
= screen
->driver
;
265 Bool wasEnabled
= pScreenPriv
->enabled
;
271 int newwidth
, newheight
;
273 if (screen
->randr
& (RR_Rotate_0
| RR_Rotate_180
)) {
274 newwidth
= pSize
->width
;
275 newheight
= pSize
->height
;
278 newwidth
= pSize
->height
;
279 newheight
= pSize
->width
;
283 KdDisableScreen(pScreen
);
287 oldwidth
= screen
->width
;
288 oldheight
= screen
->height
;
289 oldmmwidth
= pScreen
->mmWidth
;
290 oldmmheight
= pScreen
->mmHeight
;
293 * Set new configuration
296 scrpriv
->randr
= KdAddRotation(screen
->randr
, randr
);
298 fakeUnmapFramebuffer(screen
);
300 if (!fakeMapFramebuffer(screen
))
303 KdShadowUnset(screen
->pScreen
);
305 if (!fakeSetShadow(screen
->pScreen
))
308 fakeSetScreenSizes(screen
->pScreen
);
311 * Set frame buffer mapping
313 (*pScreen
->ModifyPixmapHeader
) (fbGetScreenPixmap(pScreen
),
317 screen
->fb
.bitsPerPixel
,
318 screen
->fb
.byteStride
,
319 screen
->fb
.frameBuffer
);
321 /* set the subpixel order */
323 KdSetSubpixelOrder(pScreen
, scrpriv
->randr
);
325 KdEnableScreen(pScreen
);
330 fakeUnmapFramebuffer(screen
);
332 (void) fakeMapFramebuffer(screen
);
333 pScreen
->width
= oldwidth
;
334 pScreen
->height
= oldheight
;
335 pScreen
->mmWidth
= oldmmwidth
;
336 pScreen
->mmHeight
= oldmmheight
;
339 KdEnableScreen(pScreen
);
344 fakeRandRInit(ScreenPtr pScreen
)
346 rrScrPrivPtr pScrPriv
;
348 if (!RRScreenInit(pScreen
))
351 pScrPriv
= rrGetScrPriv(pScreen
);
352 pScrPriv
->rrGetInfo
= fakeRandRGetInfo
;
353 pScrPriv
->rrSetConfig
= fakeRandRSetConfig
;
359 fakeCreateColormap(ColormapPtr pmap
)
361 return fbInitializeColormap(pmap
);
365 fakeInitScreen(ScreenPtr pScreen
)
368 KdTsPhyScreen
= pScreen
->myNum
;
371 pScreen
->CreateColormap
= fakeCreateColormap
;
376 fakeFinishInitScreen(ScreenPtr pScreen
)
378 if (!shadowSetup(pScreen
))
382 if (!fakeRandRInit(pScreen
))
390 fakeCreateResources(ScreenPtr pScreen
)
392 return fakeSetShadow(pScreen
);
396 fakePreserve(KdCardInfo
* card
)
401 fakeEnable(ScreenPtr pScreen
)
407 fakeDPMS(ScreenPtr pScreen
, int mode
)
413 fakeDisable(ScreenPtr pScreen
)
418 fakeRestore(KdCardInfo
* card
)
423 fakeScreenFini(KdScreenInfo
* screen
)
428 fakeCardFini(KdCardInfo
* card
)
430 FakePriv
*priv
= card
->driver
;
437 fakeGetColors(ScreenPtr pScreen
, int n
, xColorItem
* pdefs
)
448 fakePutColors(ScreenPtr pScreen
, int n
, xColorItem
* pdefs
)