1c06b6b69Smrg
2c06b6b69Smrg#ifdef HAVE_CONFIG_H
3c06b6b69Smrg#include "config.h"
4c06b6b69Smrg#endif
5c06b6b69Smrg
6c06b6b69Smrg#include "xf86.h"
7c06b6b69Smrg#include "xf86_OSproc.h"
8c06b6b69Smrg#include "xf86Pci.h"
9c06b6b69Smrg#include "shadowfb.h"
10c06b6b69Smrg#include "servermd.h"
11c06b6b69Smrg#include "ct_driver.h"
12c06b6b69Smrg
13c06b6b69Smrgvoid
14c06b6b69SmrgchipsRefreshArea(ScrnInfoPtr pScrn, int num, BoxPtr pbox)
15c06b6b69Smrg{
16c06b6b69Smrg    CHIPSPtr cPtr = CHIPSPTR(pScrn);
17c06b6b69Smrg    int width, height, Bpp, FBPitch;
18c06b6b69Smrg    unsigned char *src, *dst;
19c06b6b69Smrg
20c06b6b69Smrg    Bpp = pScrn->bitsPerPixel >> 3;
21c06b6b69Smrg    FBPitch = BitmapBytePad(pScrn->displayWidth * pScrn->bitsPerPixel);
22c06b6b69Smrg
23c06b6b69Smrg    while(num--) {
24c06b6b69Smrg	width = (pbox->x2 - pbox->x1) * Bpp;
25c06b6b69Smrg	height = pbox->y2 - pbox->y1;
26c06b6b69Smrg	src = cPtr->ShadowPtr + (pbox->y1 * cPtr->ShadowPitch) +
27c06b6b69Smrg						(pbox->x1 * Bpp);
28c06b6b69Smrg	dst = cPtr->FbBase + (pbox->y1 * FBPitch) + (pbox->x1 * Bpp);
29c06b6b69Smrg
30c06b6b69Smrg	while(height--) {
31c06b6b69Smrg	    memcpy(dst, src, width);
32c06b6b69Smrg	    dst += FBPitch;
33c06b6b69Smrg	    src += cPtr->ShadowPitch;
34c06b6b69Smrg	}
35c06b6b69Smrg
36c06b6b69Smrg	pbox++;
37c06b6b69Smrg    }
38c06b6b69Smrg}
39c06b6b69Smrg
40c06b6b69Smrgvoid
41a1d73b4bSmrgchipsPointerMoved(SCRN_ARG_TYPE arg, int x, int y)
42c06b6b69Smrg{
43a1d73b4bSmrg    SCRN_INFO_PTR(arg);
44c06b6b69Smrg    CHIPSPtr cPtr = CHIPSPTR(pScrn);
45c06b6b69Smrg    int newX, newY;
46c06b6b69Smrg
47c06b6b69Smrg    if(cPtr->Rotate == 1) {
48c06b6b69Smrg	newX = pScrn->pScreen->height - y - 1;
49c06b6b69Smrg	newY = x;
50c06b6b69Smrg    } else {
51c06b6b69Smrg	newX = y;
52c06b6b69Smrg	newY = pScrn->pScreen->width - x - 1;
53c06b6b69Smrg    }
54c06b6b69Smrg
55a1d73b4bSmrg    (*cPtr->PointerMoved)(arg, newX, newY);
56c06b6b69Smrg}
57c06b6b69Smrg
58c06b6b69Smrgvoid
59c06b6b69SmrgchipsRefreshArea8(ScrnInfoPtr pScrn, int num, BoxPtr pbox)
60c06b6b69Smrg{
61c06b6b69Smrg    CHIPSPtr cPtr = CHIPSPTR(pScrn);
62c06b6b69Smrg    int count, width, height, y1, y2, dstPitch, srcPitch;
63c06b6b69Smrg    CARD8 *dstPtr, *srcPtr, *src;
64c06b6b69Smrg    CARD32 *dst;
65c06b6b69Smrg
66c06b6b69Smrg    dstPitch = pScrn->displayWidth;
67c06b6b69Smrg    srcPitch = -cPtr->Rotate * cPtr->ShadowPitch;
68c06b6b69Smrg
69c06b6b69Smrg    while(num--) {
70c06b6b69Smrg	width = pbox->x2 - pbox->x1;
71c06b6b69Smrg	y1 = pbox->y1 & ~3;
72c06b6b69Smrg	y2 = (pbox->y2 + 3) & ~3;
73c06b6b69Smrg	height = (y2 - y1) >> 2;  /* in dwords */
74c06b6b69Smrg
75c06b6b69Smrg	if(cPtr->Rotate == 1) {
76c06b6b69Smrg	    dstPtr = cPtr->FbBase +
77c06b6b69Smrg			(pbox->x1 * dstPitch) + pScrn->virtualX - y2;
78c06b6b69Smrg	    srcPtr = cPtr->ShadowPtr + ((1 - y2) * srcPitch) + pbox->x1;
79c06b6b69Smrg	} else {
80c06b6b69Smrg	    dstPtr = cPtr->FbBase +
81c06b6b69Smrg			((pScrn->virtualY - pbox->x2) * dstPitch) + y1;
82c06b6b69Smrg	    srcPtr = cPtr->ShadowPtr + (y1 * srcPitch) + pbox->x2 - 1;
83c06b6b69Smrg	}
84c06b6b69Smrg
85c06b6b69Smrg	while(width--) {
86c06b6b69Smrg	    src = srcPtr;
87c06b6b69Smrg	    dst = (CARD32*)dstPtr;
88c06b6b69Smrg	    count = height;
89c06b6b69Smrg	    while(count--) {
90c06b6b69Smrg		*(dst++) = src[0] | (src[srcPitch] << 8) |
91c06b6b69Smrg					(src[srcPitch * 2] << 16) |
92c06b6b69Smrg					(src[srcPitch * 3] << 24);
93c06b6b69Smrg		src += srcPitch * 4;
94c06b6b69Smrg	    }
95c06b6b69Smrg	    srcPtr += cPtr->Rotate;
96c06b6b69Smrg	    dstPtr += dstPitch;
97c06b6b69Smrg	}
98c06b6b69Smrg
99c06b6b69Smrg	pbox++;
100c06b6b69Smrg    }
101c06b6b69Smrg}
102c06b6b69Smrg
103c06b6b69Smrg
104c06b6b69Smrgvoid
105c06b6b69SmrgchipsRefreshArea16(ScrnInfoPtr pScrn, int num, BoxPtr pbox)
106c06b6b69Smrg{
107c06b6b69Smrg    CHIPSPtr cPtr = CHIPSPTR(pScrn);
108c06b6b69Smrg    int count, width, height, y1, y2, dstPitch, srcPitch;
109c06b6b69Smrg    CARD16 *dstPtr, *srcPtr, *src;
110c06b6b69Smrg    CARD32 *dst;
111c06b6b69Smrg
112c06b6b69Smrg    dstPitch = pScrn->displayWidth;
113c06b6b69Smrg    srcPitch = -cPtr->Rotate * cPtr->ShadowPitch >> 1;
114c06b6b69Smrg
115c06b6b69Smrg    while(num--) {
116c06b6b69Smrg	width = pbox->x2 - pbox->x1;
117c06b6b69Smrg	y1 = pbox->y1 & ~1;
118c06b6b69Smrg	y2 = (pbox->y2 + 1) & ~1;
119c06b6b69Smrg	height = (y2 - y1) >> 1;  /* in dwords */
120c06b6b69Smrg
121c06b6b69Smrg	if(cPtr->Rotate == 1) {
122c06b6b69Smrg	    dstPtr = (CARD16*)cPtr->FbBase +
123c06b6b69Smrg			(pbox->x1 * dstPitch) + pScrn->virtualX - y2;
124c06b6b69Smrg	    srcPtr = (CARD16*)cPtr->ShadowPtr +
125c06b6b69Smrg			((1 - y2) * srcPitch) + pbox->x1;
126c06b6b69Smrg	} else {
127c06b6b69Smrg	    dstPtr = (CARD16*)cPtr->FbBase +
128c06b6b69Smrg			((pScrn->virtualY - pbox->x2) * dstPitch) + y1;
129c06b6b69Smrg	    srcPtr = (CARD16*)cPtr->ShadowPtr +
130c06b6b69Smrg			(y1 * srcPitch) + pbox->x2 - 1;
131c06b6b69Smrg/*	    ErrorF("dst: %x base: %x\n",dstPtr,cPtr->FbBase);*/
132c06b6b69Smrg	}
133c06b6b69Smrg
134c06b6b69Smrg	while(width--) {
135c06b6b69Smrg	    src = srcPtr;
136c06b6b69Smrg	    dst = (CARD32*)dstPtr;
137c06b6b69Smrg	    count = height;
138c06b6b69Smrg	    while(count--) {
139c06b6b69Smrg		*(dst++) = src[0] | (src[srcPitch] << 16);
140c06b6b69Smrg		src += srcPitch * 2;
141c06b6b69Smrg	    }
142c06b6b69Smrg	    srcPtr += cPtr->Rotate;
143c06b6b69Smrg	    dstPtr += dstPitch;
144c06b6b69Smrg	}
145c06b6b69Smrg
146c06b6b69Smrg	pbox++;
147c06b6b69Smrg    }
148c06b6b69Smrg}
149c06b6b69Smrg
150c06b6b69Smrg
151c06b6b69Smrg/* this one could be faster */
152c06b6b69Smrgvoid
153c06b6b69SmrgchipsRefreshArea24(ScrnInfoPtr pScrn, int num, BoxPtr pbox)
154c06b6b69Smrg{
155c06b6b69Smrg    CHIPSPtr cPtr = CHIPSPTR(pScrn);
156c06b6b69Smrg    int count, width, height, y1, y2, dstPitch, srcPitch;
157c06b6b69Smrg    CARD8 *dstPtr, *srcPtr, *src;
158c06b6b69Smrg    CARD32 *dst;
159c06b6b69Smrg
160c06b6b69Smrg    dstPitch = BitmapBytePad(pScrn->displayWidth * 24);
161c06b6b69Smrg    srcPitch = -cPtr->Rotate * cPtr->ShadowPitch;
162c06b6b69Smrg
163c06b6b69Smrg    while(num--) {
164c06b6b69Smrg        width = pbox->x2 - pbox->x1;
165c06b6b69Smrg        y1 = pbox->y1 & ~3;
166c06b6b69Smrg        y2 = (pbox->y2 + 3) & ~3;
167c06b6b69Smrg        height = (y2 - y1) >> 2;  /* blocks of 3 dwords */
168c06b6b69Smrg
169c06b6b69Smrg	if(cPtr->Rotate == 1) {
170c06b6b69Smrg	    dstPtr = cPtr->FbBase +
171c06b6b69Smrg			(pbox->x1 * dstPitch) + ((pScrn->virtualX - y2) * 3);
172c06b6b69Smrg	    srcPtr = cPtr->ShadowPtr + ((1 - y2) * srcPitch) + (pbox->x1 * 3);
173c06b6b69Smrg	} else {
174c06b6b69Smrg	    dstPtr = cPtr->FbBase +
175c06b6b69Smrg			((pScrn->virtualY - pbox->x2) * dstPitch) + (y1 * 3);
176c06b6b69Smrg	    srcPtr = cPtr->ShadowPtr + (y1 * srcPitch) + (pbox->x2 * 3) - 3;
177c06b6b69Smrg	}
178c06b6b69Smrg
179c06b6b69Smrg	while(width--) {
180c06b6b69Smrg	    src = srcPtr;
181c06b6b69Smrg	    dst = (CARD32*)dstPtr;
182c06b6b69Smrg	    count = height;
183c06b6b69Smrg	    while(count--) {
184c06b6b69Smrg		dst[0] = src[0] | (src[1] << 8) | (src[2] << 16) |
185c06b6b69Smrg				(src[srcPitch] << 24);
186c06b6b69Smrg		dst[1] = src[srcPitch + 1] | (src[srcPitch + 2] << 8) |
187c06b6b69Smrg				(src[srcPitch * 2] << 16) |
188c06b6b69Smrg				(src[(srcPitch * 2) + 1] << 24);
189c06b6b69Smrg		dst[2] = src[(srcPitch * 2) + 2] | (src[srcPitch * 3] << 8) |
190c06b6b69Smrg				(src[(srcPitch * 3) + 1] << 16) |
191c06b6b69Smrg				(src[(srcPitch * 3) + 2] << 24);
192c06b6b69Smrg		dst += 3;
193c06b6b69Smrg		src += srcPitch * 4;
194c06b6b69Smrg	    }
195c06b6b69Smrg	    srcPtr += cPtr->Rotate * 3;
196c06b6b69Smrg	    dstPtr += dstPitch;
197c06b6b69Smrg	}
198c06b6b69Smrg
199c06b6b69Smrg	pbox++;
200c06b6b69Smrg    }
201c06b6b69Smrg}
202c06b6b69Smrg
203c06b6b69Smrgvoid
204c06b6b69SmrgchipsRefreshArea32(ScrnInfoPtr pScrn, int num, BoxPtr pbox)
205c06b6b69Smrg{
206c06b6b69Smrg    CHIPSPtr cPtr = CHIPSPTR(pScrn);
207c06b6b69Smrg    int count, width, height, dstPitch, srcPitch;
208c06b6b69Smrg    CARD32 *dstPtr, *srcPtr, *src, *dst;
209c06b6b69Smrg
210c06b6b69Smrg    dstPitch = pScrn->displayWidth;
211c06b6b69Smrg    srcPitch = -cPtr->Rotate * cPtr->ShadowPitch >> 2;
212c06b6b69Smrg
213c06b6b69Smrg    while(num--) {
214c06b6b69Smrg	width = pbox->x2 - pbox->x1;
215c06b6b69Smrg	height = pbox->y2 - pbox->y1;
216c06b6b69Smrg
217c06b6b69Smrg	if(cPtr->Rotate == 1) {
218c06b6b69Smrg	    dstPtr = (CARD32*)cPtr->FbBase +
219c06b6b69Smrg			(pbox->x1 * dstPitch) + pScrn->virtualX - pbox->y2;
220c06b6b69Smrg	    srcPtr = (CARD32*)cPtr->ShadowPtr +
221c06b6b69Smrg			((1 - pbox->y2) * srcPitch) + pbox->x1;
222c06b6b69Smrg	} else {
223c06b6b69Smrg	    dstPtr = (CARD32*)cPtr->FbBase +
224c06b6b69Smrg			((pScrn->virtualY - pbox->x2) * dstPitch) + pbox->y1;
225c06b6b69Smrg	    srcPtr = (CARD32*)cPtr->ShadowPtr +
226c06b6b69Smrg			(pbox->y1 * srcPitch) + pbox->x2 - 1;
227c06b6b69Smrg	}
228c06b6b69Smrg
229c06b6b69Smrg	while(width--) {
230c06b6b69Smrg	    src = srcPtr;
231c06b6b69Smrg	    dst = dstPtr;
232c06b6b69Smrg	    count = height;
233c06b6b69Smrg	    while(count--) {
234c06b6b69Smrg		*(dst++) = *src;
235c06b6b69Smrg		src += srcPitch;
236c06b6b69Smrg	    }
237c06b6b69Smrg	    srcPtr += cPtr->Rotate;
238c06b6b69Smrg	    dstPtr += dstPitch;
239c06b6b69Smrg	}
240c06b6b69Smrg
241c06b6b69Smrg	pbox++;
242c06b6b69Smrg    }
243c06b6b69Smrg}
244