cir_shadow.c revision 1ae1b5e8
176888252Smrg/* $XFree86: Exp $ */
276888252Smrg
376888252Smrg/*
476888252Smrg   Copyright (c) 1999,2000  The XFree86 Project Inc.
576888252Smrg   based on code written by Mark Vojkovich <markv@valinux.com>
676888252Smrg*/
776888252Smrg
876888252Smrg#ifdef HAVE_CONFIG_H
976888252Smrg#include "config.h"
1076888252Smrg#endif
1176888252Smrg
1276888252Smrg#include "xf86.h"
1376888252Smrg#include "xf86_OSproc.h"
1476888252Smrg#include "xf86Resources.h"
1576888252Smrg#include "xf86PciInfo.h"
1676888252Smrg#include "xf86Pci.h"
1776888252Smrg#include "shadowfb.h"
1876888252Smrg#include "servermd.h"
1976888252Smrg#include "cir.h"
2076888252Smrg#include "alp.h"
2176888252Smrg
221ae1b5e8Smrg_X_EXPORT void
2376888252SmrgcirRefreshArea(ScrnInfoPtr pScrn, int num, BoxPtr pbox)
2476888252Smrg{
2576888252Smrg    CirPtr pCir = CIRPTR(pScrn);
2676888252Smrg    int width, height, Bpp, FBPitch;
2776888252Smrg    unsigned char *src, *dst;
2876888252Smrg
2976888252Smrg    Bpp = pScrn->bitsPerPixel >> 3;
3076888252Smrg    FBPitch = BitmapBytePad(pScrn->displayWidth * pScrn->bitsPerPixel);
3176888252Smrg
3276888252Smrg    while(num--) {
3376888252Smrg	width = (pbox->x2 - pbox->x1) * Bpp;
3476888252Smrg	height = pbox->y2 - pbox->y1;
3576888252Smrg	src = pCir->ShadowPtr + (pbox->y1 * pCir->ShadowPitch) +
3676888252Smrg						(pbox->x1 * Bpp);
3776888252Smrg	dst = pCir->FbBase + (pbox->y1 * FBPitch) + (pbox->x1 * Bpp);
3876888252Smrg
3976888252Smrg	while(height--) {
4076888252Smrg	    memcpy(dst, src, width);
4176888252Smrg	    dst += FBPitch;
4276888252Smrg	    src += pCir->ShadowPitch;
4376888252Smrg	}
4476888252Smrg
4576888252Smrg	pbox++;
4676888252Smrg    }
4776888252Smrg}
4876888252Smrg
491ae1b5e8Smrg_X_EXPORT void
5076888252SmrgcirPointerMoved(int index, int x, int y)
5176888252Smrg{
5276888252Smrg    ScrnInfoPtr pScrn = xf86Screens[index];
5376888252Smrg    CirPtr pCir = CIRPTR(pScrn);
5476888252Smrg    int newX, newY;
5576888252Smrg
5676888252Smrg    if(pCir->rotate == 1) {
5776888252Smrg	newX = pScrn->pScreen->height - y - 1;
5876888252Smrg	newY = x;
5976888252Smrg    } else {
6076888252Smrg	newX = y;
6176888252Smrg	newY = pScrn->pScreen->width - x - 1;
6276888252Smrg    }
6376888252Smrg
6476888252Smrg    (*pCir->PointerMoved)(index, newX, newY);
6576888252Smrg}
6676888252Smrg
671ae1b5e8Smrg_X_EXPORT void
6876888252SmrgcirRefreshArea8(ScrnInfoPtr pScrn, int num, BoxPtr pbox)
6976888252Smrg{
7076888252Smrg    CirPtr pCir = CIRPTR(pScrn);
7176888252Smrg    int count, width, height, y1, y2, dstPitch, srcPitch;
7276888252Smrg    CARD8 *dstPtr, *srcPtr, *src;
7376888252Smrg    CARD32 *dst;
7476888252Smrg
7576888252Smrg    dstPitch = pScrn->displayWidth;
7676888252Smrg    srcPitch = -pCir->rotate * pCir->ShadowPitch;
7776888252Smrg
7876888252Smrg    while(num--) {
7976888252Smrg	width = pbox->x2 - pbox->x1;
8076888252Smrg	y1 = pbox->y1 & ~3;
8176888252Smrg	y2 = (pbox->y2 + 3) & ~3;
8276888252Smrg	height = (y2 - y1) >> 2;  /* in dwords */
8376888252Smrg
8476888252Smrg	if(pCir->rotate == 1) {
8576888252Smrg	    dstPtr = pCir->FbBase +
8676888252Smrg			(pbox->x1 * dstPitch) + pScrn->virtualX - y2;
8776888252Smrg	    srcPtr = pCir->ShadowPtr + ((1 - y2) * srcPitch) + pbox->x1;
8876888252Smrg	} else {
8976888252Smrg	    dstPtr = pCir->FbBase +
9076888252Smrg			((pScrn->virtualY - pbox->x2) * dstPitch) + y1;
9176888252Smrg	    srcPtr = pCir->ShadowPtr + (y1 * srcPitch) + pbox->x2 - 1;
9276888252Smrg	}
9376888252Smrg
9476888252Smrg	while(width--) {
9576888252Smrg	    src = srcPtr;
9676888252Smrg	    dst = (CARD32*)dstPtr;
9776888252Smrg	    count = height;
9876888252Smrg	    while(count--) {
9976888252Smrg		*(dst++) = src[0] | (src[srcPitch] << 8) |
10076888252Smrg					(src[srcPitch * 2] << 16) |
10176888252Smrg					(src[srcPitch * 3] << 24);
10276888252Smrg		src += srcPitch * 4;
10376888252Smrg	    }
10476888252Smrg	    srcPtr += pCir->rotate;
10576888252Smrg	    dstPtr += dstPitch;
10676888252Smrg	}
10776888252Smrg
10876888252Smrg	pbox++;
10976888252Smrg    }
11076888252Smrg}
11176888252Smrg
11276888252Smrg
1131ae1b5e8Smrg_X_EXPORT void
11476888252SmrgcirRefreshArea16(ScrnInfoPtr pScrn, int num, BoxPtr pbox)
11576888252Smrg{
11676888252Smrg    CirPtr pCir = CIRPTR(pScrn);
11776888252Smrg    int count, width, height, y1, y2, dstPitch, srcPitch;
11876888252Smrg    CARD16 *dstPtr, *srcPtr, *src;
11976888252Smrg    CARD32 *dst;
12076888252Smrg
12176888252Smrg    dstPitch = pScrn->displayWidth;
12276888252Smrg    srcPitch = -pCir->rotate * pCir->ShadowPitch >> 1;
12376888252Smrg
12476888252Smrg    while(num--) {
12576888252Smrg	width = pbox->x2 - pbox->x1;
12676888252Smrg	y1 = pbox->y1 & ~1;
12776888252Smrg	y2 = (pbox->y2 + 1) & ~1;
12876888252Smrg	height = (y2 - y1) >> 1;  /* in dwords */
12976888252Smrg
13076888252Smrg	if(pCir->rotate == 1) {
13176888252Smrg	    dstPtr = (CARD16*)pCir->FbBase +
13276888252Smrg			(pbox->x1 * dstPitch) + pScrn->virtualX - y2;
13376888252Smrg	    srcPtr = (CARD16*)pCir->ShadowPtr +
13476888252Smrg			((1 - y2) * srcPitch) + pbox->x1;
13576888252Smrg	} else {
13676888252Smrg	    dstPtr = (CARD16*)pCir->FbBase +
13776888252Smrg			((pScrn->virtualY - pbox->x2) * dstPitch) + y1;
13876888252Smrg	    srcPtr = (CARD16*)pCir->ShadowPtr +
13976888252Smrg			(y1 * srcPitch) + pbox->x2 - 1;
14076888252Smrg	}
14176888252Smrg
14276888252Smrg	while(width--) {
14376888252Smrg	    src = srcPtr;
14476888252Smrg	    dst = (CARD32*)dstPtr;
14576888252Smrg	    count = height;
14676888252Smrg	    while(count--) {
14776888252Smrg		*(dst++) = src[0] | (src[srcPitch] << 16);
14876888252Smrg		src += srcPitch * 2;
14976888252Smrg	    }
15076888252Smrg	    srcPtr += pCir->rotate;
15176888252Smrg	    dstPtr += dstPitch;
15276888252Smrg	}
15376888252Smrg
15476888252Smrg	pbox++;
15576888252Smrg    }
15676888252Smrg}
15776888252Smrg
15876888252Smrg
15976888252Smrg/* this one could be faster */
1601ae1b5e8Smrg_X_EXPORT void
16176888252SmrgcirRefreshArea24(ScrnInfoPtr pScrn, int num, BoxPtr pbox)
16276888252Smrg{
16376888252Smrg    CirPtr pCir = CIRPTR(pScrn);
16476888252Smrg    int count, width, height, y1, y2, dstPitch, srcPitch;
16576888252Smrg    CARD8 *dstPtr, *srcPtr, *src;
16676888252Smrg    CARD32 *dst;
16776888252Smrg
16876888252Smrg    dstPitch = BitmapBytePad(pScrn->displayWidth * 24);
16976888252Smrg    srcPitch = -pCir->rotate * pCir->ShadowPitch;
17076888252Smrg
17176888252Smrg    while(num--) {
17276888252Smrg        width = pbox->x2 - pbox->x1;
17376888252Smrg        y1 = pbox->y1 & ~3;
17476888252Smrg        y2 = (pbox->y2 + 3) & ~3;
17576888252Smrg        height = (y2 - y1) >> 2;  /* blocks of 3 dwords */
17676888252Smrg
17776888252Smrg	if(pCir->rotate == 1) {
17876888252Smrg	    dstPtr = pCir->FbBase +
17976888252Smrg			(pbox->x1 * dstPitch) + ((pScrn->virtualX - y2) * 3);
18076888252Smrg	    srcPtr = pCir->ShadowPtr + ((1 - y2) * srcPitch) + (pbox->x1 * 3);
18176888252Smrg	} else {
18276888252Smrg	    dstPtr = pCir->FbBase +
18376888252Smrg			((pScrn->virtualY - pbox->x2) * dstPitch) + (y1 * 3);
18476888252Smrg	    srcPtr = pCir->ShadowPtr + (y1 * srcPitch) + (pbox->x2 * 3) - 3;
18576888252Smrg	}
18676888252Smrg
18776888252Smrg	while(width--) {
18876888252Smrg	    src = srcPtr;
18976888252Smrg	    dst = (CARD32*)dstPtr;
19076888252Smrg	    count = height;
19176888252Smrg	    while(count--) {
19276888252Smrg		dst[0] = src[0] | (src[1] << 8) | (src[2] << 16) |
19376888252Smrg				(src[srcPitch] << 24);
19476888252Smrg		dst[1] = src[srcPitch + 1] | (src[srcPitch + 2] << 8) |
19576888252Smrg				(src[srcPitch * 2] << 16) |
19676888252Smrg				(src[(srcPitch * 2) + 1] << 24);
19776888252Smrg		dst[2] = src[(srcPitch * 2) + 2] | (src[srcPitch * 3] << 8) |
19876888252Smrg				(src[(srcPitch * 3) + 1] << 16) |
19976888252Smrg				(src[(srcPitch * 3) + 2] << 24);
20076888252Smrg		dst += 3;
20176888252Smrg		src += srcPitch * 4;
20276888252Smrg	    }
20376888252Smrg	    srcPtr += pCir->rotate * 3;
20476888252Smrg	    dstPtr += dstPitch;
20576888252Smrg	}
20676888252Smrg
20776888252Smrg	pbox++;
20876888252Smrg    }
20976888252Smrg}
21076888252Smrg
2111ae1b5e8Smrg_X_EXPORT void
21276888252SmrgcirRefreshArea32(ScrnInfoPtr pScrn, int num, BoxPtr pbox)
21376888252Smrg{
21476888252Smrg    CirPtr pCir = CIRPTR(pScrn);
21576888252Smrg    int count, width, height, dstPitch, srcPitch;
21676888252Smrg    CARD32 *dstPtr, *srcPtr, *src, *dst;
21776888252Smrg
21876888252Smrg    dstPitch = pScrn->displayWidth;
21976888252Smrg    srcPitch = -pCir->rotate * pCir->ShadowPitch >> 2;
22076888252Smrg
22176888252Smrg    while(num--) {
22276888252Smrg	width = pbox->x2 - pbox->x1;
22376888252Smrg	height = pbox->y2 - pbox->y1;
22476888252Smrg
22576888252Smrg	if(pCir->rotate == 1) {
22676888252Smrg	    dstPtr = (CARD32*)pCir->FbBase +
22776888252Smrg			(pbox->x1 * dstPitch) + pScrn->virtualX - pbox->y2;
22876888252Smrg	    srcPtr = (CARD32*)pCir->ShadowPtr +
22976888252Smrg			((1 - pbox->y2) * srcPitch) + pbox->x1;
23076888252Smrg	} else {
23176888252Smrg	    dstPtr = (CARD32*)pCir->FbBase +
23276888252Smrg			((pScrn->virtualY - pbox->x2) * dstPitch) + pbox->y1;
23376888252Smrg	    srcPtr = (CARD32*)pCir->ShadowPtr +
23476888252Smrg			(pbox->y1 * srcPitch) + pbox->x2 - 1;
23576888252Smrg	}
23676888252Smrg
23776888252Smrg	while(width--) {
23876888252Smrg	    src = srcPtr;
23976888252Smrg	    dst = dstPtr;
24076888252Smrg	    count = height;
24176888252Smrg	    while(count--) {
24276888252Smrg		*(dst++) = *src;
24376888252Smrg		src += srcPitch;
24476888252Smrg	    }
24576888252Smrg	    srcPtr += pCir->rotate;
24676888252Smrg	    dstPtr += dstPitch;
24776888252Smrg	}
24876888252Smrg
24976888252Smrg	pbox++;
25076888252Smrg    }
25176888252Smrg}
25276888252Smrg
25376888252Smrg
25476888252Smrg
255