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