sunCfb.c revision cb17d216
1b9325ec5Stsutsui
2b9325ec5Stsutsui/* $Xorg: sunCfb.c,v 1.5 2001/02/09 02:04:43 xorgcvs Exp $ */
3b9325ec5Stsutsui
4b9325ec5Stsutsui/*
5b9325ec5StsutsuiCopyright 1990, 1998  The Open Group
6b9325ec5Stsutsui
7b9325ec5StsutsuiPermission to use, copy, modify, distribute, and sell this software and its
8b9325ec5Stsutsuidocumentation for any purpose is hereby granted without fee, provided that
9b9325ec5Stsutsuithe above copyright notice appear in all copies and that both that
10b9325ec5Stsutsuicopyright notice and this permission notice appear in supporting
11b9325ec5Stsutsuidocumentation.
12b9325ec5Stsutsui
13b9325ec5StsutsuiThe above copyright notice and this permission notice shall be included in
14b9325ec5Stsutsuiall copies or substantial portions of the Software.
15b9325ec5Stsutsui
16b9325ec5StsutsuiTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17b9325ec5StsutsuiIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18b9325ec5StsutsuiFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
19b9325ec5StsutsuiOPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
20b9325ec5StsutsuiAN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21b9325ec5StsutsuiCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22b9325ec5Stsutsui
23b9325ec5StsutsuiExcept as contained in this notice, the name of The Open Group shall not be
24b9325ec5Stsutsuiused in advertising or otherwise to promote the sale, use or other dealings
25b9325ec5Stsutsuiin this Software without prior written authorization from The Open Group.
26b9325ec5Stsutsui */
27b9325ec5Stsutsui
28b9325ec5Stsutsui/************************************************************
29b9325ec5StsutsuiCopyright 1987 by Sun Microsystems, Inc. Mountain View, CA.
30b9325ec5Stsutsui
31b9325ec5Stsutsui                    All Rights Reserved
32b9325ec5Stsutsui
33b9325ec5StsutsuiPermission  to  use,  copy,  modify,  and  distribute   this
34b9325ec5Stsutsuisoftware  and  its documentation for any purpose and without
35b9325ec5Stsutsuifee is hereby granted, provided that the above copyright no-
36b9325ec5Stsutsuitice  appear  in all copies and that both that copyright no-
37b9325ec5Stsutsuitice and this permission notice appear in  supporting  docu-
38b9325ec5Stsutsuimentation,  and  that the names of Sun or The Open Group
39b9325ec5Stsutsuinot be used in advertising or publicity pertaining to
40b9325ec5Stsutsuidistribution  of  the software  without specific prior
41b9325ec5Stsutsuiwritten permission. Sun and The Open Group make no
42b9325ec5Stsutsuirepresentations about the suitability of this software for
43b9325ec5Stsutsuiany purpose. It is provided "as is" without any express or
44b9325ec5Stsutsuiimplied warranty.
45b9325ec5Stsutsui
46b9325ec5StsutsuiSUN DISCLAIMS ALL WARRANTIES WITH REGARD TO  THIS  SOFTWARE,
47b9325ec5StsutsuiINCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FIT-
48b9325ec5StsutsuiNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SUN BE  LI-
49b9325ec5StsutsuiABLE  FOR  ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
50b9325ec5StsutsuiANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,  DATA  OR
51b9325ec5StsutsuiPROFITS,  WHETHER  IN  AN  ACTION OF CONTRACT, NEGLIGENCE OR
52b9325ec5StsutsuiOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
53b9325ec5StsutsuiTHE USE OR PERFORMANCE OF THIS SOFTWARE.
54b9325ec5Stsutsui
55b9325ec5Stsutsui********************************************************/
56b9325ec5Stsutsui
57b9325ec5Stsutsui/* $XFree86: xc/programs/Xserver/hw/sun/sunCfb.c,v 3.15 2003/10/07 21:43:09 herrb Exp $ */
58b9325ec5Stsutsui
59b9325ec5Stsutsui/*
60b9325ec5Stsutsui * Copyright 1987 by the Regents of the University of California
61b9325ec5Stsutsui * Copyright 1987 by Adam de Boor, UC Berkeley
62b9325ec5Stsutsui *
63b9325ec5Stsutsui * Permission to use, copy, modify, and distribute this
64b9325ec5Stsutsui * software and its documentation for any purpose and without
65b9325ec5Stsutsui * fee is hereby granted, provided that the above copyright
66b9325ec5Stsutsui * notice appear in all copies.  The University of California
67b9325ec5Stsutsui * makes no representations about the suitability of this
68b9325ec5Stsutsui * software for any purpose.  It is provided "as is" without
69b9325ec5Stsutsui * express or implied warranty.
70b9325ec5Stsutsui */
71b9325ec5Stsutsui
72b9325ec5Stsutsui/****************************************************************/
73b9325ec5Stsutsui/* Modified from  sunCG4C.c for X11R3 by Tom Jarmolowski	*/
74b9325ec5Stsutsui/****************************************************************/
75b9325ec5Stsutsui
76b9325ec5Stsutsui/*
77b9325ec5Stsutsui * Copyright 1991, 1992, 1993 Kaleb S. Keithley
78b9325ec5Stsutsui *
79b9325ec5Stsutsui * Permission to use, copy, modify, and distribute this
80b9325ec5Stsutsui * software and its documentation for any purpose and without
81b9325ec5Stsutsui * fee is hereby granted, provided that the above copyright
82b9325ec5Stsutsui * notice appear in all copies.  Kaleb S. Keithley makes no
83b9325ec5Stsutsui * representations about the suitability of this software for
84b9325ec5Stsutsui * any purpose.  It is provided "as is" without express or
85b9325ec5Stsutsui * implied warranty.
86b9325ec5Stsutsui */
87b9325ec5Stsutsui
88b9325ec5Stsutsui#include "sun.h"
89b9325ec5Stsutsui#include "fb.h"
90b9325ec5Stsutsui#include "miline.h"
91b9325ec5Stsutsui
92b9325ec5Stsutsui#define GXZEROLINEBIAS	(OCTANT1 | OCTANT3 | OCTANT4 | OCTANT6)
93b9325ec5Stsutsui
94b9325ec5Stsutsuistatic void CGUpdateColormap(ScreenPtr, int, int, u_char *, u_char *, u_char *);
95b9325ec5Stsutsuistatic void CGGetColormap(ScreenPtr, int, int, u_char *, u_char *, u_char *);
96b9325ec5Stsutsuistatic void CGStoreColors(ColormapPtr, int, xColorItem *);
97cb17d216Stsutsuistatic void CGSaveColormap(ScreenPtr);
98cb17d216Stsutsuistatic void CGRestoreColormap(ScreenPtr);
99cb17d216Stsutsuistatic void CGScreenInitCommon(ScreenPtr);
100b9325ec5Stsutsuistatic void CGScreenInit(ScreenPtr);
101b9325ec5Stsutsuistatic void checkMono(int, char **);
102cb17d216Stsutsui#ifdef INCLUDE_CG2_HEADER
103cb17d216Stsutsuistatic void CG2UpdateColormap(ScreenPtr, int, int, u_char *, u_char *, u_char *);
104cb17d216Stsutsuistatic void CG2GetColormap(ScreenPtr, int, int, u_char *, u_char *, u_char *);
105cb17d216Stsutsuistatic void CG2RestoreColormap(ScreenPtr);
106cb17d216Stsutsuistatic Bool CG2SaveScreen(ScreenPtr, int);
107cb17d216Stsutsuistatic void CG2ScreenInit(ScreenPtr pScreen);
108cb17d216Stsutsui#endif
109b9325ec5Stsutsuistatic void CG4Switch(ScreenPtr, int);
110b9325ec5Stsutsui
111b9325ec5Stsutsuistatic void
112b9325ec5StsutsuiCGUpdateColormap(ScreenPtr pScreen, int dex, int count, u_char *rmap, u_char *gmap, u_char *bmap)
113b9325ec5Stsutsui{
114b9325ec5Stsutsui    struct fbcmap sunCmap;
115b9325ec5Stsutsui
116b9325ec5Stsutsui    sunCmap.index = dex;
117b9325ec5Stsutsui    sunCmap.count = count;
118b9325ec5Stsutsui    sunCmap.red = &rmap[dex];
119b9325ec5Stsutsui    sunCmap.green = &gmap[dex];
120b9325ec5Stsutsui    sunCmap.blue = &bmap[dex];
121b9325ec5Stsutsui
122b9325ec5Stsutsui    if (ioctl(sunFbs[pScreen->myNum].fd, FBIOPUTCMAP, &sunCmap) < 0) {
123b9325ec5Stsutsui	Error("CGUpdateColormap");
124b9325ec5Stsutsui	FatalError( "CGUpdateColormap: FBIOPUTCMAP failed\n" );
125b9325ec5Stsutsui    }
126b9325ec5Stsutsui}
127b9325ec5Stsutsui
128b9325ec5Stsutsuistatic void
129b9325ec5StsutsuiCGGetColormap(ScreenPtr pScreen, int dex, int count, u_char *rmap, u_char *gmap, u_char *bmap)
130b9325ec5Stsutsui{
131b9325ec5Stsutsui    struct fbcmap sunCmap;
132b9325ec5Stsutsui
133b9325ec5Stsutsui    sunCmap.index = dex;
134b9325ec5Stsutsui    sunCmap.count = count;
135b9325ec5Stsutsui    sunCmap.red = &rmap[dex];
136b9325ec5Stsutsui    sunCmap.green = &gmap[dex];
137b9325ec5Stsutsui    sunCmap.blue = &bmap[dex];
138b9325ec5Stsutsui
139b9325ec5Stsutsui    if (ioctl(sunFbs[pScreen->myNum].fd, FBIOGETCMAP, &sunCmap) < 0) {
140b9325ec5Stsutsui	Error("CGGetColormap");
141b9325ec5Stsutsui	FatalError( "CGGetColormap: FBIOGETCMAP failed\n" );
142b9325ec5Stsutsui    }
143b9325ec5Stsutsui}
144b9325ec5Stsutsui
145b9325ec5Stsutsuivoid
146b9325ec5StsutsuisunInstallColormap(ColormapPtr cmap)
147b9325ec5Stsutsui{
148b9325ec5Stsutsui    sunScreenPtr pPrivate = sunGetScreenPrivate(cmap->pScreen);
149b9325ec5Stsutsui    register int i;
150b9325ec5Stsutsui    register Entry *pent;
151b9325ec5Stsutsui    register VisualPtr pVisual = cmap->pVisual;
152b9325ec5Stsutsui    u_char	  rmap[256], gmap[256], bmap[256];
153b9325ec5Stsutsui    unsigned long rMask, gMask, bMask;
154b9325ec5Stsutsui    int	oRed, oGreen, oBlue;
155b9325ec5Stsutsui
156b9325ec5Stsutsui    if (cmap == pPrivate->installedMap)
157b9325ec5Stsutsui	return;
158b9325ec5Stsutsui    if (pPrivate->installedMap)
159b9325ec5Stsutsui	WalkTree(pPrivate->installedMap->pScreen, TellLostMap,
160b9325ec5Stsutsui		 (pointer) &(pPrivate->installedMap->mid));
161b9325ec5Stsutsui    if ((pVisual->class | DynamicClass) == DirectColor) {
162b9325ec5Stsutsui	if (pVisual->ColormapEntries < 256) {
163b9325ec5Stsutsui	    rMask = pVisual->redMask;
164b9325ec5Stsutsui	    gMask = pVisual->greenMask;
165b9325ec5Stsutsui	    bMask = pVisual->blueMask;
166b9325ec5Stsutsui	    oRed = pVisual->offsetRed;
167b9325ec5Stsutsui	    oGreen = pVisual->offsetGreen;
168b9325ec5Stsutsui	    oBlue = pVisual->offsetBlue;
169b9325ec5Stsutsui	} else {
170b9325ec5Stsutsui	    rMask = gMask = bMask = 255;
171b9325ec5Stsutsui	    oRed = oGreen = oBlue = 0;
172b9325ec5Stsutsui	}
173b9325ec5Stsutsui	for (i = 0; i < 256; i++) {
174b9325ec5Stsutsui	    rmap[i] = cmap->red[(i & rMask) >> oRed].co.local.red >> 8;
175b9325ec5Stsutsui	    gmap[i] = cmap->green[(i & gMask) >> oGreen].co.local.green >> 8;
176b9325ec5Stsutsui	    bmap[i] = cmap->blue[(i & bMask) >> oBlue].co.local.blue >> 8;
177b9325ec5Stsutsui	}
178b9325ec5Stsutsui    } else {
179b9325ec5Stsutsui	(*pPrivate->GetColormap) (cmap->pScreen, 0, 256, rmap, gmap, bmap);
180b9325ec5Stsutsui	for (i = 0, pent = cmap->red;
181b9325ec5Stsutsui	     i < pVisual->ColormapEntries;
182b9325ec5Stsutsui	     i++, pent++) {
183b9325ec5Stsutsui	    if (pent->fShared) {
184b9325ec5Stsutsui		rmap[i] = pent->co.shco.red->color >> 8;
185b9325ec5Stsutsui		gmap[i] = pent->co.shco.green->color >> 8;
186b9325ec5Stsutsui		bmap[i] = pent->co.shco.blue->color >> 8;
187b9325ec5Stsutsui	    }
188b9325ec5Stsutsui	    else if (pent->refcnt != 0) {
189b9325ec5Stsutsui		rmap[i] = pent->co.local.red >> 8;
190b9325ec5Stsutsui		gmap[i] = pent->co.local.green >> 8;
191b9325ec5Stsutsui		bmap[i] = pent->co.local.blue >> 8;
192b9325ec5Stsutsui	    }
193b9325ec5Stsutsui	}
194b9325ec5Stsutsui    }
195b9325ec5Stsutsui    pPrivate->installedMap = cmap;
196b9325ec5Stsutsui    (*pPrivate->UpdateColormap) (cmap->pScreen, 0, 256, rmap, gmap, bmap);
197b9325ec5Stsutsui    WalkTree(cmap->pScreen, TellGainedMap, (pointer) &(cmap->mid));
198b9325ec5Stsutsui}
199b9325ec5Stsutsui
200b9325ec5Stsutsuivoid
201b9325ec5StsutsuisunUninstallColormap(ColormapPtr cmap)
202b9325ec5Stsutsui{
203b9325ec5Stsutsui    sunScreenPtr pPrivate = sunGetScreenPrivate(cmap->pScreen);
204b9325ec5Stsutsui    if (cmap == pPrivate->installedMap) {
205b9325ec5Stsutsui	Colormap defMapID = cmap->pScreen->defColormap;
206b9325ec5Stsutsui
207b9325ec5Stsutsui	if (cmap->mid != defMapID) {
208b9325ec5Stsutsui	    ColormapPtr defMap = (ColormapPtr) LookupIDByType(defMapID,
209b9325ec5Stsutsui							      RT_COLORMAP);
210b9325ec5Stsutsui
211b9325ec5Stsutsui	    if (defMap)
212b9325ec5Stsutsui		(*cmap->pScreen->InstallColormap)(defMap);
213b9325ec5Stsutsui	    else
214b9325ec5Stsutsui	        ErrorF("sunFbs: Can't find default colormap\n");
215b9325ec5Stsutsui	}
216b9325ec5Stsutsui    }
217b9325ec5Stsutsui}
218b9325ec5Stsutsui
219b9325ec5Stsutsuiint
220b9325ec5StsutsuisunListInstalledColormaps(ScreenPtr pScreen, Colormap *pCmapList)
221b9325ec5Stsutsui{
222b9325ec5Stsutsui    sunScreenPtr pPrivate = sunGetScreenPrivate(pScreen);
223b9325ec5Stsutsui    *pCmapList = pPrivate->installedMap->mid;
224b9325ec5Stsutsui    return (1);
225b9325ec5Stsutsui}
226b9325ec5Stsutsui
227b9325ec5Stsutsuistatic void
228b9325ec5StsutsuiCGStoreColors(ColormapPtr pmap, int ndef, xColorItem *pdefs)
229b9325ec5Stsutsui{
230b9325ec5Stsutsui    sunScreenPtr pPrivate = sunGetScreenPrivate(pmap->pScreen);
231b9325ec5Stsutsui    u_char	rmap[256], gmap[256], bmap[256];
232b9325ec5Stsutsui    xColorItem	expanddefs[256];
233b9325ec5Stsutsui    register int i;
234b9325ec5Stsutsui
235b9325ec5Stsutsui    if (pPrivate->installedMap != NULL && pPrivate->installedMap != pmap)
236b9325ec5Stsutsui	return;
237b9325ec5Stsutsui    if ((pmap->pVisual->class | DynamicClass) == DirectColor) {
238b9325ec5Stsutsui	ndef = fbExpandDirectColors(pmap, ndef, pdefs, expanddefs);
239b9325ec5Stsutsui	pdefs = expanddefs;
240b9325ec5Stsutsui    }
241b9325ec5Stsutsui    while (ndef--) {
242b9325ec5Stsutsui	i = pdefs->pixel;
243b9325ec5Stsutsui	rmap[i] = pdefs->red >> 8;
244b9325ec5Stsutsui	gmap[i] = pdefs->green >> 8;
245b9325ec5Stsutsui	bmap[i] = pdefs->blue >> 8;
246b9325ec5Stsutsui	(*pPrivate->UpdateColormap) (pmap->pScreen, i, 1, rmap, gmap, bmap);
247b9325ec5Stsutsui	pdefs++;
248b9325ec5Stsutsui    }
249b9325ec5Stsutsui}
250b9325ec5Stsutsui
251b9325ec5Stsutsuistatic void
252cb17d216StsutsuiCGSaveColormap(ScreenPtr pScreen)
253b9325ec5Stsutsui{
254b9325ec5Stsutsui    sunScreenPtr pPrivate = sunGetScreenPrivate(pScreen);
255cb17d216Stsutsui    sunCmapPtr origColormap;
256cb17d216Stsutsui    u_char *rmap, *gmap, *bmap;
257cb17d216Stsutsui
258cb17d216Stsutsui    origColormap = &pPrivate->origColormap;
259cb17d216Stsutsui    rmap = origColormap->origRed;
260cb17d216Stsutsui    gmap = origColormap->origGreen;
261cb17d216Stsutsui    bmap = origColormap->origBlue;
262cb17d216Stsutsui    (*pPrivate->GetColormap)(pScreen, 0, NCMAP, rmap, gmap, bmap);
263cb17d216Stsutsui}
264cb17d216Stsutsui
265cb17d216Stsutsuistatic void
266cb17d216StsutsuiCGRestoreColormap(ScreenPtr pScreen)
267cb17d216Stsutsui{
268cb17d216Stsutsui    sunScreenPtr pPrivate = sunGetScreenPrivate(pScreen);
269cb17d216Stsutsui    sunCmapPtr origColormap;
270cb17d216Stsutsui    u_char *rmap, *gmap, *bmap;
271cb17d216Stsutsui
272cb17d216Stsutsui    if (pPrivate->origColormapValid) {
273cb17d216Stsutsui	origColormap = &pPrivate->origColormap;
274cb17d216Stsutsui	rmap = origColormap->origRed;
275cb17d216Stsutsui	gmap = origColormap->origGreen;
276cb17d216Stsutsui	bmap = origColormap->origBlue;
277cb17d216Stsutsui	(*pPrivate->UpdateColormap)(pScreen, 0, NCMAP, rmap, gmap, bmap);
278cb17d216Stsutsui    }
279cb17d216Stsutsui}
280cb17d216Stsutsui
281cb17d216Stsutsuistatic void
282cb17d216StsutsuiCGScreenInitCommon(ScreenPtr pScreen)
283cb17d216Stsutsui{
284b9325ec5Stsutsui    pScreen->InstallColormap = sunInstallColormap;
285b9325ec5Stsutsui    pScreen->UninstallColormap = sunUninstallColormap;
286b9325ec5Stsutsui    pScreen->ListInstalledColormaps = sunListInstalledColormaps;
287b9325ec5Stsutsui    pScreen->StoreColors = CGStoreColors;
288b9325ec5Stsutsui    if (sunFlipPixels) {
289b9325ec5Stsutsui	Pixel pixel = pScreen->whitePixel;
290b9325ec5Stsutsui	pScreen->whitePixel = pScreen->blackPixel;
291b9325ec5Stsutsui	pScreen->blackPixel = pixel;
292b9325ec5Stsutsui    }
293cb17d216Stsutsui}
294cb17d216Stsutsui
295cb17d216Stsutsuistatic void
296cb17d216StsutsuiCGScreenInit(ScreenPtr pScreen)
297cb17d216Stsutsui{
298cb17d216Stsutsui    sunScreenPtr pPrivate = sunGetScreenPrivate(pScreen);
299cb17d216Stsutsui
300cb17d216Stsutsui    CGScreenInitCommon(pScreen);
301cb17d216Stsutsui    pPrivate->UpdateColormap = CGUpdateColormap;
302cb17d216Stsutsui    pPrivate->GetColormap = CGGetColormap;
303cb17d216Stsutsui    pPrivate->RestoreColormap = CGRestoreColormap;
304cb17d216Stsutsui
305cb17d216Stsutsui    CGSaveColormap(pScreen);
306cb17d216Stsutsui    pPrivate->origColormapValid = TRUE;
307b9325ec5Stsutsui}
308b9325ec5Stsutsui
309b9325ec5Stsutsuistatic void
310b9325ec5StsutsuicheckMono(int argc, char** argv)
311b9325ec5Stsutsui{
312b9325ec5Stsutsui    int i;
313b9325ec5Stsutsui
314b9325ec5Stsutsui    for (i = 1; i < argc; i++)
315b9325ec5Stsutsui	if (strcmp (argv[i], "-mono") == 0)
316b9325ec5Stsutsui	    ErrorF ("-mono not appropriate for CG3/CG4/CG6\n");
317b9325ec5Stsutsui}
318b9325ec5Stsutsui
319b9325ec5Stsutsui/*
320b9325ec5Stsutsui * CG3_MMAP_OFFSET is #defined in <pixrect/cg3var.h> or <sys/cg3var.h>
321b9325ec5Stsutsui * on  SunOS and Solaris respectively.  Under Solaris, cg3var.h
322b9325ec5Stsutsui * #includes a non-existent file, and causes the make to abort.  Other
323b9325ec5Stsutsui * systems may not have cg3var.h at all.  Since all cg3var.h is needed
324b9325ec5Stsutsui * for is this one #define, we'll just #define it here and let it go at that.
325b9325ec5Stsutsui */
326b9325ec5Stsutsui
327b9325ec5Stsutsui#define CG3_MMAP_OFFSET 0x04000000
328b9325ec5Stsutsui
329b9325ec5StsutsuiBool
330b9325ec5StsutsuisunCG3Init(
331b9325ec5Stsutsui    int	    	  screen,    	/* what screen am I going to be */
332b9325ec5Stsutsui    ScreenPtr	  pScreen,  	/* The Screen to initialize */
333b9325ec5Stsutsui    int	    	  argc,	    	/* The number of the Server's arguments. */
334b9325ec5Stsutsui    char    	  **argv   	/* The arguments themselves. Don't change! */
335b9325ec5Stsutsui)
336b9325ec5Stsutsui{
337b9325ec5Stsutsui    checkMono (argc, argv);
338b9325ec5Stsutsui    sunFbs[screen].EnterLeave = (void (*)(ScreenPtr, int))NoopDDA;
339b9325ec5Stsutsui    return sunInitCommon (screen, pScreen, (off_t) CG3_MMAP_OFFSET,
340b9325ec5Stsutsui	sunCfbScreenInit, CGScreenInit,
341b9325ec5Stsutsui	fbCreateDefColormap, sunSaveScreen, 0);
342b9325ec5Stsutsui}
343b9325ec5Stsutsui
344b9325ec5StsutsuiBool
345b9325ec5StsutsuisunTCXInit(
346b9325ec5Stsutsui    int	    	  screen,    	/* what screen am I going to be */
347b9325ec5Stsutsui    ScreenPtr	  pScreen,  	/* The Screen to initialize */
348b9325ec5Stsutsui    int	    	  argc,	    	/* The number of the Server's arguments. */
349b9325ec5Stsutsui    char    	  **argv   	/* The arguments themselves. Don't change! */
350b9325ec5Stsutsui)
351b9325ec5Stsutsui{
352b9325ec5Stsutsui    checkMono (argc, argv);
353b9325ec5Stsutsui    sunFbs[screen].EnterLeave = (void (*)(ScreenPtr, int))NoopDDA;
354b9325ec5Stsutsui    return sunInitCommon (screen, pScreen, (off_t) 0,
355b9325ec5Stsutsui	sunCfbScreenInit, CGScreenInit,
356b9325ec5Stsutsui	fbCreateDefColormap, sunSaveScreen, 0);
357b9325ec5Stsutsui}
358b9325ec5Stsutsui
359b9325ec5Stsutsui#if !defined(i386) /* { */
360b9325ec5Stsutsui
361b9325ec5Stsutsui#ifdef SVR4 /* { */
362b9325ec5Stsutsui#ifdef INCLUDE_CG2_HEADER /* { */
363b9325ec5Stsutsui#include <sys/cg2reg.h>
364b9325ec5Stsutsui#endif /* } INCLUDE_CG2_HEADER */
365b9325ec5Stsutsui#else
366b9325ec5Stsutsui#ifndef CSRG_BASED /* { */
367b9325ec5Stsutsui#include <pixrect/cg2reg.h>
368b9325ec5Stsutsui#else
369b9325ec5Stsutsui#if defined(__sparc__) || defined(__sparc) /* { */
370b9325ec5Stsutsui#if !defined(__bsdi__)
371b9325ec5Stsutsui#include <machine/cgtworeg.h>
372b9325ec5Stsutsui#endif
373b9325ec5Stsutsui#else
374b9325ec5Stsutsui#include <machine/cg2reg.h>
375b9325ec5Stsutsui#endif /* } */
376b9325ec5Stsutsui#endif /* } */
377b9325ec5Stsutsui#endif /* } */
378b9325ec5Stsutsui
379b9325ec5Stsutsui#ifdef INCLUDE_CG2_HEADER
380b9325ec5Stsutsuitypedef struct {
381b9325ec5Stsutsui    struct cg2memfb	mem;
382b9325ec5Stsutsui    struct cg2fb 	regs;
383b9325ec5Stsutsui} *CG2Ptr;
384b9325ec5Stsutsui
385b9325ec5Stsutsuistatic void
386b9325ec5StsutsuiCG2UpdateColormap(ScreenPtr pScreen, int index, int count, u_char *rmap, u_char *gmap, u_char *bmap)
387b9325ec5Stsutsui{
388b9325ec5Stsutsui    CG2Ptr	fb = (CG2Ptr) sunFbs[pScreen->myNum].fb;
389b9325ec5Stsutsui    volatile struct cg2statusreg *regp = &fb->regs.status.reg;
390b9325ec5Stsutsui
391b9325ec5Stsutsui    regp->update_cmap = 0;
392b9325ec5Stsutsui    while (count--) {
393b9325ec5Stsutsui	fb->regs.redmap[index] = rmap[index];
394b9325ec5Stsutsui	fb->regs.greenmap[index] = gmap[index];
395b9325ec5Stsutsui	fb->regs.bluemap[index] = bmap[index];
396b9325ec5Stsutsui	index++;
397b9325ec5Stsutsui    }
398b9325ec5Stsutsui    regp->update_cmap = 1;
399b9325ec5Stsutsui}
400b9325ec5Stsutsui
401b9325ec5Stsutsuistatic void
402b9325ec5StsutsuiCG2GetColormap(ScreenPtr pScreen, int index, int count, u_char *rmap, u_char *gmap, u_char *bmap)
403b9325ec5Stsutsui{
404b9325ec5Stsutsui    CG2Ptr	fb = (CG2Ptr) sunFbs[pScreen->myNum].fb;
405b9325ec5Stsutsui
406b9325ec5Stsutsui    /* I don't even know if this works */
407b9325ec5Stsutsui    while (count--) {
408b9325ec5Stsutsui	rmap[index] = fb->regs.redmap[index];
409b9325ec5Stsutsui	gmap[index] = fb->regs.greenmap[index];
410b9325ec5Stsutsui	bmap[index] = fb->regs.bluemap[index];
411b9325ec5Stsutsui	index++;
412b9325ec5Stsutsui    }
413b9325ec5Stsutsui}
414b9325ec5Stsutsui
415cb17d216Stsutsuistatic void
416cb17d216StsutsuiCG2RestoreColormap(ScreenPtr pScreen)
417cb17d216Stsutsui{
418cb17d216Stsutsui    int screen = pScreen->myNum;
419cb17d216Stsutsui
420cb17d216Stsutsui    CGRestoreColormap(pScreen);
421cb17d216Stsutsui    ((CG2Ptr)sunFbs[screen].fb)->regs.ppmask.reg = 1;
422cb17d216Stsutsui}
423cb17d216Stsutsui
424b9325ec5Stsutsuistatic Bool
425b9325ec5StsutsuiCG2SaveScreen(ScreenPtr pScreen, int on)
426b9325ec5Stsutsui{
427b9325ec5Stsutsui    CG2Ptr	fb = (CG2Ptr) sunFbs[pScreen->myNum].fb;
428b9325ec5Stsutsui    volatile struct cg2statusreg *regp = &fb->regs.status.reg;
429b9325ec5Stsutsui
430b9325ec5Stsutsui    if (on != SCREEN_SAVER_FORCER)
431b9325ec5Stsutsui	regp->video_enab = (on == SCREEN_SAVER_ON) ? 0 : 1;
432b9325ec5Stsutsui    return TRUE;
433b9325ec5Stsutsui}
434b9325ec5Stsutsui
435b9325ec5Stsutsuistatic void
436b9325ec5StsutsuiCG2ScreenInit(ScreenPtr pScreen)
437b9325ec5Stsutsui{
438b9325ec5Stsutsui    sunScreenPtr pPrivate = sunGetScreenPrivate(pScreen);
439cb17d216Stsutsui
440cb17d216Stsutsui    CGScreenInitCommon(pScreen);
441b9325ec5Stsutsui    pPrivate->UpdateColormap = CG2UpdateColormap;
442b9325ec5Stsutsui    pPrivate->GetColormap = CG2GetColormap;
443cb17d216Stsutsui    pPrivate->RestoreColormap = CG2RestoreColormap;
444cb17d216Stsutsui
445cb17d216Stsutsui    CGSaveColormap(pScreen);
446cb17d216Stsutsui    pPrivate->origColormapValid = TRUE;
447b9325ec5Stsutsui}
448b9325ec5Stsutsui
449b9325ec5StsutsuiBool
450b9325ec5StsutsuisunCG2Init(
451b9325ec5Stsutsui    int		screen,    	/* what screen am I going to be */
452b9325ec5Stsutsui    ScreenPtr	pScreen,  	/* The Screen to initialize */
453b9325ec5Stsutsui    int		argc,	    	/* The number of the Server's arguments. */
454b9325ec5Stsutsui    char**	argv	   	/* The arguments themselves. Don't change! */
455b9325ec5Stsutsui)
456b9325ec5Stsutsui{
457b9325ec5Stsutsui    int		i;
458b9325ec5Stsutsui    Bool	ret;
459b9325ec5Stsutsui    Bool	mono = FALSE;
460b9325ec5Stsutsui
461b9325ec5Stsutsui    for (i = 1; i < argc; i++)
462b9325ec5Stsutsui	if (strcmp (argv[i], "-mono") == 0)
463b9325ec5Stsutsui	    mono = TRUE;
464b9325ec5Stsutsui
465b9325ec5Stsutsui    sunFbs[screen].EnterLeave = (void (*)(ScreenPtr, int))NoopDDA;
466b9325ec5Stsutsui    pScreen->SaveScreen = CG2SaveScreen;
467b9325ec5Stsutsui#ifndef LOWMEMFTPT
468b9325ec5Stsutsui    if (mono) {
469b9325ec5Stsutsui	pScreen->whitePixel = 0;
470b9325ec5Stsutsui	pScreen->blackPixel = 1;
471b9325ec5Stsutsui	sunFbs[screen].info.fb_depth = 1;
472b9325ec5Stsutsui	ret = sunInitCommon (screen, pScreen, (off_t) 0,
473b9325ec5Stsutsui			fbScreenInit, NULL,
474b9325ec5Stsutsui			fbCreateDefColormap, CG2SaveScreen, 0);
475b9325ec5Stsutsui	((CG2Ptr) sunFbs[screen].fb)->regs.ppmask.reg = 1;
476b9325ec5Stsutsui    } else {
477b9325ec5Stsutsui#endif /* ifndef LOWMEMFTPT */
478b9325ec5Stsutsui	ret = sunInitCommon (screen, pScreen, (off_t) 0,
479b9325ec5Stsutsui			sunCfbScreenInit, CG2ScreenInit,
480b9325ec5Stsutsui			fbCreateDefColormap, CG2SaveScreen,
481cb17d216Stsutsui			offsetof(struct cg2memfb, pixplane));
482b9325ec5Stsutsui	((CG2Ptr) sunFbs[screen].fb)->regs.ppmask.reg = 0xFF;
483b9325ec5Stsutsui#ifndef LOWMEMFTPT
484b9325ec5Stsutsui    }
485b9325ec5Stsutsui#endif /* ifndef LOWMEMFTPT */
486b9325ec5Stsutsui    return ret;
487b9325ec5Stsutsui}
488b9325ec5Stsutsui#endif /* INCLUDE_CG2_HEADER */
489b9325ec5Stsutsui
490b9325ec5Stsutsui#define	CG4_HEIGHT	900
491b9325ec5Stsutsui#define	CG4_WIDTH	1152
492b9325ec5Stsutsui
493b9325ec5Stsutsui#define	CG4_MELEN	    (128*1024)
494b9325ec5Stsutsui
495b9325ec5Stsutsuitypedef struct {
496b9325ec5Stsutsui    u_char mpixel[CG4_MELEN];		/* bit-per-pixel memory */
497b9325ec5Stsutsui    u_char epixel[CG4_MELEN];		/* enable plane */
498b9325ec5Stsutsui    u_char cpixel[CG4_HEIGHT][CG4_WIDTH];	/* byte-per-pixel memory */
499cb17d216Stsutsui} *CG4Ptr, CG4Rec;
500b9325ec5Stsutsui
501b9325ec5Stsutsuistatic void
502b9325ec5StsutsuiCG4Switch(ScreenPtr pScreen, int select)
503b9325ec5Stsutsui{
504b9325ec5Stsutsui    CG4Ptr	fb = (CG4Ptr) sunFbs[pScreen->myNum].fb;
505b9325ec5Stsutsui
506b9325ec5Stsutsui    (void) memset ((char *)fb->epixel, select ? ~0 : 0, CG4_MELEN);
507b9325ec5Stsutsui}
508b9325ec5Stsutsui
509b9325ec5StsutsuiBool
510b9325ec5StsutsuisunCG4Init(
511b9325ec5Stsutsui    int		screen,    	/* what screen am I going to be */
512b9325ec5Stsutsui    ScreenPtr	pScreen,  	/* The Screen to initialize */
513b9325ec5Stsutsui    int		argc,	    	/* The number of the Server's arguments. */
514b9325ec5Stsutsui    char**	argv    	/* The arguments themselves. Don't change! */
515b9325ec5Stsutsui)
516b9325ec5Stsutsui{
517b9325ec5Stsutsui    checkMono (argc, argv);
518b9325ec5Stsutsui    if (sunCG4Frob)
519b9325ec5Stsutsui	sunFbs[screen].EnterLeave = (void (*)(ScreenPtr, int))NoopDDA;
520b9325ec5Stsutsui    else
521b9325ec5Stsutsui	sunFbs[screen].EnterLeave = CG4Switch;
522b9325ec5Stsutsui    return sunInitCommon (screen, pScreen, (off_t) 0,
523b9325ec5Stsutsui	sunCfbScreenInit, CGScreenInit,
524cb17d216Stsutsui	fbCreateDefColormap, sunSaveScreen, offsetof(CG4Rec, cpixel));
525b9325ec5Stsutsui}
526b9325ec5Stsutsui
527b9325ec5Stsutsui#ifdef FBTYPE_SUNFAST_COLOR /* { */
528b9325ec5Stsutsui
529b9325ec5Stsutsui#define CG6_MMAP_OFFSET 0x70000000
530b9325ec5Stsutsui#define CG6_IMAGE_OFFSET 0x16000
531b9325ec5Stsutsui
532b9325ec5StsutsuiBool
533b9325ec5StsutsuisunCG6Init(
534b9325ec5Stsutsui    int		screen,    	/* The index of pScreen in the ScreenInfo */
535b9325ec5Stsutsui    ScreenPtr	pScreen,  	/* The Screen to initialize */
536b9325ec5Stsutsui    int		argc,	    	/* The number of the Server's arguments. */
537b9325ec5Stsutsui    char**	argv	   	/* The arguments themselves. Don't change! */
538b9325ec5Stsutsui)
539b9325ec5Stsutsui{
540b9325ec5Stsutsui    pointer	fb;
541b9325ec5Stsutsui
542b9325ec5Stsutsui    checkMono (argc, argv);
543b9325ec5Stsutsui    if (!sunScreenAllocate (pScreen))
544b9325ec5Stsutsui	return FALSE;
545b9325ec5Stsutsui    if (!sunFbs[screen].fb) {
546b9325ec5Stsutsui/* Sun's VME, Sbus, and SVR4 drivers all return different values */
547b9325ec5Stsutsui#define FBSIZE (size_t) sunFbs[screen].info.fb_width * \
548b9325ec5Stsutsui			sunFbs[screen].info.fb_height + CG6_IMAGE_OFFSET
549b9325ec5Stsutsui	if ((fb = sunMemoryMap (FBSIZE,
550b9325ec5Stsutsui			     (off_t) CG6_MMAP_OFFSET,
551b9325ec5Stsutsui			     sunFbs[screen].fd)) == NULL)
552b9325ec5Stsutsui	    return FALSE;
553b9325ec5Stsutsui	sunFbs[screen].fb = fb;
554b9325ec5Stsutsui#undef FBSIZE
555b9325ec5Stsutsui    }
556b9325ec5Stsutsui    sunFbs[screen].EnterLeave = (void (*)(ScreenPtr, int))NoopDDA;
557b9325ec5Stsutsui    if (!sunCfbSetupScreen (pScreen,
558b9325ec5Stsutsui	    sunFbs[screen].fb + CG6_IMAGE_OFFSET,
559b9325ec5Stsutsui	    sunFbs[screen].info.fb_width,
560b9325ec5Stsutsui	    sunFbs[screen].info.fb_height,
561b9325ec5Stsutsui	    monitorResolution, monitorResolution,
562b9325ec5Stsutsui	    sunFbs[screen].info.fb_width,
563b9325ec5Stsutsui	    sunFbs[screen].info.fb_depth))
564b9325ec5Stsutsui	return FALSE;
565b9325ec5Stsutsui#ifndef LOWMEMFTPT
566b9325ec5Stsutsui#if 0 /* XXX no GX support for now */
567b9325ec5Stsutsui    if (sunNoGX == FALSE) {
568b9325ec5Stsutsui	if (!sunGXInit (pScreen, &sunFbs[screen]))
569b9325ec5Stsutsui	    return FALSE;
570b9325ec5Stsutsui    }
571b9325ec5Stsutsui#endif
572b9325ec5Stsutsui#endif /* ifndef LOWMEMFTPT */
573b9325ec5Stsutsui    if (!sunCfbFinishScreenInit(pScreen,
574b9325ec5Stsutsui	    sunFbs[screen].fb + CG6_IMAGE_OFFSET,
575b9325ec5Stsutsui	    sunFbs[screen].info.fb_width,
576b9325ec5Stsutsui	    sunFbs[screen].info.fb_height,
577b9325ec5Stsutsui	    monitorResolution, monitorResolution,
578b9325ec5Stsutsui	    sunFbs[screen].info.fb_width,
579b9325ec5Stsutsui	    sunFbs[screen].info.fb_depth))
580b9325ec5Stsutsui	return FALSE;
581b9325ec5Stsutsui    if (sunNoGX == FALSE) {
582b9325ec5Stsutsui	miSetZeroLineBias(pScreen, GXZEROLINEBIAS);
583b9325ec5Stsutsui    }
584b9325ec5Stsutsui    CGScreenInit (pScreen);
585b9325ec5Stsutsui    if (!sunScreenInit (pScreen))
586b9325ec5Stsutsui	return FALSE;
587b9325ec5Stsutsui    sunSaveScreen (pScreen, SCREEN_SAVER_OFF);
588b9325ec5Stsutsui    return fbCreateDefColormap(pScreen);
589b9325ec5Stsutsui}
590b9325ec5Stsutsui#endif /* } */
591b9325ec5Stsutsui#endif /* } */
592