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