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);
101e199ea96Stsutsuistatic void checkMono(void);
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
310e199ea96StsutsuicheckMono(void)
311b9325ec5Stsutsui{
312b9325ec5Stsutsui
313e199ea96Stsutsui    if (sunForceMono)
314e199ea96Stsutsui	ErrorF("-mono not appropriate for CG3/CG4/CG6\n");
315b9325ec5Stsutsui}
316b9325ec5Stsutsui
317b9325ec5Stsutsui/*
318b9325ec5Stsutsui * CG3_MMAP_OFFSET is #defined in <pixrect/cg3var.h> or <sys/cg3var.h>
319b9325ec5Stsutsui * on  SunOS and Solaris respectively.  Under Solaris, cg3var.h
320b9325ec5Stsutsui * #includes a non-existent file, and causes the make to abort.  Other
321b9325ec5Stsutsui * systems may not have cg3var.h at all.  Since all cg3var.h is needed
322b9325ec5Stsutsui * for is this one #define, we'll just #define it here and let it go at that.
323b9325ec5Stsutsui */
324b9325ec5Stsutsui
325b9325ec5Stsutsui#define CG3_MMAP_OFFSET 0x04000000
326b9325ec5Stsutsui
327b9325ec5StsutsuiBool
328b9325ec5StsutsuisunCG3Init(
329b9325ec5Stsutsui    int	    	  screen,    	/* what screen am I going to be */
330b9325ec5Stsutsui    ScreenPtr	  pScreen,  	/* The Screen to initialize */
331b9325ec5Stsutsui    int	    	  argc,	    	/* The number of the Server's arguments. */
332b9325ec5Stsutsui    char    	  **argv   	/* The arguments themselves. Don't change! */
333b9325ec5Stsutsui)
334b9325ec5Stsutsui{
335e199ea96Stsutsui    checkMono();
336b9325ec5Stsutsui    sunFbs[screen].EnterLeave = (void (*)(ScreenPtr, int))NoopDDA;
337b9325ec5Stsutsui    return sunInitCommon (screen, pScreen, (off_t) CG3_MMAP_OFFSET,
338b9325ec5Stsutsui	sunCfbScreenInit, CGScreenInit,
339b9325ec5Stsutsui	fbCreateDefColormap, sunSaveScreen, 0);
340b9325ec5Stsutsui}
341b9325ec5Stsutsui
342b9325ec5StsutsuiBool
343b9325ec5StsutsuisunTCXInit(
344b9325ec5Stsutsui    int	    	  screen,    	/* what screen am I going to be */
345b9325ec5Stsutsui    ScreenPtr	  pScreen,  	/* The Screen to initialize */
346b9325ec5Stsutsui    int	    	  argc,	    	/* The number of the Server's arguments. */
347b9325ec5Stsutsui    char    	  **argv   	/* The arguments themselves. Don't change! */
348b9325ec5Stsutsui)
349b9325ec5Stsutsui{
350e199ea96Stsutsui    checkMono();
351b9325ec5Stsutsui    sunFbs[screen].EnterLeave = (void (*)(ScreenPtr, int))NoopDDA;
352b9325ec5Stsutsui    return sunInitCommon (screen, pScreen, (off_t) 0,
353b9325ec5Stsutsui	sunCfbScreenInit, CGScreenInit,
354b9325ec5Stsutsui	fbCreateDefColormap, sunSaveScreen, 0);
355b9325ec5Stsutsui}
356b9325ec5Stsutsui
357b9325ec5Stsutsui#if !defined(i386) /* { */
358b9325ec5Stsutsui
359b9325ec5Stsutsui#ifdef SVR4 /* { */
360b9325ec5Stsutsui#ifdef INCLUDE_CG2_HEADER /* { */
361b9325ec5Stsutsui#include <sys/cg2reg.h>
362b9325ec5Stsutsui#endif /* } INCLUDE_CG2_HEADER */
363b9325ec5Stsutsui#else
364b9325ec5Stsutsui#ifndef CSRG_BASED /* { */
365b9325ec5Stsutsui#include <pixrect/cg2reg.h>
366b9325ec5Stsutsui#else
367b9325ec5Stsutsui#if defined(__sparc__) || defined(__sparc) /* { */
368b9325ec5Stsutsui#if !defined(__bsdi__)
369b9325ec5Stsutsui#include <machine/cgtworeg.h>
370b9325ec5Stsutsui#endif
371b9325ec5Stsutsui#else
372b9325ec5Stsutsui#include <machine/cg2reg.h>
373b9325ec5Stsutsui#endif /* } */
374b9325ec5Stsutsui#endif /* } */
375b9325ec5Stsutsui#endif /* } */
376b9325ec5Stsutsui
377b9325ec5Stsutsui#ifdef INCLUDE_CG2_HEADER
378b9325ec5Stsutsuitypedef struct {
379b9325ec5Stsutsui    struct cg2memfb	mem;
380b9325ec5Stsutsui    struct cg2fb 	regs;
381b9325ec5Stsutsui} *CG2Ptr;
382b9325ec5Stsutsui
383b9325ec5Stsutsuistatic void
384b9325ec5StsutsuiCG2UpdateColormap(ScreenPtr pScreen, int index, int count, u_char *rmap, u_char *gmap, u_char *bmap)
385b9325ec5Stsutsui{
386b9325ec5Stsutsui    CG2Ptr	fb = (CG2Ptr) sunFbs[pScreen->myNum].fb;
387b9325ec5Stsutsui    volatile struct cg2statusreg *regp = &fb->regs.status.reg;
388b9325ec5Stsutsui
389b9325ec5Stsutsui    regp->update_cmap = 0;
390b9325ec5Stsutsui    while (count--) {
391b9325ec5Stsutsui	fb->regs.redmap[index] = rmap[index];
392b9325ec5Stsutsui	fb->regs.greenmap[index] = gmap[index];
393b9325ec5Stsutsui	fb->regs.bluemap[index] = bmap[index];
394b9325ec5Stsutsui	index++;
395b9325ec5Stsutsui    }
396b9325ec5Stsutsui    regp->update_cmap = 1;
397b9325ec5Stsutsui}
398b9325ec5Stsutsui
399b9325ec5Stsutsuistatic void
400b9325ec5StsutsuiCG2GetColormap(ScreenPtr pScreen, int index, int count, u_char *rmap, u_char *gmap, u_char *bmap)
401b9325ec5Stsutsui{
402b9325ec5Stsutsui    CG2Ptr	fb = (CG2Ptr) sunFbs[pScreen->myNum].fb;
403b9325ec5Stsutsui
404b9325ec5Stsutsui    /* I don't even know if this works */
405b9325ec5Stsutsui    while (count--) {
406b9325ec5Stsutsui	rmap[index] = fb->regs.redmap[index];
407b9325ec5Stsutsui	gmap[index] = fb->regs.greenmap[index];
408b9325ec5Stsutsui	bmap[index] = fb->regs.bluemap[index];
409b9325ec5Stsutsui	index++;
410b9325ec5Stsutsui    }
411b9325ec5Stsutsui}
412b9325ec5Stsutsui
413cb17d216Stsutsuistatic void
414cb17d216StsutsuiCG2RestoreColormap(ScreenPtr pScreen)
415cb17d216Stsutsui{
416cb17d216Stsutsui    int screen = pScreen->myNum;
417cb17d216Stsutsui
418cb17d216Stsutsui    CGRestoreColormap(pScreen);
419cb17d216Stsutsui    ((CG2Ptr)sunFbs[screen].fb)->regs.ppmask.reg = 1;
420cb17d216Stsutsui}
421cb17d216Stsutsui
422b9325ec5Stsutsuistatic Bool
423b9325ec5StsutsuiCG2SaveScreen(ScreenPtr pScreen, int on)
424b9325ec5Stsutsui{
425b9325ec5Stsutsui    CG2Ptr	fb = (CG2Ptr) sunFbs[pScreen->myNum].fb;
426b9325ec5Stsutsui    volatile struct cg2statusreg *regp = &fb->regs.status.reg;
427b9325ec5Stsutsui
428b9325ec5Stsutsui    if (on != SCREEN_SAVER_FORCER)
429b9325ec5Stsutsui	regp->video_enab = (on == SCREEN_SAVER_ON) ? 0 : 1;
430b9325ec5Stsutsui    return TRUE;
431b9325ec5Stsutsui}
432b9325ec5Stsutsui
433b9325ec5Stsutsuistatic void
434b9325ec5StsutsuiCG2ScreenInit(ScreenPtr pScreen)
435b9325ec5Stsutsui{
436b9325ec5Stsutsui    sunScreenPtr pPrivate = sunGetScreenPrivate(pScreen);
437cb17d216Stsutsui
438cb17d216Stsutsui    CGScreenInitCommon(pScreen);
439b9325ec5Stsutsui    pPrivate->UpdateColormap = CG2UpdateColormap;
440b9325ec5Stsutsui    pPrivate->GetColormap = CG2GetColormap;
441cb17d216Stsutsui    pPrivate->RestoreColormap = CG2RestoreColormap;
442cb17d216Stsutsui
443cb17d216Stsutsui    CGSaveColormap(pScreen);
444cb17d216Stsutsui    pPrivate->origColormapValid = TRUE;
445b9325ec5Stsutsui}
446b9325ec5Stsutsui
447b9325ec5StsutsuiBool
448b9325ec5StsutsuisunCG2Init(
449b9325ec5Stsutsui    int		screen,    	/* what screen am I going to be */
450b9325ec5Stsutsui    ScreenPtr	pScreen,  	/* The Screen to initialize */
451b9325ec5Stsutsui    int		argc,	    	/* The number of the Server's arguments. */
452b9325ec5Stsutsui    char**	argv	   	/* The arguments themselves. Don't change! */
453b9325ec5Stsutsui)
454b9325ec5Stsutsui{
455b9325ec5Stsutsui    Bool	ret;
456b9325ec5Stsutsui
457b9325ec5Stsutsui    sunFbs[screen].EnterLeave = (void (*)(ScreenPtr, int))NoopDDA;
458b9325ec5Stsutsui    pScreen->SaveScreen = CG2SaveScreen;
459b9325ec5Stsutsui#ifndef LOWMEMFTPT
460e199ea96Stsutsui    if (sunForceMono) {
461b9325ec5Stsutsui	pScreen->whitePixel = 0;
462b9325ec5Stsutsui	pScreen->blackPixel = 1;
463b9325ec5Stsutsui	sunFbs[screen].info.fb_depth = 1;
464b9325ec5Stsutsui	ret = sunInitCommon (screen, pScreen, (off_t) 0,
465b9325ec5Stsutsui			fbScreenInit, NULL,
466b9325ec5Stsutsui			fbCreateDefColormap, CG2SaveScreen, 0);
467b9325ec5Stsutsui	((CG2Ptr) sunFbs[screen].fb)->regs.ppmask.reg = 1;
468b9325ec5Stsutsui    } else {
469b9325ec5Stsutsui#endif /* ifndef LOWMEMFTPT */
470b9325ec5Stsutsui	ret = sunInitCommon (screen, pScreen, (off_t) 0,
471b9325ec5Stsutsui			sunCfbScreenInit, CG2ScreenInit,
472b9325ec5Stsutsui			fbCreateDefColormap, CG2SaveScreen,
473cb17d216Stsutsui			offsetof(struct cg2memfb, pixplane));
474b9325ec5Stsutsui	((CG2Ptr) sunFbs[screen].fb)->regs.ppmask.reg = 0xFF;
475b9325ec5Stsutsui#ifndef LOWMEMFTPT
476b9325ec5Stsutsui    }
477b9325ec5Stsutsui#endif /* ifndef LOWMEMFTPT */
478b9325ec5Stsutsui    return ret;
479b9325ec5Stsutsui}
480b9325ec5Stsutsui#endif /* INCLUDE_CG2_HEADER */
481b9325ec5Stsutsui
482b9325ec5Stsutsui#define	CG4_HEIGHT	900
483b9325ec5Stsutsui#define	CG4_WIDTH	1152
484b9325ec5Stsutsui
485b9325ec5Stsutsui#define	CG4_MELEN	    (128*1024)
486b9325ec5Stsutsui
487b9325ec5Stsutsuitypedef struct {
488b9325ec5Stsutsui    u_char mpixel[CG4_MELEN];		/* bit-per-pixel memory */
489b9325ec5Stsutsui    u_char epixel[CG4_MELEN];		/* enable plane */
490b9325ec5Stsutsui    u_char cpixel[CG4_HEIGHT][CG4_WIDTH];	/* byte-per-pixel memory */
491cb17d216Stsutsui} *CG4Ptr, CG4Rec;
492b9325ec5Stsutsui
493b9325ec5Stsutsuistatic void
494b9325ec5StsutsuiCG4Switch(ScreenPtr pScreen, int select)
495b9325ec5Stsutsui{
496b9325ec5Stsutsui    CG4Ptr	fb = (CG4Ptr) sunFbs[pScreen->myNum].fb;
497b9325ec5Stsutsui
498b9325ec5Stsutsui    (void) memset ((char *)fb->epixel, select ? ~0 : 0, CG4_MELEN);
499b9325ec5Stsutsui}
500b9325ec5Stsutsui
501b9325ec5StsutsuiBool
502b9325ec5StsutsuisunCG4Init(
503b9325ec5Stsutsui    int		screen,    	/* what screen am I going to be */
504b9325ec5Stsutsui    ScreenPtr	pScreen,  	/* The Screen to initialize */
505b9325ec5Stsutsui    int		argc,	    	/* The number of the Server's arguments. */
506b9325ec5Stsutsui    char**	argv    	/* The arguments themselves. Don't change! */
507b9325ec5Stsutsui)
508b9325ec5Stsutsui{
509e199ea96Stsutsui    checkMono();
510b9325ec5Stsutsui    if (sunCG4Frob)
511b9325ec5Stsutsui	sunFbs[screen].EnterLeave = (void (*)(ScreenPtr, int))NoopDDA;
512b9325ec5Stsutsui    else
513b9325ec5Stsutsui	sunFbs[screen].EnterLeave = CG4Switch;
514b9325ec5Stsutsui    return sunInitCommon (screen, pScreen, (off_t) 0,
515b9325ec5Stsutsui	sunCfbScreenInit, CGScreenInit,
516cb17d216Stsutsui	fbCreateDefColormap, sunSaveScreen, offsetof(CG4Rec, cpixel));
517b9325ec5Stsutsui}
518b9325ec5Stsutsui
519b9325ec5Stsutsui#ifdef FBTYPE_SUNFAST_COLOR /* { */
520b9325ec5Stsutsui
521b9325ec5Stsutsui#define CG6_MMAP_OFFSET 0x70000000
522b9325ec5Stsutsui#define CG6_IMAGE_OFFSET 0x16000
523b9325ec5Stsutsui
524b9325ec5StsutsuiBool
525b9325ec5StsutsuisunCG6Init(
526b9325ec5Stsutsui    int		screen,    	/* The index of pScreen in the ScreenInfo */
527b9325ec5Stsutsui    ScreenPtr	pScreen,  	/* The Screen to initialize */
528b9325ec5Stsutsui    int		argc,	    	/* The number of the Server's arguments. */
529b9325ec5Stsutsui    char**	argv	   	/* The arguments themselves. Don't change! */
530b9325ec5Stsutsui)
531b9325ec5Stsutsui{
532b9325ec5Stsutsui    pointer	fb;
533b9325ec5Stsutsui
534e199ea96Stsutsui    checkMono();
535b9325ec5Stsutsui    if (!sunScreenAllocate (pScreen))
536b9325ec5Stsutsui	return FALSE;
537b9325ec5Stsutsui    if (!sunFbs[screen].fb) {
538b9325ec5Stsutsui/* Sun's VME, Sbus, and SVR4 drivers all return different values */
539b9325ec5Stsutsui#define FBSIZE (size_t) sunFbs[screen].info.fb_width * \
540b9325ec5Stsutsui			sunFbs[screen].info.fb_height + CG6_IMAGE_OFFSET
541b9325ec5Stsutsui	if ((fb = sunMemoryMap (FBSIZE,
542b9325ec5Stsutsui			     (off_t) CG6_MMAP_OFFSET,
543b9325ec5Stsutsui			     sunFbs[screen].fd)) == NULL)
544b9325ec5Stsutsui	    return FALSE;
545b9325ec5Stsutsui	sunFbs[screen].fb = fb;
546b9325ec5Stsutsui#undef FBSIZE
547b9325ec5Stsutsui    }
548b9325ec5Stsutsui    sunFbs[screen].EnterLeave = (void (*)(ScreenPtr, int))NoopDDA;
549b9325ec5Stsutsui    if (!sunCfbSetupScreen (pScreen,
550b9325ec5Stsutsui	    sunFbs[screen].fb + CG6_IMAGE_OFFSET,
551b9325ec5Stsutsui	    sunFbs[screen].info.fb_width,
552b9325ec5Stsutsui	    sunFbs[screen].info.fb_height,
553b9325ec5Stsutsui	    monitorResolution, monitorResolution,
554b9325ec5Stsutsui	    sunFbs[screen].info.fb_width,
555b9325ec5Stsutsui	    sunFbs[screen].info.fb_depth))
556b9325ec5Stsutsui	return FALSE;
557b9325ec5Stsutsui#ifndef LOWMEMFTPT
558b9325ec5Stsutsui#if 0 /* XXX no GX support for now */
559b9325ec5Stsutsui    if (sunNoGX == FALSE) {
560b9325ec5Stsutsui	if (!sunGXInit (pScreen, &sunFbs[screen]))
561b9325ec5Stsutsui	    return FALSE;
562b9325ec5Stsutsui    }
563b9325ec5Stsutsui#endif
564b9325ec5Stsutsui#endif /* ifndef LOWMEMFTPT */
565b9325ec5Stsutsui    if (!sunCfbFinishScreenInit(pScreen,
566b9325ec5Stsutsui	    sunFbs[screen].fb + CG6_IMAGE_OFFSET,
567b9325ec5Stsutsui	    sunFbs[screen].info.fb_width,
568b9325ec5Stsutsui	    sunFbs[screen].info.fb_height,
569b9325ec5Stsutsui	    monitorResolution, monitorResolution,
570b9325ec5Stsutsui	    sunFbs[screen].info.fb_width,
571b9325ec5Stsutsui	    sunFbs[screen].info.fb_depth))
572b9325ec5Stsutsui	return FALSE;
573b9325ec5Stsutsui    if (sunNoGX == FALSE) {
574b9325ec5Stsutsui	miSetZeroLineBias(pScreen, GXZEROLINEBIAS);
575b9325ec5Stsutsui    }
576b9325ec5Stsutsui    CGScreenInit (pScreen);
577b9325ec5Stsutsui    if (!sunScreenInit (pScreen))
578b9325ec5Stsutsui	return FALSE;
579b9325ec5Stsutsui    sunSaveScreen (pScreen, SCREEN_SAVER_OFF);
580b9325ec5Stsutsui    return fbCreateDefColormap(pScreen);
581b9325ec5Stsutsui}
582b9325ec5Stsutsui#endif /* } */
583b9325ec5Stsutsui#endif /* } */
584