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