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