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