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