pm2_common.c revision a3890ad9
1/* 2 * Copyright 1997-2001 by Alan Hourihane, Wigan, England. 3 * 4 * Permission to use, copy, modify, distribute, and sell this software and its 5 * documentation for any purpose is hereby granted without fee, provided that 6 * the above copyright notice appear in all copies and that both that 7 * copyright notice and this permission notice appear in supporting 8 * documentation, and that the name of Alan Hourihane not be used in 9 * advertising or publicity pertaining to distribution of the software without 10 * specific, written prior permission. Alan Hourihane makes no representations 11 * about the suitability of this software for any purpose. It is provided 12 * "as is" without express or implied warranty. 13 * 14 * ALAN HOURIHANE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, 15 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO 16 * EVENT SHALL ALAN HOURIHANE BE LIABLE FOR ANY SPECIAL, INDIRECT OR 17 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, 18 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 19 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 20 * PERFORMANCE OF THIS SOFTWARE. 21 * 22 * Authors: Alan Hourihane, <alanh@fairlite.demon.co.uk> 23 * Dirk Hohndel, <hohndel@suse.de> 24 * Stefan Dirsch, <sndirsch@suse.de> 25 * Mark Vojkovich, <mvojkovi@ucsd.edu> 26 * Michel Dänzer, <michdaen@iiic.ethz.ch> 27 * 28 * this work is sponsored by S.u.S.E. GmbH, Fuerth, Elsa GmbH, Aachen and 29 * Siemens Nixdorf Informationssysteme 30 * 31 * Permedia 2 accelerated options. 32 */ 33 34#ifdef HAVE_CONFIG_H 35#include "config.h" 36#endif 37 38#include <X11/Xarch.h> 39#include "xf86.h" 40#include "xf86_OSproc.h" 41 42#include "xf86Pci.h" 43 44#include "glint_regs.h" 45#include "glint.h" 46 47#if DEBUG 48# define TRACE_ENTER(str) ErrorF("pm2_common: " str " %d\n",pScrn->scrnIndex) 49# define TRACE_EXIT(str) ErrorF("pm2_common: " str " done\n") 50# define TRACE(str) ErrorF("pm2_common trace: " str "\n") 51#else 52# define TRACE_ENTER(str) 53# define TRACE_EXIT(str) 54# define TRACE(str) 55#endif 56 57void 58Permedia2InitializeEngine(ScrnInfoPtr pScrn) 59{ 60 GLINTPtr pGlint = GLINTPTR(pScrn); 61 62 /* Initialize the Accelerator Engine to defaults */ 63 64 TRACE_ENTER("Permedia2InitializeEngine"); 65 66 GLINT_SLOW_WRITE_REG(UNIT_DISABLE, ScissorMode); 67 GLINT_SLOW_WRITE_REG(UNIT_ENABLE, FBWriteMode); 68 GLINT_SLOW_WRITE_REG(0, dXSub); 69 GLINT_SLOW_WRITE_REG(GWIN_DisableLBUpdate, GLINTWindow); 70 GLINT_SLOW_WRITE_REG(UNIT_DISABLE, DitherMode); 71 GLINT_SLOW_WRITE_REG(UNIT_DISABLE, AlphaBlendMode); 72 GLINT_SLOW_WRITE_REG(UNIT_DISABLE, ColorDDAMode); 73 GLINT_SLOW_WRITE_REG(UNIT_DISABLE, TextureColorMode); 74 GLINT_SLOW_WRITE_REG(UNIT_DISABLE, TextureAddressMode); 75 GLINT_SLOW_WRITE_REG(0, SStart); 76 GLINT_SLOW_WRITE_REG(0, dSdx); 77 GLINT_SLOW_WRITE_REG(1 << 20, dSdyDom); 78 GLINT_SLOW_WRITE_REG(UNIT_DISABLE, TStart); 79 GLINT_SLOW_WRITE_REG(1 << 20, dTdx); 80 GLINT_SLOW_WRITE_REG(0, dTdyDom); 81 GLINT_SLOW_WRITE_REG(UNIT_DISABLE, PMTextureReadMode); 82 GLINT_SLOW_WRITE_REG(pGlint->pprod, LBReadMode); 83 GLINT_SLOW_WRITE_REG(UNIT_DISABLE, AlphaBlendMode); 84 GLINT_SLOW_WRITE_REG(UNIT_DISABLE, TexelLUTMode); 85 GLINT_SLOW_WRITE_REG(UNIT_DISABLE, YUVMode); 86 GLINT_SLOW_WRITE_REG(UNIT_DISABLE, DepthMode); 87 GLINT_SLOW_WRITE_REG(UNIT_DISABLE, RouterMode); 88 GLINT_SLOW_WRITE_REG(UNIT_DISABLE, FogMode); 89 GLINT_SLOW_WRITE_REG(UNIT_DISABLE, AntialiasMode); 90 GLINT_SLOW_WRITE_REG(UNIT_DISABLE, AlphaTestMode); 91 GLINT_SLOW_WRITE_REG(UNIT_DISABLE, StencilMode); 92 GLINT_SLOW_WRITE_REG(UNIT_DISABLE, AreaStippleMode); 93 GLINT_SLOW_WRITE_REG(UNIT_DISABLE, LogicalOpMode); 94 GLINT_SLOW_WRITE_REG(UNIT_DISABLE, DepthMode); 95 GLINT_SLOW_WRITE_REG(UNIT_DISABLE, StatisticMode); 96 GLINT_SLOW_WRITE_REG(0x400, FilterMode); 97 GLINT_SLOW_WRITE_REG(0xffffffff, FBHardwareWriteMask); 98 GLINT_SLOW_WRITE_REG(0xffffffff, FBSoftwareWriteMask); 99 GLINT_SLOW_WRITE_REG(UNIT_DISABLE, RasterizerMode); 100 GLINT_SLOW_WRITE_REG(UNIT_DISABLE, GLINTDepth); 101 GLINT_SLOW_WRITE_REG(UNIT_DISABLE, FBSourceOffset); 102 GLINT_SLOW_WRITE_REG(UNIT_DISABLE, FBPixelOffset); 103 GLINT_SLOW_WRITE_REG(UNIT_DISABLE, LBSourceOffset); 104 GLINT_SLOW_WRITE_REG(UNIT_DISABLE, WindowOrigin); 105 GLINT_SLOW_WRITE_REG(UNIT_DISABLE, FBWindowBase); 106 GLINT_SLOW_WRITE_REG(UNIT_DISABLE, FBSourceBase); 107 GLINT_SLOW_WRITE_REG(UNIT_DISABLE, LBWindowBase); 108 109#if X_BYTE_ORDER == X_BIG_ENDIAN 110 pGlint->RasterizerSwap = 1; 111#else 112 pGlint->RasterizerSwap = 0; 113#endif 114 115 switch (pScrn->bitsPerPixel) { 116 case 8: 117 pGlint->PixelWidth = 0x0; /* 8 Bits */ 118 pGlint->TexMapFormat = pGlint->pprod; 119#if X_BYTE_ORDER == X_BIG_ENDIAN 120 pGlint->RasterizerSwap |= 3<<15; /* Swap host data */ 121#endif 122 break; 123 case 16: 124 pGlint->PixelWidth = 0x1; /* 16 Bits */ 125 pGlint->TexMapFormat = pGlint->pprod | 1<<19; 126#if X_BYTE_ORDER == X_BIG_ENDIAN 127 pGlint->RasterizerSwap |= 2<<15; /* Swap host data */ 128#endif 129 break; 130 case 24: 131 pGlint->PixelWidth = 0x4; /* 24 Bits */ 132 pGlint->TexMapFormat = pGlint->pprod | 2<<19; 133 break; 134 case 32: 135 pGlint->PixelWidth = 0x2; /* 32 Bits */ 136 pGlint->TexMapFormat = pGlint->pprod | 2<<19; 137 break; 138 } 139 pGlint->ClippingOn = FALSE; 140 pGlint->startxdom = 0; 141 pGlint->startxsub = 0; 142 pGlint->starty = 0; 143 pGlint->count = 0; 144 pGlint->dy = 1<<16; 145 pGlint->dxdom = 0; 146 pGlint->x = 0; 147 pGlint->y = 0; 148 pGlint->h = 0; 149 pGlint->w = 0; 150 pGlint->ROP = 0xFF; 151 GLINT_SLOW_WRITE_REG(pGlint->PixelWidth, FBReadPixel); 152 GLINT_SLOW_WRITE_REG(pGlint->TexMapFormat, PMTextureMapFormat); 153 GLINT_SLOW_WRITE_REG(0, RectangleSize); 154 GLINT_SLOW_WRITE_REG(0, RectangleOrigin); 155 GLINT_SLOW_WRITE_REG(0, dXDom); 156 GLINT_SLOW_WRITE_REG(1<<16, dY); 157 GLINT_SLOW_WRITE_REG(0, StartXDom); 158 GLINT_SLOW_WRITE_REG(0, StartXSub); 159 GLINT_SLOW_WRITE_REG(0, StartY); 160 GLINT_SLOW_WRITE_REG(0, GLINTCount); 161 162 TRACE_EXIT("Permedia2InitializeEngine"); 163} 164 165void 166Permedia2Sync(ScrnInfoPtr pScrn) 167{ 168 GLINTPtr pGlint = GLINTPTR(pScrn); 169 170 CHECKCLIPPING; 171 172 while (GLINT_READ_REG(DMACount) != 0); 173 GLINT_WAIT(2); 174 GLINT_WRITE_REG(0x400, FilterMode); 175 GLINT_WRITE_REG(0, GlintSync); 176 do { 177 while(GLINT_READ_REG(OutFIFOWords) == 0); 178 } while (GLINT_READ_REG(OutputFIFO) != Sync_tag); 179} 180 181void 182Permedia2LoadCoord( 183 ScrnInfoPtr pScrn, 184 int x, int y, 185 int w, int h 186){ 187 GLINTPtr pGlint = GLINTPTR(pScrn); 188 189 if ((h != pGlint->h) || (w != pGlint->w)) { 190 pGlint->w = w; 191 pGlint->h = h; 192 GLINT_WRITE_REG(((h&0x0FFF)<<16)|(w&0x0FFF), RectangleSize); 193 } 194 if ((y != pGlint->y) || (x != pGlint->x)) { 195 pGlint->x = x; 196 pGlint->y = y; 197 GLINT_WRITE_REG(((y&0x0FFF)<<16)|(x&0x0FFF), RectangleOrigin); 198 } 199} 200 201