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