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