pm2_common.c revision b3d5324c
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(UNIT_DISABLE,	PMTextureReadMode);
76    GLINT_SLOW_WRITE_REG(pGlint->pprod,	LBReadMode);
77    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	AlphaBlendMode);
78    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	TexelLUTMode);
79    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	YUVMode);
80    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	DepthMode);
81    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	RouterMode);
82    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	FogMode);
83    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	AntialiasMode);
84    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	AlphaTestMode);
85    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	StencilMode);
86    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	AreaStippleMode);
87    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	LogicalOpMode);
88    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	DepthMode);
89    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	StatisticMode);
90    GLINT_SLOW_WRITE_REG(0x400,		FilterMode);
91    GLINT_SLOW_WRITE_REG(0xffffffff,	FBHardwareWriteMask);
92    GLINT_SLOW_WRITE_REG(0xffffffff,	FBSoftwareWriteMask);
93    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	RasterizerMode);
94    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	GLINTDepth);
95    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	FBSourceOffset);
96    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	FBPixelOffset);
97    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	LBSourceOffset);
98    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	WindowOrigin);
99    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	FBWindowBase);
100    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	FBSourceBase);
101    GLINT_SLOW_WRITE_REG(UNIT_DISABLE,	LBWindowBase);
102
103#if X_BYTE_ORDER == X_BIG_ENDIAN
104    pGlint->RasterizerSwap = 1;
105#else
106    pGlint->RasterizerSwap = 0;
107#endif
108
109    switch (pScrn->bitsPerPixel) {
110	case 8:
111	    pGlint->PixelWidth = 0x0; /* 8 Bits */
112	    pGlint->TexMapFormat = pGlint->pprod;
113#if X_BYTE_ORDER == X_BIG_ENDIAN
114	    pGlint->RasterizerSwap |= 3<<15;	/* Swap host data */
115#endif
116	    break;
117	case 16:
118	    pGlint->PixelWidth = 0x1; /* 16 Bits */
119	    pGlint->TexMapFormat = pGlint->pprod | 1<<19;
120#if X_BYTE_ORDER == X_BIG_ENDIAN
121	    pGlint->RasterizerSwap |= 2<<15;	/* Swap host data */
122#endif
123	    break;
124	case 24:
125 	    pGlint->PixelWidth = 0x4; /* 24 Bits */
126	    pGlint->TexMapFormat = pGlint->pprod | 2<<19;
127	    break;
128	case 32:
129	    pGlint->PixelWidth = 0x2; /* 32 Bits */
130	    pGlint->TexMapFormat = pGlint->pprod | 2<<19;
131  	    break;
132    }
133    pGlint->ClippingOn = FALSE;
134    pGlint->startxdom = 0;
135    pGlint->startxsub = 0;
136    pGlint->starty = 0;
137    pGlint->count = 0;
138    pGlint->dy = 1<<16;
139    pGlint->dxdom = 0;
140    pGlint->x = 0;
141    pGlint->y = 0;
142    pGlint->h = 0;
143    pGlint->w = 0;
144    pGlint->ROP = 0xFF;
145    GLINT_SLOW_WRITE_REG(pGlint->PixelWidth, FBReadPixel);
146    GLINT_SLOW_WRITE_REG(pGlint->TexMapFormat, PMTextureMapFormat);
147    GLINT_SLOW_WRITE_REG(0, RectangleSize);
148    GLINT_SLOW_WRITE_REG(0, RectangleOrigin);
149    GLINT_SLOW_WRITE_REG(0, dXDom);
150    GLINT_SLOW_WRITE_REG(1<<16, dY);
151    GLINT_SLOW_WRITE_REG(0, StartXDom);
152    GLINT_SLOW_WRITE_REG(0, StartXSub);
153    GLINT_SLOW_WRITE_REG(0, StartY);
154    GLINT_SLOW_WRITE_REG(0, GLINTCount);
155
156    TRACE_EXIT("Permedia2InitializeEngine");
157}
158
159void
160Permedia2Sync(ScrnInfoPtr pScrn)
161{
162    GLINTPtr pGlint = GLINTPTR(pScrn);
163
164    CHECKCLIPPING;
165
166    while (GLINT_READ_REG(DMACount) != 0);
167    GLINT_WAIT(2);
168    GLINT_WRITE_REG(0x400, FilterMode);
169    GLINT_WRITE_REG(0, GlintSync);
170    do {
171   	while(GLINT_READ_REG(OutFIFOWords) == 0);
172    } while (GLINT_READ_REG(OutputFIFO) != Sync_tag);
173}
174
175void
176Permedia2LoadCoord(
177	ScrnInfoPtr pScrn,
178	int x, int y,
179	int w, int h
180){
181    GLINTPtr pGlint = GLINTPTR(pScrn);
182
183    if ((h != pGlint->h) || (w != pGlint->w)) {
184	pGlint->w = w;
185	pGlint->h = h;
186	GLINT_WRITE_REG(((h&0x0FFF)<<16)|(w&0x0FFF), RectangleSize);
187    }
188    if ((y != pGlint->y) || (x != pGlint->x)) {
189	pGlint->x = x;
190	pGlint->y = y;
191	GLINT_WRITE_REG(((y&0x0FFF)<<16)|(x&0x0FFF), RectangleOrigin);
192    }
193}
194
195