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