savage_shadow.c revision ab47cfaa
1ab47cfaaSmrg/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/s3virge/s3v_shadow.c,v 1.3 2000/03/31 20:13:33 dawes Exp $ */
2ab47cfaaSmrg
3ab47cfaaSmrg/*
4ab47cfaaSmrg   Copyright (c) 1999,2000  The XFree86 Project Inc.
5ab47cfaaSmrg   based on code written by Mark Vojkovich <markv@valinux.com>
6ab47cfaaSmrg*/
7ab47cfaaSmrg
8ab47cfaaSmrg#ifdef HAVE_CONFIG_H
9ab47cfaaSmrg#include "config.h"
10ab47cfaaSmrg#endif
11ab47cfaaSmrg
12ab47cfaaSmrg#include "savage_driver.h"
13ab47cfaaSmrg#include "shadowfb.h"
14ab47cfaaSmrg#include "servermd.h"
15ab47cfaaSmrg
16ab47cfaaSmrg
17ab47cfaaSmrgvoid
18ab47cfaaSmrgSavageRefreshArea(ScrnInfoPtr pScrn, int num, BoxPtr pbox)
19ab47cfaaSmrg{
20ab47cfaaSmrg    SavagePtr psav = SAVPTR(pScrn);
21ab47cfaaSmrg    int width, height, Bpp, FBPitch;
22ab47cfaaSmrg    unsigned char *src, *dst;
23ab47cfaaSmrg
24ab47cfaaSmrg    Bpp = pScrn->bitsPerPixel >> 3;
25ab47cfaaSmrg    FBPitch = BitmapBytePad(pScrn->displayWidth * pScrn->bitsPerPixel);
26ab47cfaaSmrg
27ab47cfaaSmrg    while(num--) {
28ab47cfaaSmrg	width = (pbox->x2 - pbox->x1) * Bpp;
29ab47cfaaSmrg	height = pbox->y2 - pbox->y1;
30ab47cfaaSmrg	src = psav->ShadowPtr + (pbox->y1 * psav->ShadowPitch) +
31ab47cfaaSmrg						(pbox->x1 * Bpp);
32ab47cfaaSmrg	dst = psav->FBStart + (pbox->y1 * FBPitch) + (pbox->x1 * Bpp);
33ab47cfaaSmrg
34ab47cfaaSmrg	while(height--) {
35ab47cfaaSmrg	    memcpy(dst, src, width);
36ab47cfaaSmrg	    dst += FBPitch;
37ab47cfaaSmrg	    src += psav->ShadowPitch;
38ab47cfaaSmrg	}
39ab47cfaaSmrg
40ab47cfaaSmrg	pbox++;
41ab47cfaaSmrg    }
42ab47cfaaSmrg}
43ab47cfaaSmrg
44ab47cfaaSmrg
45ab47cfaaSmrgvoid
46ab47cfaaSmrgSavagePointerMoved(int index, int x, int y)
47ab47cfaaSmrg{
48ab47cfaaSmrg    ScrnInfoPtr pScrn = xf86Screens[index];
49ab47cfaaSmrg    SavagePtr psav = SAVPTR(pScrn);
50ab47cfaaSmrg    int newX, newY;
51ab47cfaaSmrg
52ab47cfaaSmrg    if(psav->rotate == 1) {
53ab47cfaaSmrg	newX = pScrn->pScreen->height - y - 1;
54ab47cfaaSmrg	newY = x;
55ab47cfaaSmrg    } else {
56ab47cfaaSmrg	newX = y;
57ab47cfaaSmrg	newY = pScrn->pScreen->width - x - 1;
58ab47cfaaSmrg    }
59ab47cfaaSmrg
60ab47cfaaSmrg    (*psav->PointerMoved)(index, newX, newY);
61ab47cfaaSmrg}
62ab47cfaaSmrg
63ab47cfaaSmrgvoid
64ab47cfaaSmrgSavageRefreshArea8(ScrnInfoPtr pScrn, int num, BoxPtr pbox)
65ab47cfaaSmrg{
66ab47cfaaSmrg    SavagePtr psav = SAVPTR(pScrn);
67ab47cfaaSmrg    int count, width, height, y1, y2, dstPitch, srcPitch;
68ab47cfaaSmrg    CARD8 *dstPtr, *srcPtr, *src;
69ab47cfaaSmrg    CARD32 *dst;
70ab47cfaaSmrg
71ab47cfaaSmrg    dstPitch = pScrn->displayWidth;
72ab47cfaaSmrg    srcPitch = -psav->rotate * psav->ShadowPitch;
73ab47cfaaSmrg
74ab47cfaaSmrg    while(num--) {
75ab47cfaaSmrg	width = pbox->x2 - pbox->x1;
76ab47cfaaSmrg	y1 = pbox->y1 & ~3;
77ab47cfaaSmrg	y2 = (pbox->y2 + 3) & ~3;
78ab47cfaaSmrg	height = (y2 - y1) >> 2;  /* in dwords */
79ab47cfaaSmrg
80ab47cfaaSmrg	if(psav->rotate == 1) {
81ab47cfaaSmrg	    dstPtr = psav->FBStart +
82ab47cfaaSmrg			(pbox->x1 * dstPitch) + pScrn->virtualX - y2;
83ab47cfaaSmrg	    srcPtr = psav->ShadowPtr + ((1 - y2) * srcPitch) + pbox->x1;
84ab47cfaaSmrg	} else {
85ab47cfaaSmrg	    dstPtr = psav->FBStart +
86ab47cfaaSmrg			((pScrn->virtualY - pbox->x2) * dstPitch) + y1;
87ab47cfaaSmrg	    srcPtr = psav->ShadowPtr + (y1 * srcPitch) + pbox->x2 - 1;
88ab47cfaaSmrg	}
89ab47cfaaSmrg
90ab47cfaaSmrg	while(width--) {
91ab47cfaaSmrg	    src = srcPtr;
92ab47cfaaSmrg	    dst = (CARD32*)dstPtr;
93ab47cfaaSmrg	    count = height;
94ab47cfaaSmrg	    while(count--) {
95ab47cfaaSmrg		*(dst++) = src[0] | (src[srcPitch] << 8) |
96ab47cfaaSmrg					(src[srcPitch * 2] << 16) |
97ab47cfaaSmrg					(src[srcPitch * 3] << 24);
98ab47cfaaSmrg		src += srcPitch * 4;
99ab47cfaaSmrg	    }
100ab47cfaaSmrg	    srcPtr += psav->rotate;
101ab47cfaaSmrg	    dstPtr += dstPitch;
102ab47cfaaSmrg	}
103ab47cfaaSmrg
104ab47cfaaSmrg	pbox++;
105ab47cfaaSmrg    }
106ab47cfaaSmrg}
107ab47cfaaSmrg
108ab47cfaaSmrg
109ab47cfaaSmrgvoid
110ab47cfaaSmrgSavageRefreshArea16(ScrnInfoPtr pScrn, int num, BoxPtr pbox)
111ab47cfaaSmrg{
112ab47cfaaSmrg    SavagePtr psav = SAVPTR(pScrn);
113ab47cfaaSmrg    int count, width, height, y1, y2, dstPitch, srcPitch;
114ab47cfaaSmrg    CARD16 *dstPtr, *srcPtr, *src;
115ab47cfaaSmrg    CARD32 *dst;
116ab47cfaaSmrg
117ab47cfaaSmrg    dstPitch = pScrn->displayWidth;
118ab47cfaaSmrg    srcPitch = -psav->rotate * psav->ShadowPitch >> 1;
119ab47cfaaSmrg
120ab47cfaaSmrg    while(num--) {
121ab47cfaaSmrg	width = pbox->x2 - pbox->x1;
122ab47cfaaSmrg	y1 = pbox->y1 & ~1;
123ab47cfaaSmrg	y2 = (pbox->y2 + 1) & ~1;
124ab47cfaaSmrg	height = (y2 - y1) >> 1;  /* in dwords */
125ab47cfaaSmrg
126ab47cfaaSmrg	if(psav->rotate == 1) {
127ab47cfaaSmrg	    dstPtr = (CARD16*)psav->FBStart +
128ab47cfaaSmrg			(pbox->x1 * dstPitch) + pScrn->virtualX - y2;
129ab47cfaaSmrg	    srcPtr = (CARD16*)psav->ShadowPtr +
130ab47cfaaSmrg			((1 - y2) * srcPitch) + pbox->x1;
131ab47cfaaSmrg	} else {
132ab47cfaaSmrg	    dstPtr = (CARD16*)psav->FBStart +
133ab47cfaaSmrg			((pScrn->virtualY - pbox->x2) * dstPitch) + y1;
134ab47cfaaSmrg	    srcPtr = (CARD16*)psav->ShadowPtr +
135ab47cfaaSmrg			(y1 * srcPitch) + pbox->x2 - 1;
136ab47cfaaSmrg	}
137ab47cfaaSmrg
138ab47cfaaSmrg	while(width--) {
139ab47cfaaSmrg	    src = srcPtr;
140ab47cfaaSmrg	    dst = (CARD32*)dstPtr;
141ab47cfaaSmrg	    count = height;
142ab47cfaaSmrg	    while(count--) {
143ab47cfaaSmrg		*(dst++) = src[0] | (src[srcPitch] << 16);
144ab47cfaaSmrg		src += srcPitch * 2;
145ab47cfaaSmrg	    }
146ab47cfaaSmrg	    srcPtr += psav->rotate;
147ab47cfaaSmrg	    dstPtr += dstPitch;
148ab47cfaaSmrg	}
149ab47cfaaSmrg
150ab47cfaaSmrg	pbox++;
151ab47cfaaSmrg    }
152ab47cfaaSmrg}
153ab47cfaaSmrg
154ab47cfaaSmrg
155ab47cfaaSmrg/* this one could be faster */
156ab47cfaaSmrgvoid
157ab47cfaaSmrgSavageRefreshArea24(ScrnInfoPtr pScrn, int num, BoxPtr pbox)
158ab47cfaaSmrg{
159ab47cfaaSmrg    SavagePtr psav = SAVPTR(pScrn);
160ab47cfaaSmrg    int count, width, height, y1, y2, dstPitch, srcPitch;
161ab47cfaaSmrg    CARD8 *dstPtr, *srcPtr, *src;
162ab47cfaaSmrg    CARD32 *dst;
163ab47cfaaSmrg
164ab47cfaaSmrg    dstPitch = BitmapBytePad(pScrn->displayWidth * 24);
165ab47cfaaSmrg    srcPitch = -psav->rotate * psav->ShadowPitch;
166ab47cfaaSmrg
167ab47cfaaSmrg    while(num--) {
168ab47cfaaSmrg        width = pbox->x2 - pbox->x1;
169ab47cfaaSmrg        y1 = pbox->y1 & ~3;
170ab47cfaaSmrg        y2 = (pbox->y2 + 3) & ~3;
171ab47cfaaSmrg        height = (y2 - y1) >> 2;  /* blocks of 3 dwords */
172ab47cfaaSmrg
173ab47cfaaSmrg	if(psav->rotate == 1) {
174ab47cfaaSmrg	    dstPtr = psav->FBStart +
175ab47cfaaSmrg			(pbox->x1 * dstPitch) + ((pScrn->virtualX - y2) * 3);
176ab47cfaaSmrg	    srcPtr = psav->ShadowPtr + ((1 - y2) * srcPitch) + (pbox->x1 * 3);
177ab47cfaaSmrg	} else {
178ab47cfaaSmrg	    dstPtr = psav->FBStart +
179ab47cfaaSmrg			((pScrn->virtualY - pbox->x2) * dstPitch) + (y1 * 3);
180ab47cfaaSmrg	    srcPtr = psav->ShadowPtr + (y1 * srcPitch) + (pbox->x2 * 3) - 3;
181ab47cfaaSmrg	}
182ab47cfaaSmrg
183ab47cfaaSmrg	while(width--) {
184ab47cfaaSmrg	    src = srcPtr;
185ab47cfaaSmrg	    dst = (CARD32*)dstPtr;
186ab47cfaaSmrg	    count = height;
187ab47cfaaSmrg	    while(count--) {
188ab47cfaaSmrg		dst[0] = src[0] | (src[1] << 8) | (src[2] << 16) |
189ab47cfaaSmrg				(src[srcPitch] << 24);
190ab47cfaaSmrg		dst[1] = src[srcPitch + 1] | (src[srcPitch + 2] << 8) |
191ab47cfaaSmrg				(src[srcPitch * 2] << 16) |
192ab47cfaaSmrg				(src[(srcPitch * 2) + 1] << 24);
193ab47cfaaSmrg		dst[2] = src[(srcPitch * 2) + 2] | (src[srcPitch * 3] << 8) |
194ab47cfaaSmrg				(src[(srcPitch * 3) + 1] << 16) |
195ab47cfaaSmrg				(src[(srcPitch * 3) + 2] << 24);
196ab47cfaaSmrg		dst += 3;
197ab47cfaaSmrg		src += srcPitch * 4;
198ab47cfaaSmrg	    }
199ab47cfaaSmrg	    srcPtr += psav->rotate * 3;
200ab47cfaaSmrg	    dstPtr += dstPitch;
201ab47cfaaSmrg	}
202ab47cfaaSmrg
203ab47cfaaSmrg	pbox++;
204ab47cfaaSmrg    }
205ab47cfaaSmrg}
206ab47cfaaSmrg
207ab47cfaaSmrgvoid
208ab47cfaaSmrgSavageRefreshArea32(ScrnInfoPtr pScrn, int num, BoxPtr pbox)
209ab47cfaaSmrg{
210ab47cfaaSmrg    SavagePtr psav = SAVPTR(pScrn);
211ab47cfaaSmrg    int count, width, height, dstPitch, srcPitch;
212ab47cfaaSmrg    CARD32 *dstPtr, *srcPtr, *src, *dst;
213ab47cfaaSmrg
214ab47cfaaSmrg    dstPitch = pScrn->displayWidth;
215ab47cfaaSmrg    srcPitch = -psav->rotate * psav->ShadowPitch >> 2;
216ab47cfaaSmrg
217ab47cfaaSmrg    while(num--) {
218ab47cfaaSmrg	width = pbox->x2 - pbox->x1;
219ab47cfaaSmrg	height = pbox->y2 - pbox->y1;
220ab47cfaaSmrg
221ab47cfaaSmrg	if(psav->rotate == 1) {
222ab47cfaaSmrg	    dstPtr = (CARD32*)psav->FBStart +
223ab47cfaaSmrg			(pbox->x1 * dstPitch) + pScrn->virtualX - pbox->y2;
224ab47cfaaSmrg	    srcPtr = (CARD32*)psav->ShadowPtr +
225ab47cfaaSmrg			((1 - pbox->y2) * srcPitch) + pbox->x1;
226ab47cfaaSmrg	} else {
227ab47cfaaSmrg	    dstPtr = (CARD32*)psav->FBStart +
228ab47cfaaSmrg			((pScrn->virtualY - pbox->x2) * dstPitch) + pbox->y1;
229ab47cfaaSmrg	    srcPtr = (CARD32*)psav->ShadowPtr +
230ab47cfaaSmrg			(pbox->y1 * srcPitch) + pbox->x2 - 1;
231ab47cfaaSmrg	}
232ab47cfaaSmrg
233ab47cfaaSmrg	while(width--) {
234ab47cfaaSmrg	    src = srcPtr;
235ab47cfaaSmrg	    dst = dstPtr;
236ab47cfaaSmrg	    count = height;
237ab47cfaaSmrg	    while(count--) {
238ab47cfaaSmrg		*(dst++) = *src;
239ab47cfaaSmrg		src += srcPitch;
240ab47cfaaSmrg	    }
241ab47cfaaSmrg	    srcPtr += psav->rotate;
242ab47cfaaSmrg	    dstPtr += dstPitch;
243ab47cfaaSmrg	}
244ab47cfaaSmrg
245ab47cfaaSmrg	pbox++;
246ab47cfaaSmrg    }
247ab47cfaaSmrg}
248ab47cfaaSmrg
249