1
/**************************************************************************
3
Copyright 2000 Silicon Integrated Systems Corp, Inc., HsinChu, Taiwan.
6
Permission is hereby granted, free of charge, to any person obtaining a
7
copy of this software and associated documentation files (the
8
"Software"), to deal in the Software without restriction, including
9
without limitation the rights to use, copy, modify, merge, publish,
10
distribute, sub license, and/or sell copies of the Software, and to
11
permit persons to whom the Software is furnished to do so, subject to
12
the following conditions:
14
The above copyright notice and this permission notice (including the
15
next paragraph) shall be included in all copies or substantial portions
18
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21
IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
22
ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26
**************************************************************************/
27
/* $XFree86: xc/lib/GL/mesa/src/drv/sis/sis_linefunc.h,v 1.5 2000/09/26 15:56:48 tsi Exp $ */
31
* Sung-Ching Lin <sclin@sis.com.tw>
35
#define SIS_TRI_FUNC 0
37
#define SIS_MMIO_WRITE_VERTEX(v, i) \
38
if(SIS_STEREO && hwcx->stereoEnabled) \
40
MMIOBase[(REG_3D_TSXa+(i)*0x30)/4] = VB->Win.data[v][0] - 0.5 + STEREO_OFFSET(v); \
41
MMIOBase[(REG_3D_TSYa+(i)*0x30)/4] = Y_FLIP (VB->Win.data[v][1]) + 0.5; \
45
MMIOBase[(REG_3D_TSXa+(i)*0x30)/4] = VB->Win.data[v][0] - 0.5 ; \
46
MMIOBase[(REG_3D_TSYa+(i)*0x30)/4] = Y_FLIP (VB->Win.data[v][1]) + 0.5; \
49
if (ctx->TriangleCaps & DD_TRI_OFFSET) \
52
MMIOBase[(REG_3D_TSZa+(i)*0x30)/4] = \
53
(VB->Win.data[v][2] + ctx->PolygonZoffset) / SIS_DEPTH_SCALE; \
56
MMIOBase[(REG_3D_TSZa+(i)*0x30)/4] = \
57
(VB->Win.data[v][2] + ctx->LineZoffset) / SIS_DEPTH_SCALE; \
62
MMIOBase[(REG_3D_TSZa+(i)*0x30)/4] = VB->Win.data[v][2] / SIS_DEPTH_SCALE; \
65
if (SIS_STATES & SIS_TEXTURE0) \
67
if(VB->TexCoordPtr[0]->size == 4){ \
68
MMIOBase[(REG_3D_TSUAa+(i)*0x30)/4] = VB->TexCoordPtr[0]->data[v][0] / \
69
VB->TexCoordPtr[0]->data[v][3]; \
70
MMIOBase[(REG_3D_TSVAa+(i)*0x30)/4] = VB->TexCoordPtr[0]->data[v][1] / \
71
VB->TexCoordPtr[0]->data[v][3]; \
74
MMIOBase[(REG_3D_TSUAa+(i)*0x30)/4] = VB->TexCoordPtr[0]->data[v][0]; \
75
MMIOBase[(REG_3D_TSVAa+(i)*0x30)/4] = VB->TexCoordPtr[0]->data[v][1]; \
79
if (SIS_STATES & SIS_TEXTURE1) \
81
if(VB->TexCoordPtr[1]->size == 4){ \
82
MMIOBase[(REG_3D_TSUBa+(i)*0x30)/4] = VB->TexCoordPtr[1]->data[v][0] / \
83
VB->TexCoordPtr[1]->data[v][3]; \
84
MMIOBase[(REG_3D_TSVBa+(i)*0x30)/4] = VB->TexCoordPtr[1]->data[v][1] / \
85
VB->TexCoordPtr[1]->data[v][3]; \
88
MMIOBase[(REG_3D_TSUBa+(i)*0x30)/4] = VB->TexCoordPtr[1]->data[v][0]; \
89
MMIOBase[(REG_3D_TSVBa+(i)*0x30)/4] = VB->TexCoordPtr[1]->data[v][1]; \
93
if (SIS_STATES & (SIS_USE_W)) \
95
if(VB->TexCoordPtr[0]->size == 4){ \
96
MMIOBase[(REG_3D_TSWGa+(i)*0x30)/4] = VB->Win.data[v][3] * \
97
VB->TexCoordPtr[0]->data[v][3]; \
100
MMIOBase[(REG_3D_TSWGa+(i)*0x30)/4] = VB->Win.data[v][3]; \
104
if (SIS_STATES & (SIS_SMOOTH)) \
108
RGBA8ConvertToBGRA8 (&dcSARGB, VB->ColorPtr->data[v]); \
110
((DWORD *) MMIOBase)[(REG_3D_TSARGBa+(i)*0x30)/4] = dcSARGB; \
112
else if(LAST_VERTEX) \
116
RGBA8ConvertToBGRA8 (&dcSARGB, VB->ColorPtr->data[pv]); \
118
((DWORD *) MMIOBase)[(REG_3D_TSARGBa+(i)*0x30)/4] = dcSARGB; \
122
SIS_TAG (sis_line) (GLcontext * ctx, GLuint vert0, GLuint vert1, GLuint pv)
124
XMesaContext xmesa = (XMesaContext) ctx->DriverCtx;
125
__GLSiScontext *hwcx = (__GLSiScontext *) xmesa->private;
127
struct vertex_buffer *VB = ctx->VB;
128
float *MMIOBase = (float *) GET_IOBase (hwcx);
130
STEREO_SAMPLE(vert0);
132
mWait3DCmdQueue (10 * 2 + 1);
134
if (SIS_STATES & (SIS_SMOOTH))
136
hwcx->dwPrimitiveSet &= ~0x07001f07;
137
hwcx->dwPrimitiveSet |=
138
(OP_3D_FIRE_TSARGBb | SHADE_GOURAUD | OP_3D_LINE_DRAW);
140
((DWORD *) MMIOBase)[REG_3D_PrimitiveSet / 4] = hwcx->dwPrimitiveSet;
144
hwcx->dwPrimitiveSet &= ~0x07001f07;
145
hwcx->dwPrimitiveSet |=
146
(OP_3D_FIRE_TSARGBb | SHADE_FLAT_VertexB | OP_3D_LINE_DRAW);
148
((DWORD *) MMIOBase)[REG_3D_PrimitiveSet / 4] = hwcx->dwPrimitiveSet;
151
#define LAST_VERTEX 0
152
SIS_MMIO_WRITE_VERTEX (vert0, 0);
154
#define LAST_VERTEX 1
155
SIS_MMIO_WRITE_VERTEX (vert1, 1);
165
#define SIS_AGP_WRITE_VERTEX(v) \
167
if(SIS_STEREO && hwcx->stereoEnabled) \
169
AGP_CurrentPtr[0] = VB->Win.data[v][0] - 0.5 + STEREO_OFFSET(v); \
173
AGP_CurrentPtr[0] = VB->Win.data[v][0] - 0.5; \
175
AGP_CurrentPtr[1] = Y_FLIP (VB->Win.data[v][1]) + 0.5; \
177
if (ctx->TriangleCaps & DD_TRI_OFFSET){ \
179
AGP_CurrentPtr[2] = (VB->Win.data[v][2] + ctx->PolygonZoffset) / SIS_DEPTH_SCALE; \
182
AGP_CurrentPtr[2] = (VB->Win.data[v][2] + ctx->LineZoffset) / SIS_DEPTH_SCALE; \
186
AGP_CurrentPtr[2] = VB->Win.data[v][2] / SIS_DEPTH_SCALE; \
189
if (SIS_STATES & (SIS_USE_W)) \
191
if(VB->TexCoordPtr[0]->size == 4){ \
192
AGP_CurrentPtr[0] = VB->Win.data[v][3] * \
193
VB->TexCoordPtr[0]->data[v][3]; \
196
AGP_CurrentPtr[0] = VB->Win.data[v][3]; \
201
if (SIS_STATES & (SIS_SMOOTH)) \
203
RGBA8ConvertToBGRA8 (&dcSARGB, VB->ColorPtr->data[v]); \
204
((DWORD *)AGP_CurrentPtr)[0] = dcSARGB; \
206
else if(FIRST_VERTEX) \
208
RGBA8ConvertToBGRA8 (&dcSARGB, VB->ColorPtr->data[pv]); \
209
((DWORD *)AGP_CurrentPtr)[0] = dcSARGB; \
213
((DWORD *)AGP_CurrentPtr)[0] = dcSARGB; \
217
if (SIS_STATES & SIS_TEXTURE0) \
219
if(VB->TexCoordPtr[0]->size == 4){ \
220
AGP_CurrentPtr[0] = VB->TexCoordPtr[0]->data[v][0] / \
221
VB->TexCoordPtr[0]->data[v][3]; \
222
AGP_CurrentPtr[1] = VB->TexCoordPtr[0]->data[v][1] / \
223
VB->TexCoordPtr[0]->data[v][3]; \
226
AGP_CurrentPtr[0] = VB->TexCoordPtr[0]->data[v][0]; \
227
AGP_CurrentPtr[1] = VB->TexCoordPtr[0]->data[v][1]; \
232
if (SIS_STATES & SIS_TEXTURE1) \
234
if(VB->TexCoordPtr[1]->size == 4){ \
235
AGP_CurrentPtr[0] = VB->TexCoordPtr[1]->data[v][0] / \
236
VB->TexCoordPtr[1]->data[v][3]; \
237
AGP_CurrentPtr[1] = VB->TexCoordPtr[1]->data[v][1] / \
238
VB->TexCoordPtr[1]->data[v][3]; \
241
AGP_CurrentPtr[0] = VB->TexCoordPtr[1]->data[v][0]; \
242
AGP_CurrentPtr[1] = VB->TexCoordPtr[1]->data[v][1]; \
249
SIS_TAG (sis_agp_line) (GLcontext * ctx, GLuint vert0, GLuint vert1,
252
XMesaContext xmesa = (XMesaContext) ctx->DriverCtx;
253
__GLSiScontext *hwcx = (__GLSiScontext *) xmesa->private;
255
struct vertex_buffer *VB = ctx->VB;
259
STEREO_SAMPLE(vert0);
262
if ((DWORD) AGP_CurrentPtr - (DWORD) AGP_StartPtr >= (AGP_ALLOC_SIZE - 0x10))
269
#define FIRST_VERTEX 1
270
SIS_AGP_WRITE_VERTEX (vert0);
272
#define FIRST_VERTEX 0
273
SIS_AGP_WRITE_VERTEX (vert1);