sunCfb.c revision b9325ec5
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 *);
97b9325ec5Stsutsuistatic void CGScreenInit(ScreenPtr);
98b9325ec5Stsutsuistatic void checkMono(int, char **);
99b9325ec5Stsutsuistatic void CG4Switch(ScreenPtr, int);
100b9325ec5Stsutsui
101b9325ec5Stsutsuistatic void
102b9325ec5StsutsuiCGUpdateColormap(ScreenPtr pScreen, int dex, int count, u_char *rmap, u_char *gmap, u_char *bmap)
103b9325ec5Stsutsui{
104b9325ec5Stsutsui    struct fbcmap sunCmap;
105b9325ec5Stsutsui
106b9325ec5Stsutsui    sunCmap.index = dex;
107b9325ec5Stsutsui    sunCmap.count = count;
108b9325ec5Stsutsui    sunCmap.red = &rmap[dex];
109b9325ec5Stsutsui    sunCmap.green = &gmap[dex];
110b9325ec5Stsutsui    sunCmap.blue = &bmap[dex];
111b9325ec5Stsutsui
112b9325ec5Stsutsui    if (ioctl(sunFbs[pScreen->myNum].fd, FBIOPUTCMAP, &sunCmap) < 0) {
113b9325ec5Stsutsui	Error("CGUpdateColormap");
114b9325ec5Stsutsui	FatalError( "CGUpdateColormap: FBIOPUTCMAP failed\n" );
115b9325ec5Stsutsui    }
116b9325ec5Stsutsui}
117b9325ec5Stsutsui
118b9325ec5Stsutsuistatic void
119b9325ec5StsutsuiCGGetColormap(ScreenPtr pScreen, int dex, int count, u_char *rmap, u_char *gmap, u_char *bmap)
120b9325ec5Stsutsui{
121b9325ec5Stsutsui    struct fbcmap sunCmap;
122b9325ec5Stsutsui
123b9325ec5Stsutsui    sunCmap.index = dex;
124b9325ec5Stsutsui    sunCmap.count = count;
125b9325ec5Stsutsui    sunCmap.red = &rmap[dex];
126b9325ec5Stsutsui    sunCmap.green = &gmap[dex];
127b9325ec5Stsutsui    sunCmap.blue = &bmap[dex];
128b9325ec5Stsutsui
129b9325ec5Stsutsui    if (ioctl(sunFbs[pScreen->myNum].fd, FBIOGETCMAP, &sunCmap) < 0) {
130b9325ec5Stsutsui	Error("CGGetColormap");
131b9325ec5Stsutsui	FatalError( "CGGetColormap: FBIOGETCMAP failed\n" );
132b9325ec5Stsutsui    }
133b9325ec5Stsutsui}
134b9325ec5Stsutsui
135b9325ec5Stsutsuivoid
136b9325ec5StsutsuisunInstallColormap(ColormapPtr cmap)
137b9325ec5Stsutsui{
138b9325ec5Stsutsui    sunScreenPtr pPrivate = sunGetScreenPrivate(cmap->pScreen);
139b9325ec5Stsutsui    register int i;
140b9325ec5Stsutsui    register Entry *pent;
141b9325ec5Stsutsui    register VisualPtr pVisual = cmap->pVisual;
142b9325ec5Stsutsui    u_char	  rmap[256], gmap[256], bmap[256];
143b9325ec5Stsutsui    unsigned long rMask, gMask, bMask;
144b9325ec5Stsutsui    int	oRed, oGreen, oBlue;
145b9325ec5Stsutsui
146b9325ec5Stsutsui    if (cmap == pPrivate->installedMap)
147b9325ec5Stsutsui	return;
148b9325ec5Stsutsui    if (pPrivate->installedMap)
149b9325ec5Stsutsui	WalkTree(pPrivate->installedMap->pScreen, TellLostMap,
150b9325ec5Stsutsui		 (pointer) &(pPrivate->installedMap->mid));
151b9325ec5Stsutsui    if ((pVisual->class | DynamicClass) == DirectColor) {
152b9325ec5Stsutsui	if (pVisual->ColormapEntries < 256) {
153b9325ec5Stsutsui	    rMask = pVisual->redMask;
154b9325ec5Stsutsui	    gMask = pVisual->greenMask;
155b9325ec5Stsutsui	    bMask = pVisual->blueMask;
156b9325ec5Stsutsui	    oRed = pVisual->offsetRed;
157b9325ec5Stsutsui	    oGreen = pVisual->offsetGreen;
158b9325ec5Stsutsui	    oBlue = pVisual->offsetBlue;
159b9325ec5Stsutsui	} else {
160b9325ec5Stsutsui	    rMask = gMask = bMask = 255;
161b9325ec5Stsutsui	    oRed = oGreen = oBlue = 0;
162b9325ec5Stsutsui	}
163b9325ec5Stsutsui	for (i = 0; i < 256; i++) {
164b9325ec5Stsutsui	    rmap[i] = cmap->red[(i & rMask) >> oRed].co.local.red >> 8;
165b9325ec5Stsutsui	    gmap[i] = cmap->green[(i & gMask) >> oGreen].co.local.green >> 8;
166b9325ec5Stsutsui	    bmap[i] = cmap->blue[(i & bMask) >> oBlue].co.local.blue >> 8;
167b9325ec5Stsutsui	}
168b9325ec5Stsutsui    } else {
169b9325ec5Stsutsui	(*pPrivate->GetColormap) (cmap->pScreen, 0, 256, rmap, gmap, bmap);
170b9325ec5Stsutsui	for (i = 0, pent = cmap->red;
171b9325ec5Stsutsui	     i < pVisual->ColormapEntries;
172b9325ec5Stsutsui	     i++, pent++) {
173b9325ec5Stsutsui	    if (pent->fShared) {
174b9325ec5Stsutsui		rmap[i] = pent->co.shco.red->color >> 8;
175b9325ec5Stsutsui		gmap[i] = pent->co.shco.green->color >> 8;
176b9325ec5Stsutsui		bmap[i] = pent->co.shco.blue->color >> 8;
177b9325ec5Stsutsui	    }
178b9325ec5Stsutsui	    else if (pent->refcnt != 0) {
179b9325ec5Stsutsui		rmap[i] = pent->co.local.red >> 8;
180b9325ec5Stsutsui		gmap[i] = pent->co.local.green >> 8;
181b9325ec5Stsutsui		bmap[i] = pent->co.local.blue >> 8;
182b9325ec5Stsutsui	    }
183b9325ec5Stsutsui	}
184b9325ec5Stsutsui    }
185b9325ec5Stsutsui    pPrivate->installedMap = cmap;
186b9325ec5Stsutsui    (*pPrivate->UpdateColormap) (cmap->pScreen, 0, 256, rmap, gmap, bmap);
187b9325ec5Stsutsui    WalkTree(cmap->pScreen, TellGainedMap, (pointer) &(cmap->mid));
188b9325ec5Stsutsui}
189b9325ec5Stsutsui
190b9325ec5Stsutsuivoid
191b9325ec5StsutsuisunUninstallColormap(ColormapPtr cmap)
192b9325ec5Stsutsui{
193b9325ec5Stsutsui    sunScreenPtr pPrivate = sunGetScreenPrivate(cmap->pScreen);
194b9325ec5Stsutsui    if (cmap == pPrivate->installedMap) {
195b9325ec5Stsutsui	Colormap defMapID = cmap->pScreen->defColormap;
196b9325ec5Stsutsui
197b9325ec5Stsutsui	if (cmap->mid != defMapID) {
198b9325ec5Stsutsui	    ColormapPtr defMap = (ColormapPtr) LookupIDByType(defMapID,
199b9325ec5Stsutsui							      RT_COLORMAP);
200b9325ec5Stsutsui
201b9325ec5Stsutsui	    if (defMap)
202b9325ec5Stsutsui		(*cmap->pScreen->InstallColormap)(defMap);
203b9325ec5Stsutsui	    else
204b9325ec5Stsutsui	        ErrorF("sunFbs: Can't find default colormap\n");
205b9325ec5Stsutsui	}
206b9325ec5Stsutsui    }
207b9325ec5Stsutsui}
208b9325ec5Stsutsui
209b9325ec5Stsutsuiint
210b9325ec5StsutsuisunListInstalledColormaps(ScreenPtr pScreen, Colormap *pCmapList)
211b9325ec5Stsutsui{
212b9325ec5Stsutsui    sunScreenPtr pPrivate = sunGetScreenPrivate(pScreen);
213b9325ec5Stsutsui    *pCmapList = pPrivate->installedMap->mid;
214b9325ec5Stsutsui    return (1);
215b9325ec5Stsutsui}
216b9325ec5Stsutsui
217b9325ec5Stsutsuistatic void
218b9325ec5StsutsuiCGStoreColors(ColormapPtr pmap, int ndef, xColorItem *pdefs)
219b9325ec5Stsutsui{
220b9325ec5Stsutsui    sunScreenPtr pPrivate = sunGetScreenPrivate(pmap->pScreen);
221b9325ec5Stsutsui    u_char	rmap[256], gmap[256], bmap[256];
222b9325ec5Stsutsui    xColorItem	expanddefs[256];
223b9325ec5Stsutsui    register int i;
224b9325ec5Stsutsui
225b9325ec5Stsutsui    if (pPrivate->installedMap != NULL && pPrivate->installedMap != pmap)
226b9325ec5Stsutsui	return;
227b9325ec5Stsutsui    if ((pmap->pVisual->class | DynamicClass) == DirectColor) {
228b9325ec5Stsutsui	ndef = fbExpandDirectColors(pmap, ndef, pdefs, expanddefs);
229b9325ec5Stsutsui	pdefs = expanddefs;
230b9325ec5Stsutsui    }
231b9325ec5Stsutsui    while (ndef--) {
232b9325ec5Stsutsui	i = pdefs->pixel;
233b9325ec5Stsutsui	rmap[i] = pdefs->red >> 8;
234b9325ec5Stsutsui	gmap[i] = pdefs->green >> 8;
235b9325ec5Stsutsui	bmap[i] = pdefs->blue >> 8;
236b9325ec5Stsutsui	(*pPrivate->UpdateColormap) (pmap->pScreen, i, 1, rmap, gmap, bmap);
237b9325ec5Stsutsui	pdefs++;
238b9325ec5Stsutsui    }
239b9325ec5Stsutsui}
240b9325ec5Stsutsui
241b9325ec5Stsutsuistatic void
242b9325ec5StsutsuiCGScreenInit(ScreenPtr pScreen)
243b9325ec5Stsutsui{
244b9325ec5Stsutsui#ifndef STATIC_COLOR /* { */
245b9325ec5Stsutsui    sunScreenPtr pPrivate = sunGetScreenPrivate(pScreen);
246b9325ec5Stsutsui    pScreen->InstallColormap = sunInstallColormap;
247b9325ec5Stsutsui    pScreen->UninstallColormap = sunUninstallColormap;
248b9325ec5Stsutsui    pScreen->ListInstalledColormaps = sunListInstalledColormaps;
249b9325ec5Stsutsui    pScreen->StoreColors = CGStoreColors;
250b9325ec5Stsutsui    pPrivate->UpdateColormap = CGUpdateColormap;
251b9325ec5Stsutsui    pPrivate->GetColormap = CGGetColormap;
252b9325ec5Stsutsui    if (sunFlipPixels) {
253b9325ec5Stsutsui	Pixel pixel = pScreen->whitePixel;
254b9325ec5Stsutsui	pScreen->whitePixel = pScreen->blackPixel;
255b9325ec5Stsutsui	pScreen->blackPixel = pixel;
256b9325ec5Stsutsui    }
257b9325ec5Stsutsui#endif /* } */
258b9325ec5Stsutsui}
259b9325ec5Stsutsui
260b9325ec5Stsutsuistatic void
261b9325ec5StsutsuicheckMono(int argc, char** argv)
262b9325ec5Stsutsui{
263b9325ec5Stsutsui    int i;
264b9325ec5Stsutsui
265b9325ec5Stsutsui    for (i = 1; i < argc; i++)
266b9325ec5Stsutsui	if (strcmp (argv[i], "-mono") == 0)
267b9325ec5Stsutsui	    ErrorF ("-mono not appropriate for CG3/CG4/CG6\n");
268b9325ec5Stsutsui}
269b9325ec5Stsutsui
270b9325ec5Stsutsui/*
271b9325ec5Stsutsui * CG3_MMAP_OFFSET is #defined in <pixrect/cg3var.h> or <sys/cg3var.h>
272b9325ec5Stsutsui * on  SunOS and Solaris respectively.  Under Solaris, cg3var.h
273b9325ec5Stsutsui * #includes a non-existent file, and causes the make to abort.  Other
274b9325ec5Stsutsui * systems may not have cg3var.h at all.  Since all cg3var.h is needed
275b9325ec5Stsutsui * for is this one #define, we'll just #define it here and let it go at that.
276b9325ec5Stsutsui */
277b9325ec5Stsutsui
278b9325ec5Stsutsui#define CG3_MMAP_OFFSET 0x04000000
279b9325ec5Stsutsui
280b9325ec5StsutsuiBool
281b9325ec5StsutsuisunCG3Init(
282b9325ec5Stsutsui    int	    	  screen,    	/* what screen am I going to be */
283b9325ec5Stsutsui    ScreenPtr	  pScreen,  	/* The Screen to initialize */
284b9325ec5Stsutsui    int	    	  argc,	    	/* The number of the Server's arguments. */
285b9325ec5Stsutsui    char    	  **argv   	/* The arguments themselves. Don't change! */
286b9325ec5Stsutsui)
287b9325ec5Stsutsui{
288b9325ec5Stsutsui    checkMono (argc, argv);
289b9325ec5Stsutsui    sunFbs[screen].EnterLeave = (void (*)(ScreenPtr, int))NoopDDA;
290b9325ec5Stsutsui    return sunInitCommon (screen, pScreen, (off_t) CG3_MMAP_OFFSET,
291b9325ec5Stsutsui	sunCfbScreenInit, CGScreenInit,
292b9325ec5Stsutsui	fbCreateDefColormap, sunSaveScreen, 0);
293b9325ec5Stsutsui}
294b9325ec5Stsutsui
295b9325ec5StsutsuiBool
296b9325ec5StsutsuisunTCXInit(
297b9325ec5Stsutsui    int	    	  screen,    	/* what screen am I going to be */
298b9325ec5Stsutsui    ScreenPtr	  pScreen,  	/* The Screen to initialize */
299b9325ec5Stsutsui    int	    	  argc,	    	/* The number of the Server's arguments. */
300b9325ec5Stsutsui    char    	  **argv   	/* The arguments themselves. Don't change! */
301b9325ec5Stsutsui)
302b9325ec5Stsutsui{
303b9325ec5Stsutsui    checkMono (argc, argv);
304b9325ec5Stsutsui    sunFbs[screen].EnterLeave = (void (*)(ScreenPtr, int))NoopDDA;
305b9325ec5Stsutsui    return sunInitCommon (screen, pScreen, (off_t) 0,
306b9325ec5Stsutsui	sunCfbScreenInit, CGScreenInit,
307b9325ec5Stsutsui	fbCreateDefColormap, sunSaveScreen, 0);
308b9325ec5Stsutsui}
309b9325ec5Stsutsui
310b9325ec5Stsutsui#if !defined(i386) /* { */
311b9325ec5Stsutsui
312b9325ec5Stsutsui#ifdef SVR4 /* { */
313b9325ec5Stsutsui#ifdef INCLUDE_CG2_HEADER /* { */
314b9325ec5Stsutsui#include <sys/cg2reg.h>
315b9325ec5Stsutsui#endif /* } INCLUDE_CG2_HEADER */
316b9325ec5Stsutsui#else
317b9325ec5Stsutsui#ifndef CSRG_BASED /* { */
318b9325ec5Stsutsui#include <pixrect/cg2reg.h>
319b9325ec5Stsutsui#else
320b9325ec5Stsutsui#if defined(__sparc__) || defined(__sparc) /* { */
321b9325ec5Stsutsui#if !defined(__bsdi__)
322b9325ec5Stsutsui#include <machine/cgtworeg.h>
323b9325ec5Stsutsui#endif
324b9325ec5Stsutsui#else
325b9325ec5Stsutsui#include <machine/cg2reg.h>
326b9325ec5Stsutsui#endif /* } */
327b9325ec5Stsutsui#endif /* } */
328b9325ec5Stsutsui#endif /* } */
329b9325ec5Stsutsui
330b9325ec5Stsutsui#ifdef INCLUDE_CG2_HEADER
331b9325ec5Stsutsuitypedef struct {
332b9325ec5Stsutsui    struct cg2memfb	mem;
333b9325ec5Stsutsui    struct cg2fb 	regs;
334b9325ec5Stsutsui} *CG2Ptr;
335b9325ec5Stsutsui
336b9325ec5Stsutsuistatic void
337b9325ec5StsutsuiCG2UpdateColormap(ScreenPtr pScreen, int index, int count, u_char *rmap, u_char *gmap, u_char *bmap)
338b9325ec5Stsutsui{
339b9325ec5Stsutsui    CG2Ptr	fb = (CG2Ptr) sunFbs[pScreen->myNum].fb;
340b9325ec5Stsutsui    volatile struct cg2statusreg *regp = &fb->regs.status.reg;
341b9325ec5Stsutsui
342b9325ec5Stsutsui    regp->update_cmap = 0;
343b9325ec5Stsutsui    while (count--) {
344b9325ec5Stsutsui	fb->regs.redmap[index] = rmap[index];
345b9325ec5Stsutsui	fb->regs.greenmap[index] = gmap[index];
346b9325ec5Stsutsui	fb->regs.bluemap[index] = bmap[index];
347b9325ec5Stsutsui	index++;
348b9325ec5Stsutsui    }
349b9325ec5Stsutsui    regp->update_cmap = 1;
350b9325ec5Stsutsui}
351b9325ec5Stsutsui
352b9325ec5Stsutsuistatic void
353b9325ec5StsutsuiCG2GetColormap(ScreenPtr pScreen, int index, int count, u_char *rmap, u_char *gmap, u_char *bmap)
354b9325ec5Stsutsui{
355b9325ec5Stsutsui    CG2Ptr	fb = (CG2Ptr) sunFbs[pScreen->myNum].fb;
356b9325ec5Stsutsui
357b9325ec5Stsutsui    /* I don't even know if this works */
358b9325ec5Stsutsui    while (count--) {
359b9325ec5Stsutsui	rmap[index] = fb->regs.redmap[index];
360b9325ec5Stsutsui	gmap[index] = fb->regs.greenmap[index];
361b9325ec5Stsutsui	bmap[index] = fb->regs.bluemap[index];
362b9325ec5Stsutsui	index++;
363b9325ec5Stsutsui    }
364b9325ec5Stsutsui}
365b9325ec5Stsutsui
366b9325ec5Stsutsuistatic Bool
367b9325ec5StsutsuiCG2SaveScreen(ScreenPtr pScreen, int on)
368b9325ec5Stsutsui{
369b9325ec5Stsutsui    CG2Ptr	fb = (CG2Ptr) sunFbs[pScreen->myNum].fb;
370b9325ec5Stsutsui    volatile struct cg2statusreg *regp = &fb->regs.status.reg;
371b9325ec5Stsutsui
372b9325ec5Stsutsui    if (on != SCREEN_SAVER_FORCER)
373b9325ec5Stsutsui	regp->video_enab = (on == SCREEN_SAVER_ON) ? 0 : 1;
374b9325ec5Stsutsui    return TRUE;
375b9325ec5Stsutsui}
376b9325ec5Stsutsui
377b9325ec5Stsutsuistatic void
378b9325ec5StsutsuiCG2ScreenInit(ScreenPtr pScreen)
379b9325ec5Stsutsui{
380b9325ec5Stsutsui    sunScreenPtr pPrivate = sunGetScreenPrivate(pScreen);
381b9325ec5Stsutsui    CGScreenInit (pScreen);
382b9325ec5Stsutsui    pPrivate->UpdateColormap = CG2UpdateColormap;
383b9325ec5Stsutsui    pPrivate->GetColormap = CG2GetColormap;
384b9325ec5Stsutsui}
385b9325ec5Stsutsui
386b9325ec5StsutsuiBool
387b9325ec5StsutsuisunCG2Init(
388b9325ec5Stsutsui    int		screen,    	/* what screen am I going to be */
389b9325ec5Stsutsui    ScreenPtr	pScreen,  	/* The Screen to initialize */
390b9325ec5Stsutsui    int		argc,	    	/* The number of the Server's arguments. */
391b9325ec5Stsutsui    char**	argv	   	/* The arguments themselves. Don't change! */
392b9325ec5Stsutsui)
393b9325ec5Stsutsui{
394b9325ec5Stsutsui    int		i;
395b9325ec5Stsutsui    Bool	ret;
396b9325ec5Stsutsui    Bool	mono = FALSE;
397b9325ec5Stsutsui
398b9325ec5Stsutsui    for (i = 1; i < argc; i++)
399b9325ec5Stsutsui	if (strcmp (argv[i], "-mono") == 0)
400b9325ec5Stsutsui	    mono = TRUE;
401b9325ec5Stsutsui
402b9325ec5Stsutsui    sunFbs[screen].EnterLeave = (void (*)(ScreenPtr, int))NoopDDA;
403b9325ec5Stsutsui    pScreen->SaveScreen = CG2SaveScreen;
404b9325ec5Stsutsui#ifndef LOWMEMFTPT
405b9325ec5Stsutsui    if (mono) {
406b9325ec5Stsutsui	pScreen->whitePixel = 0;
407b9325ec5Stsutsui	pScreen->blackPixel = 1;
408b9325ec5Stsutsui	sunFbs[screen].info.fb_depth = 1;
409b9325ec5Stsutsui	ret = sunInitCommon (screen, pScreen, (off_t) 0,
410b9325ec5Stsutsui			fbScreenInit, NULL,
411b9325ec5Stsutsui			fbCreateDefColormap, CG2SaveScreen, 0);
412b9325ec5Stsutsui	((CG2Ptr) sunFbs[screen].fb)->regs.ppmask.reg = 1;
413b9325ec5Stsutsui    } else {
414b9325ec5Stsutsui#endif /* ifndef LOWMEMFTPT */
415b9325ec5Stsutsui	ret = sunInitCommon (screen, pScreen, (off_t) 0,
416b9325ec5Stsutsui			sunCfbScreenInit, CG2ScreenInit,
417b9325ec5Stsutsui			fbCreateDefColormap, CG2SaveScreen,
418b9325ec5Stsutsui			(int) &((struct cg2memfb *) 0)->pixplane);
419b9325ec5Stsutsui	((CG2Ptr) sunFbs[screen].fb)->regs.ppmask.reg = 0xFF;
420b9325ec5Stsutsui#ifndef LOWMEMFTPT
421b9325ec5Stsutsui    }
422b9325ec5Stsutsui#endif /* ifndef LOWMEMFTPT */
423b9325ec5Stsutsui    return ret;
424b9325ec5Stsutsui}
425b9325ec5Stsutsui#endif /* INCLUDE_CG2_HEADER */
426b9325ec5Stsutsui
427b9325ec5Stsutsui#define	CG4_HEIGHT	900
428b9325ec5Stsutsui#define	CG4_WIDTH	1152
429b9325ec5Stsutsui
430b9325ec5Stsutsui#define	CG4_MELEN	    (128*1024)
431b9325ec5Stsutsui
432b9325ec5Stsutsuitypedef struct {
433b9325ec5Stsutsui    u_char mpixel[CG4_MELEN];		/* bit-per-pixel memory */
434b9325ec5Stsutsui    u_char epixel[CG4_MELEN];		/* enable plane */
435b9325ec5Stsutsui    u_char cpixel[CG4_HEIGHT][CG4_WIDTH];	/* byte-per-pixel memory */
436b9325ec5Stsutsui} *CG4Ptr;
437b9325ec5Stsutsui
438b9325ec5Stsutsuistatic void
439b9325ec5StsutsuiCG4Switch(ScreenPtr pScreen, int select)
440b9325ec5Stsutsui{
441b9325ec5Stsutsui    CG4Ptr	fb = (CG4Ptr) sunFbs[pScreen->myNum].fb;
442b9325ec5Stsutsui
443b9325ec5Stsutsui    (void) memset ((char *)fb->epixel, select ? ~0 : 0, CG4_MELEN);
444b9325ec5Stsutsui}
445b9325ec5Stsutsui
446b9325ec5StsutsuiBool
447b9325ec5StsutsuisunCG4Init(
448b9325ec5Stsutsui    int		screen,    	/* what screen am I going to be */
449b9325ec5Stsutsui    ScreenPtr	pScreen,  	/* The Screen to initialize */
450b9325ec5Stsutsui    int		argc,	    	/* The number of the Server's arguments. */
451b9325ec5Stsutsui    char**	argv    	/* The arguments themselves. Don't change! */
452b9325ec5Stsutsui)
453b9325ec5Stsutsui{
454b9325ec5Stsutsui    checkMono (argc, argv);
455b9325ec5Stsutsui    if (sunCG4Frob)
456b9325ec5Stsutsui	sunFbs[screen].EnterLeave = (void (*)(ScreenPtr, int))NoopDDA;
457b9325ec5Stsutsui    else
458b9325ec5Stsutsui	sunFbs[screen].EnterLeave = CG4Switch;
459b9325ec5Stsutsui    return sunInitCommon (screen, pScreen, (off_t) 0,
460b9325ec5Stsutsui	sunCfbScreenInit, CGScreenInit,
461b9325ec5Stsutsui	fbCreateDefColormap, sunSaveScreen, (int) ((CG4Ptr) 0)->cpixel);
462b9325ec5Stsutsui}
463b9325ec5Stsutsui
464b9325ec5Stsutsui#ifdef FBTYPE_SUNFAST_COLOR /* { */
465b9325ec5Stsutsui
466b9325ec5Stsutsui#define CG6_MMAP_OFFSET 0x70000000
467b9325ec5Stsutsui#define CG6_IMAGE_OFFSET 0x16000
468b9325ec5Stsutsui
469b9325ec5StsutsuiBool
470b9325ec5StsutsuisunCG6Init(
471b9325ec5Stsutsui    int		screen,    	/* The index of pScreen in the ScreenInfo */
472b9325ec5Stsutsui    ScreenPtr	pScreen,  	/* The Screen to initialize */
473b9325ec5Stsutsui    int		argc,	    	/* The number of the Server's arguments. */
474b9325ec5Stsutsui    char**	argv	   	/* The arguments themselves. Don't change! */
475b9325ec5Stsutsui)
476b9325ec5Stsutsui{
477b9325ec5Stsutsui    pointer	fb;
478b9325ec5Stsutsui
479b9325ec5Stsutsui    checkMono (argc, argv);
480b9325ec5Stsutsui    if (!sunScreenAllocate (pScreen))
481b9325ec5Stsutsui	return FALSE;
482b9325ec5Stsutsui    if (!sunFbs[screen].fb) {
483b9325ec5Stsutsui/* Sun's VME, Sbus, and SVR4 drivers all return different values */
484b9325ec5Stsutsui#define FBSIZE (size_t) sunFbs[screen].info.fb_width * \
485b9325ec5Stsutsui			sunFbs[screen].info.fb_height + CG6_IMAGE_OFFSET
486b9325ec5Stsutsui	if ((fb = sunMemoryMap (FBSIZE,
487b9325ec5Stsutsui			     (off_t) CG6_MMAP_OFFSET,
488b9325ec5Stsutsui			     sunFbs[screen].fd)) == NULL)
489b9325ec5Stsutsui	    return FALSE;
490b9325ec5Stsutsui	sunFbs[screen].fb = fb;
491b9325ec5Stsutsui#undef FBSIZE
492b9325ec5Stsutsui    }
493b9325ec5Stsutsui    sunFbs[screen].EnterLeave = (void (*)(ScreenPtr, int))NoopDDA;
494b9325ec5Stsutsui    if (!sunCfbSetupScreen (pScreen,
495b9325ec5Stsutsui	    sunFbs[screen].fb + CG6_IMAGE_OFFSET,
496b9325ec5Stsutsui	    sunFbs[screen].info.fb_width,
497b9325ec5Stsutsui	    sunFbs[screen].info.fb_height,
498b9325ec5Stsutsui	    monitorResolution, monitorResolution,
499b9325ec5Stsutsui	    sunFbs[screen].info.fb_width,
500b9325ec5Stsutsui	    sunFbs[screen].info.fb_depth))
501b9325ec5Stsutsui	return FALSE;
502b9325ec5Stsutsui#ifndef LOWMEMFTPT
503b9325ec5Stsutsui#if 0 /* XXX no GX support for now */
504b9325ec5Stsutsui    if (sunNoGX == FALSE) {
505b9325ec5Stsutsui	if (!sunGXInit (pScreen, &sunFbs[screen]))
506b9325ec5Stsutsui	    return FALSE;
507b9325ec5Stsutsui    }
508b9325ec5Stsutsui#endif
509b9325ec5Stsutsui#endif /* ifndef LOWMEMFTPT */
510b9325ec5Stsutsui    if (!sunCfbFinishScreenInit(pScreen,
511b9325ec5Stsutsui	    sunFbs[screen].fb + CG6_IMAGE_OFFSET,
512b9325ec5Stsutsui	    sunFbs[screen].info.fb_width,
513b9325ec5Stsutsui	    sunFbs[screen].info.fb_height,
514b9325ec5Stsutsui	    monitorResolution, monitorResolution,
515b9325ec5Stsutsui	    sunFbs[screen].info.fb_width,
516b9325ec5Stsutsui	    sunFbs[screen].info.fb_depth))
517b9325ec5Stsutsui	return FALSE;
518b9325ec5Stsutsui    if (sunNoGX == FALSE) {
519b9325ec5Stsutsui	miSetZeroLineBias(pScreen, GXZEROLINEBIAS);
520b9325ec5Stsutsui    }
521b9325ec5Stsutsui    CGScreenInit (pScreen);
522b9325ec5Stsutsui    if (!sunScreenInit (pScreen))
523b9325ec5Stsutsui	return FALSE;
524b9325ec5Stsutsui    sunSaveScreen (pScreen, SCREEN_SAVER_OFF);
525b9325ec5Stsutsui    return fbCreateDefColormap(pScreen);
526b9325ec5Stsutsui}
527b9325ec5Stsutsui#endif /* } */
528b9325ec5Stsutsui#endif /* } */
529