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