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