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