tdfx_hwcurs.c revision 02be438a
1/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/tdfx/tdfx_hwcurs.c,v 1.4 2001/04/05 21:29:17 dawes Exp $ */ 2/* 3 Voodoo Banshee driver version 1.0.2 4 5 Author: Daryll Strauss 6 7 Copyright: 1998,1999 8*/ 9 10#ifdef HAVE_CONFIG_H 11#include "config.h" 12#endif 13 14#include "xf86.h" 15#include "xf86_OSproc.h" 16#include "xf86fbman.h" 17 18#include "tdfx.h" 19 20static void TDFXLoadCursorImage(ScrnInfoPtr pScrn, unsigned char *src); 21static void TDFXShowCursor(ScrnInfoPtr pScrn); 22static void TDFXHideCursor(ScrnInfoPtr pScrn); 23static void TDFXSetCursorPosition(ScrnInfoPtr pScrn, int x, int y); 24static void TDFXSetCursorColors(ScrnInfoPtr pScrn, int bg, int fg); 25static Bool TDFXUseHWCursor(ScreenPtr pScreen, CursorPtr pCurs); 26 27Bool 28TDFXCursorInit(ScreenPtr pScreen) 29{ 30 ScrnInfoPtr pScrn; 31 TDFXPtr pTDFX; 32 xf86CursorInfoPtr infoPtr; 33 34 TDFXTRACECURS("TDFXCursorInit start\n"); 35 pScrn = xf86Screens[pScreen->myNum]; 36 pTDFX = TDFXPTR(pScrn); 37 pTDFX->CursorInfoRec = infoPtr = xf86CreateCursorInfoRec(); 38 if (!infoPtr) return FALSE; 39 40 infoPtr->MaxWidth = 64; 41 infoPtr->MaxHeight = 64; 42 43 infoPtr->Flags = 44#if X_BYTE_ORDER == X_LITTLE_ENDIAN 45HARDWARE_CURSOR_BIT_ORDER_MSBFIRST | 46#endif 47 HARDWARE_CURSOR_SWAP_SOURCE_AND_MASK| 48 HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_64 | 49 HARDWARE_CURSOR_TRUECOLOR_AT_8BPP; 50 infoPtr->SetCursorColors = TDFXSetCursorColors; 51 infoPtr->SetCursorPosition = TDFXSetCursorPosition; 52 infoPtr->LoadCursorImage = TDFXLoadCursorImage; 53 infoPtr->HideCursor = TDFXHideCursor; 54 infoPtr->ShowCursor = TDFXShowCursor; 55 infoPtr->UseHWCursor = TDFXUseHWCursor; 56 57 pTDFX->ModeReg.cursloc = pTDFX->cursorOffset; 58 pTDFX->writeLong(pTDFX, HWCURPATADDR, pTDFX->cursorOffset); 59 60 return xf86InitCursor(pScreen, infoPtr); 61} 62 63#if X_BYTE_ORDER == X_BIG_ENDIAN 64static unsigned int TDFXSwap(TDFXPtr pTDFX, unsigned int val) { 65 switch (pTDFX->cpp) { 66 default: 67 return val; 68 case 2: 69 return ((val & 0x00ff00ff) << 8) | 70 ((val & 0xff00ff00) >> 8); 71 case 3: 72 case 4: 73 return BE_BSWAP32(val); 74 } 75} 76#endif 77 78static void 79TDFXLoadCursorImage(ScrnInfoPtr pScrn, unsigned char *src) 80{ 81 TDFXPtr pTDFX; 82 83 TDFXTRACECURS("TDFXLoadCursorImage start\n"); 84 pTDFX = TDFXPTR(pScrn); 85#if X_BYTE_ORDER == X_BIG_ENDIAN 86 { 87 int i; 88 unsigned int *ptr=(unsigned int *)(pTDFX->FbBase+pTDFX->cursorOffset); 89 90 for (i=0; i<256; i++) { 91 unsigned int val = ((unsigned int *)src)[i]; 92 *ptr++ = TDFXSwap(pTDFX, val); 93 } 94 } 95#else 96 memcpy(pTDFX->FbBase+pTDFX->cursorOffset, src, 1024); 97#endif 98} 99 100static void 101TDFXShowCursor(ScrnInfoPtr pScrn) 102{ 103 TDFXPtr pTDFX; 104 105 TDFXTRACECURS("TDFXShowCursor start\n"); 106 pTDFX = TDFXPTR(pScrn); 107 pTDFX->ModeReg.vidcfg|=BIT(27); 108 pTDFX->writeLong(pTDFX, VIDPROCCFG, pTDFX->ModeReg.vidcfg); 109} 110 111void 112TDFXHideCursor(ScrnInfoPtr pScrn) 113{ 114 TDFXPtr pTDFX; 115 116 TDFXTRACECURS("TDFXHideCursor start\n"); 117 pTDFX = TDFXPTR(pScrn); 118 pTDFX->ModeReg.vidcfg&=~BIT(27); 119 pTDFX->writeLong(pTDFX, VIDPROCCFG, pTDFX->ModeReg.vidcfg); 120} 121 122static void 123TDFXSetCursorPosition(ScrnInfoPtr pScrn, int x, int y) 124{ 125 TDFXPtr pTDFX; 126 127 /* TDFXTRACECURS("TDFXSetCursorPosition start\n"); */ 128 pTDFX = TDFXPTR(pScrn); 129 pTDFX->writeLong(pTDFX, HWCURLOC, ((y+64)<<16)|(x+64)); 130} 131 132static void 133TDFXSetCursorColors(ScrnInfoPtr pScrn, int bg, int fg) 134{ 135 TDFXPtr pTDFX; 136 137 TDFXTRACECURS("TDFXSetCursorColors start\n"); 138 pTDFX = TDFXPTR(pScrn); 139 pTDFX->writeLong(pTDFX, HWCURC0, bg); 140 pTDFX->writeLong(pTDFX, HWCURC1, fg); 141} 142 143static Bool 144TDFXUseHWCursor(ScreenPtr pScreen, CursorPtr pCurs) 145{ 146 ScrnInfoPtr pScrn; 147 TDFXPtr pTDFX; 148 149 TDFXTRACECURS("TDFXUseHWCursor start\n"); 150 pScrn = xf86Screens[pScreen->myNum]; 151 pTDFX = TDFXPTR(pScrn); 152 if (pScrn->currentMode->Flags&V_DBLSCAN) 153 return FALSE; 154 if (!pTDFX->CursorInfoRec) return FALSE; 155 return TRUE; 156} 157