1bdcaa8d0Smrg/*
2bdcaa8d0Smrg * includes
3bdcaa8d0Smrg */
4bdcaa8d0Smrg
5bdcaa8d0Smrg#ifdef HAVE_CONFIG_H
6bdcaa8d0Smrg#include "config.h"
7bdcaa8d0Smrg#endif
8bdcaa8d0Smrg
9bdcaa8d0Smrg#include "rendition.h"
10bdcaa8d0Smrg#include "vtypes.h"
11bdcaa8d0Smrg#include "vramdac.h"
12bdcaa8d0Smrg
13bdcaa8d0Smrg#include "hwcursor.h"
14bdcaa8d0Smrg
15bdcaa8d0Smrg/*
16bdcaa8d0Smrg * defines
17bdcaa8d0Smrg */
18bdcaa8d0Smrg
19bdcaa8d0Smrg#undef DEBUG
20bdcaa8d0Smrg
21bdcaa8d0Smrg/* use a 64x64 cursor, 32x32 otherwise    */
22bdcaa8d0Smrg/* note that V2K supports only 64x64 size */
23bdcaa8d0Smrg#define BIGCURSOR 1
24bdcaa8d0Smrg
25bdcaa8d0Smrg/*
26bdcaa8d0Smrg * local function prototypes
27bdcaa8d0Smrg */
28bdcaa8d0Smrg
29bdcaa8d0Smrgstatic Bool RENDITIONUseHWCursor(ScreenPtr pScreen, CursorPtr pCurs);
30bdcaa8d0Smrgstatic void RENDITIONSetCursorColors(ScrnInfoPtr pScreenInfo, int bg, int fg);
31bdcaa8d0Smrgstatic void RENDITIONSetCursorPosition(ScrnInfoPtr pScreenInfo, int x, int y);
32bdcaa8d0Smrgstatic void RENDITIONHideCursor(ScrnInfoPtr pScreenInfo);
33bdcaa8d0Smrgstatic void RENDITIONShowCursor(ScrnInfoPtr pScreenInfo);
34bdcaa8d0Smrgstatic void RENDITIONLoadCursorImage(ScrnInfoPtr pScreenInfo, unsigned char* src);
35bdcaa8d0Smrg
36bdcaa8d0Smrg
37bdcaa8d0Smrg/*
38bdcaa8d0Smrg * This is top-level initialization funtion
39bdcaa8d0Smrg */
40bdcaa8d0Smrgvoid
41bdcaa8d0SmrgRenditionHWCursorPreInit (ScrnInfoPtr pScreenInfo)
42bdcaa8d0Smrg{
43bdcaa8d0Smrg    renditionPtr pRendition = RENDITIONPTR(pScreenInfo);
44bdcaa8d0Smrg
45bdcaa8d0Smrg#ifdef DEBUG
46bdcaa8d0Smrg    ErrorF ("Rendition: Debug RenditionHWCursorPreInit called\n");
47bdcaa8d0Smrg#endif
48bdcaa8d0Smrg
49bdcaa8d0Smrg    pRendition->board.hwcursor_used = TRUE;
50bdcaa8d0Smrg    if (pRendition->board.chip==V1000_DEVICE){
51bdcaa8d0Smrg      /* V1K uses special space on BT-485 RAMDAC */
52bdcaa8d0Smrg      pRendition->board.hwcursor_vmemsize = 0;
53bdcaa8d0Smrg      pRendition->board.hwcursor_membase = 0 ; /* Not used on V1K */
54bdcaa8d0Smrg    }
55bdcaa8d0Smrg    else{
56bdcaa8d0Smrg      pRendition->board.hwcursor_vmemsize = 64*64*2/8 /* 1024 bytes used */;
57bdcaa8d0Smrg      pRendition->board.hwcursor_membase = (pRendition->board.fbOffset >> 10);
58bdcaa8d0Smrg      /* Last but not least, update offset-adress */
59bdcaa8d0Smrg      pRendition->board.fbOffset += pRendition->board.hwcursor_vmemsize;
60bdcaa8d0Smrg    }
61bdcaa8d0Smrg}
62bdcaa8d0Smrg
63bdcaa8d0Smrgvoid
64bdcaa8d0SmrgRenditionHWCursorRelease (ScrnInfoPtr pScreenInfo)
65bdcaa8d0Smrg{
66bdcaa8d0Smrg    renditionPtr pRendition = RENDITIONPTR(pScreenInfo);
67bdcaa8d0Smrg
68bdcaa8d0Smrg#ifdef DEBUG
69bdcaa8d0Smrg    ErrorF ("Rendition: Debug RenditionHWCursorRelease called\n");
70bdcaa8d0Smrg#endif
71bdcaa8d0Smrg
72bdcaa8d0Smrg    xf86DestroyCursorInfoRec(pRendition->CursorInfoRec);
73bdcaa8d0Smrg    pRendition->CursorInfoRec=NULL;
74bdcaa8d0Smrg}
75bdcaa8d0Smrg
76bdcaa8d0Smrg
77bdcaa8d0SmrgBool
78880c7e28SmrgRenditionHWCursorInit(ScreenPtr pScreen)
79bdcaa8d0Smrg{
80880c7e28Smrg    ScrnInfoPtr  pScreenInfo = xf86ScreenToScrn(pScreen);
81bdcaa8d0Smrg    renditionPtr pRendition = RENDITIONPTR(pScreenInfo);
82bdcaa8d0Smrg    xf86CursorInfoPtr infoPtr;
83bdcaa8d0Smrg
84bdcaa8d0Smrg#ifdef DEBUG
85bdcaa8d0Smrg    ErrorF ("Rendition: Debug RenditionHWCursorInit called\n");
86bdcaa8d0Smrg#endif
87bdcaa8d0Smrg
88bdcaa8d0Smrg    infoPtr = xf86CreateCursorInfoRec();
89bdcaa8d0Smrg    if(!infoPtr) return FALSE;
90bdcaa8d0Smrg
91bdcaa8d0Smrg    pRendition->CursorInfoRec = infoPtr;
92bdcaa8d0Smrg
93bdcaa8d0Smrg#ifdef BIGCURSOR
94bdcaa8d0Smrg    infoPtr->MaxWidth=64;
95bdcaa8d0Smrg    infoPtr->MaxHeight=64;
96bdcaa8d0Smrg#else
97bdcaa8d0Smrg    infoPtr->MaxWidth=32;
98bdcaa8d0Smrg    infoPtr->MaxHeight=32;
99bdcaa8d0Smrg#endif
100bdcaa8d0Smrg
101bdcaa8d0Smrg    infoPtr->Flags = HARDWARE_CURSOR_BIT_ORDER_MSBFIRST  |
102bdcaa8d0Smrg	HARDWARE_CURSOR_TRUECOLOR_AT_8BPP   |
103bdcaa8d0Smrg	HARDWARE_CURSOR_AND_SOURCE_WITH_MASK|
104bdcaa8d0Smrg	HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_8;
105bdcaa8d0Smrg
106bdcaa8d0Smrg
107bdcaa8d0Smrg    infoPtr->SetCursorColors      = RENDITIONSetCursorColors;
108bdcaa8d0Smrg    infoPtr->SetCursorPosition    = RENDITIONSetCursorPosition;
109bdcaa8d0Smrg    infoPtr->LoadCursorImage      = RENDITIONLoadCursorImage;
110bdcaa8d0Smrg    infoPtr->HideCursor           = RENDITIONHideCursor;
111bdcaa8d0Smrg    infoPtr->ShowCursor           = RENDITIONShowCursor;
112bdcaa8d0Smrg    infoPtr->UseHWCursor          = RENDITIONUseHWCursor;
113bdcaa8d0Smrg
114bdcaa8d0Smrg    return xf86InitCursor(pScreen, infoPtr);
115bdcaa8d0Smrg}
116bdcaa8d0Smrg
117bdcaa8d0Smrg
118bdcaa8d0Smrg/*
119bdcaa8d0Smrg * local functions
120bdcaa8d0Smrg */
121bdcaa8d0Smrg
122bdcaa8d0Smrgstatic Bool
123bdcaa8d0SmrgRENDITIONUseHWCursor(ScreenPtr pScreen, CursorPtr pCurs)
124bdcaa8d0Smrg{
125bdcaa8d0Smrg#ifdef DEBUG
126bdcaa8d0Smrg    ErrorF ("Rendition: Debug RENDITIONUseHWCursor called\n");
127bdcaa8d0Smrg#endif
128bdcaa8d0Smrg
129bdcaa8d0Smrg  /* have this return false for DoubleScan and Interlaced ? */
130bdcaa8d0Smrg    return TRUE;
131bdcaa8d0Smrg}
132bdcaa8d0Smrg
133bdcaa8d0Smrg
134bdcaa8d0Smrgstatic void
135bdcaa8d0SmrgRENDITIONShowCursor(ScrnInfoPtr pScreenInfo)
136bdcaa8d0Smrg{
137bdcaa8d0Smrg  /* renditionPtr pRendition = RENDITIONPTR(pScreenInfo); */
138bdcaa8d0Smrg
139bdcaa8d0Smrg#ifdef DEBUG
140bdcaa8d0Smrg    ErrorF( "RENDITION: ShowCursor called\n");
141bdcaa8d0Smrg#endif
142bdcaa8d0Smrg
143bdcaa8d0Smrg    /* enable cursor - X11 mode */
144bdcaa8d0Smrg    verite_enablecursor(pScreenInfo, VERITE_3COLORS,
145bdcaa8d0Smrg#ifdef BIGCURSOR
146bdcaa8d0Smrg        VERITE_CURSOR64
147bdcaa8d0Smrg#else
148bdcaa8d0Smrg        VERITE_CURSOR32
149bdcaa8d0Smrg#endif
150bdcaa8d0Smrg        );
151bdcaa8d0Smrg}
152bdcaa8d0Smrg
153bdcaa8d0Smrg
154bdcaa8d0Smrg
155bdcaa8d0Smrgstatic void
156bdcaa8d0SmrgRENDITIONHideCursor(ScrnInfoPtr pScreenInfo)
157bdcaa8d0Smrg{
158bdcaa8d0Smrg#ifdef DEBUG
159bdcaa8d0Smrg    ErrorF( "RENDITION: HideCursor called\n");
160bdcaa8d0Smrg#endif
161bdcaa8d0Smrg
162bdcaa8d0Smrg    /* Disable cursor */
163bdcaa8d0Smrg    verite_enablecursor(pScreenInfo, VERITE_NOCURSOR, 0);
164bdcaa8d0Smrg}
165bdcaa8d0Smrg
166bdcaa8d0Smrg
167bdcaa8d0Smrg
168bdcaa8d0Smrgstatic void
169bdcaa8d0SmrgRENDITIONSetCursorPosition(ScrnInfoPtr pScreenInfo, int x, int y)
170bdcaa8d0Smrg{
171bdcaa8d0Smrg#ifdef DEBUG
172bdcaa8d0Smrg    ErrorF( "RENDITION: SetCursorPosition(%d, %d) called\n", x, y);
173bdcaa8d0Smrg#endif
174bdcaa8d0Smrg
175bdcaa8d0Smrg    verite_movecursor(pScreenInfo, x, y, 1 /* xorigin */, 1 /* yorigin */);
176bdcaa8d0Smrg}
177bdcaa8d0Smrg
178bdcaa8d0Smrg
179bdcaa8d0Smrg
180bdcaa8d0Smrgstatic void
181bdcaa8d0SmrgRENDITIONSetCursorColors(ScrnInfoPtr pScreenInfo, int bg, int fg)
182bdcaa8d0Smrg{
183bdcaa8d0Smrg#ifdef DEBUG
184bdcaa8d0Smrg    ErrorF( "RENDITION: SetCursorColors(%x, %x) called\n", fg, bg);
185bdcaa8d0Smrg#endif
186bdcaa8d0Smrg
187bdcaa8d0Smrg    verite_setcursorcolor(pScreenInfo, bg, fg);
188bdcaa8d0Smrg}
189bdcaa8d0Smrg
190bdcaa8d0Smrg
191bdcaa8d0Smrg
192bdcaa8d0Smrgstatic void
193bdcaa8d0SmrgRENDITIONLoadCursorImage(ScrnInfoPtr pScreenInfo, unsigned char* src)
194bdcaa8d0Smrg{
195bdcaa8d0Smrg#ifdef DEBUG
196bdcaa8d0Smrg    ErrorF( "RENDITION: loadcursor called\n");
197bdcaa8d0Smrg#endif
198bdcaa8d0Smrg    verite_loadcursor(pScreenInfo,
199bdcaa8d0Smrg#ifdef BIGCURSOR
200bdcaa8d0Smrg        VERITE_CURSOR64,
201bdcaa8d0Smrg#else
202bdcaa8d0Smrg        VERITE_CURSOR32,
203bdcaa8d0Smrg#endif
204bdcaa8d0Smrg        (vu8 *)src);
205bdcaa8d0Smrg}
206bdcaa8d0Smrg
207bdcaa8d0Smrg
208bdcaa8d0Smrg/*
209bdcaa8d0Smrg * end of file hwcursor.c
210bdcaa8d0Smrg */
211