tdfx_hwcurs.c revision 02be438a
102be438aSmrg/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfx_hwcurs.c,v 1.4 2001/04/05 21:29:17 dawes Exp $ */ 202be438aSmrg/* 302be438aSmrg Voodoo Banshee driver version 1.0.2 402be438aSmrg 502be438aSmrg Author: Daryll Strauss 602be438aSmrg 702be438aSmrg Copyright: 1998,1999 802be438aSmrg*/ 902be438aSmrg 1002be438aSmrg#ifdef HAVE_CONFIG_H 1102be438aSmrg#include "config.h" 1202be438aSmrg#endif 1302be438aSmrg 1402be438aSmrg#include "xf86.h" 1502be438aSmrg#include "xf86_OSproc.h" 1602be438aSmrg#include "xf86fbman.h" 1702be438aSmrg 1802be438aSmrg#include "tdfx.h" 1902be438aSmrg 2002be438aSmrgstatic void TDFXLoadCursorImage(ScrnInfoPtr pScrn, unsigned char *src); 2102be438aSmrgstatic void TDFXShowCursor(ScrnInfoPtr pScrn); 2202be438aSmrgstatic void TDFXHideCursor(ScrnInfoPtr pScrn); 2302be438aSmrgstatic void TDFXSetCursorPosition(ScrnInfoPtr pScrn, int x, int y); 2402be438aSmrgstatic void TDFXSetCursorColors(ScrnInfoPtr pScrn, int bg, int fg); 2502be438aSmrgstatic Bool TDFXUseHWCursor(ScreenPtr pScreen, CursorPtr pCurs); 2602be438aSmrg 2702be438aSmrgBool 2802be438aSmrgTDFXCursorInit(ScreenPtr pScreen) 2902be438aSmrg{ 3002be438aSmrg ScrnInfoPtr pScrn; 3102be438aSmrg TDFXPtr pTDFX; 3202be438aSmrg xf86CursorInfoPtr infoPtr; 3302be438aSmrg 3402be438aSmrg TDFXTRACECURS("TDFXCursorInit start\n"); 3502be438aSmrg pScrn = xf86Screens[pScreen->myNum]; 3602be438aSmrg pTDFX = TDFXPTR(pScrn); 3702be438aSmrg pTDFX->CursorInfoRec = infoPtr = xf86CreateCursorInfoRec(); 3802be438aSmrg if (!infoPtr) return FALSE; 3902be438aSmrg 4002be438aSmrg infoPtr->MaxWidth = 64; 4102be438aSmrg infoPtr->MaxHeight = 64; 4202be438aSmrg 4302be438aSmrg infoPtr->Flags = 4402be438aSmrg#if X_BYTE_ORDER == X_LITTLE_ENDIAN 4502be438aSmrgHARDWARE_CURSOR_BIT_ORDER_MSBFIRST | 4602be438aSmrg#endif 4702be438aSmrg HARDWARE_CURSOR_SWAP_SOURCE_AND_MASK| 4802be438aSmrg HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_64 | 4902be438aSmrg HARDWARE_CURSOR_TRUECOLOR_AT_8BPP; 5002be438aSmrg infoPtr->SetCursorColors = TDFXSetCursorColors; 5102be438aSmrg infoPtr->SetCursorPosition = TDFXSetCursorPosition; 5202be438aSmrg infoPtr->LoadCursorImage = TDFXLoadCursorImage; 5302be438aSmrg infoPtr->HideCursor = TDFXHideCursor; 5402be438aSmrg infoPtr->ShowCursor = TDFXShowCursor; 5502be438aSmrg infoPtr->UseHWCursor = TDFXUseHWCursor; 5602be438aSmrg 5702be438aSmrg pTDFX->ModeReg.cursloc = pTDFX->cursorOffset; 5802be438aSmrg pTDFX->writeLong(pTDFX, HWCURPATADDR, pTDFX->cursorOffset); 5902be438aSmrg 6002be438aSmrg return xf86InitCursor(pScreen, infoPtr); 6102be438aSmrg} 6202be438aSmrg 6302be438aSmrg#if X_BYTE_ORDER == X_BIG_ENDIAN 6402be438aSmrgstatic unsigned int TDFXSwap(TDFXPtr pTDFX, unsigned int val) { 6502be438aSmrg switch (pTDFX->cpp) { 6602be438aSmrg default: 6702be438aSmrg return val; 6802be438aSmrg case 2: 6902be438aSmrg return ((val & 0x00ff00ff) << 8) | 7002be438aSmrg ((val & 0xff00ff00) >> 8); 7102be438aSmrg case 3: 7202be438aSmrg case 4: 7302be438aSmrg return BE_BSWAP32(val); 7402be438aSmrg } 7502be438aSmrg} 7602be438aSmrg#endif 7702be438aSmrg 7802be438aSmrgstatic void 7902be438aSmrgTDFXLoadCursorImage(ScrnInfoPtr pScrn, unsigned char *src) 8002be438aSmrg{ 8102be438aSmrg TDFXPtr pTDFX; 8202be438aSmrg 8302be438aSmrg TDFXTRACECURS("TDFXLoadCursorImage start\n"); 8402be438aSmrg pTDFX = TDFXPTR(pScrn); 8502be438aSmrg#if X_BYTE_ORDER == X_BIG_ENDIAN 8602be438aSmrg { 8702be438aSmrg int i; 8802be438aSmrg unsigned int *ptr=(unsigned int *)(pTDFX->FbBase+pTDFX->cursorOffset); 8902be438aSmrg 9002be438aSmrg for (i=0; i<256; i++) { 9102be438aSmrg unsigned int val = ((unsigned int *)src)[i]; 9202be438aSmrg *ptr++ = TDFXSwap(pTDFX, val); 9302be438aSmrg } 9402be438aSmrg } 9502be438aSmrg#else 9602be438aSmrg memcpy(pTDFX->FbBase+pTDFX->cursorOffset, src, 1024); 9702be438aSmrg#endif 9802be438aSmrg} 9902be438aSmrg 10002be438aSmrgstatic void 10102be438aSmrgTDFXShowCursor(ScrnInfoPtr pScrn) 10202be438aSmrg{ 10302be438aSmrg TDFXPtr pTDFX; 10402be438aSmrg 10502be438aSmrg TDFXTRACECURS("TDFXShowCursor start\n"); 10602be438aSmrg pTDFX = TDFXPTR(pScrn); 10702be438aSmrg pTDFX->ModeReg.vidcfg|=BIT(27); 10802be438aSmrg pTDFX->writeLong(pTDFX, VIDPROCCFG, pTDFX->ModeReg.vidcfg); 10902be438aSmrg} 11002be438aSmrg 11102be438aSmrgvoid 11202be438aSmrgTDFXHideCursor(ScrnInfoPtr pScrn) 11302be438aSmrg{ 11402be438aSmrg TDFXPtr pTDFX; 11502be438aSmrg 11602be438aSmrg TDFXTRACECURS("TDFXHideCursor start\n"); 11702be438aSmrg pTDFX = TDFXPTR(pScrn); 11802be438aSmrg pTDFX->ModeReg.vidcfg&=~BIT(27); 11902be438aSmrg pTDFX->writeLong(pTDFX, VIDPROCCFG, pTDFX->ModeReg.vidcfg); 12002be438aSmrg} 12102be438aSmrg 12202be438aSmrgstatic void 12302be438aSmrgTDFXSetCursorPosition(ScrnInfoPtr pScrn, int x, int y) 12402be438aSmrg{ 12502be438aSmrg TDFXPtr pTDFX; 12602be438aSmrg 12702be438aSmrg /* TDFXTRACECURS("TDFXSetCursorPosition start\n"); */ 12802be438aSmrg pTDFX = TDFXPTR(pScrn); 12902be438aSmrg pTDFX->writeLong(pTDFX, HWCURLOC, ((y+64)<<16)|(x+64)); 13002be438aSmrg} 13102be438aSmrg 13202be438aSmrgstatic void 13302be438aSmrgTDFXSetCursorColors(ScrnInfoPtr pScrn, int bg, int fg) 13402be438aSmrg{ 13502be438aSmrg TDFXPtr pTDFX; 13602be438aSmrg 13702be438aSmrg TDFXTRACECURS("TDFXSetCursorColors start\n"); 13802be438aSmrg pTDFX = TDFXPTR(pScrn); 13902be438aSmrg pTDFX->writeLong(pTDFX, HWCURC0, bg); 14002be438aSmrg pTDFX->writeLong(pTDFX, HWCURC1, fg); 14102be438aSmrg} 14202be438aSmrg 14302be438aSmrgstatic Bool 14402be438aSmrgTDFXUseHWCursor(ScreenPtr pScreen, CursorPtr pCurs) 14502be438aSmrg{ 14602be438aSmrg ScrnInfoPtr pScrn; 14702be438aSmrg TDFXPtr pTDFX; 14802be438aSmrg 14902be438aSmrg TDFXTRACECURS("TDFXUseHWCursor start\n"); 15002be438aSmrg pScrn = xf86Screens[pScreen->myNum]; 15102be438aSmrg pTDFX = TDFXPTR(pScrn); 15202be438aSmrg if (pScrn->currentMode->Flags&V_DBLSCAN) 15302be438aSmrg return FALSE; 15402be438aSmrg if (!pTDFX->CursorInfoRec) return FALSE; 15502be438aSmrg return TRUE; 15602be438aSmrg} 157