2 * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved.
3 * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved.
5 * Permission is hereby granted, free of charge, to any person obtaining a
6 * copy of this software and associated documentation files (the "Software"),
7 * to deal in the Software without restriction, including without limitation
8 * the rights to use, copy, modify, merge, publish, distribute, sub license,
9 * and/or sell copies of the Software, and to permit persons to whom the
10 * Software is furnished to do so, subject to the following conditions:
12 * The above copyright notice and this permission notice (including the
13 * next paragraph) shall be included in all copies or substantial portions
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
19 * VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
20 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 * DEALINGS IN THE SOFTWARE.
31 #include "swrast_setup/swrast_setup.h"
32 #include "tnl/t_context.h"
34 #include "via_context.h"
36 #include "via_ioctl.h"
38 #include "via_state.h"
41 void (*emit
)(GLcontext
*, GLuint
, GLuint
, void *, GLuint
);
42 tnl_interp_func interp
;
43 tnl_copy_pv_func copyPv
;
44 GLboolean (*check_tex_sizes
)(GLcontext
*ctx
);
46 GLuint vertexStrideShift
;
48 } setup_tab
[VIA_MAX_SETUP
];
50 #define TINY_VERTEX_FORMAT 1
51 #define NOTEX_VERTEX_FORMAT 2
52 #define TEX0_VERTEX_FORMAT 3
53 #define TEX1_VERTEX_FORMAT 4
55 #define PROJ_TEX1_VERTEX_FORMAT 0
56 #define TEX2_VERTEX_FORMAT 0
57 #define TEX3_VERTEX_FORMAT 0
58 #define PROJ_TEX3_VERTEX_FORMAT 0
60 #define DO_XYZW (IND & VIA_XYZW_BIT)
61 #define DO_RGBA (IND & VIA_RGBA_BIT)
62 #define DO_SPEC (IND & VIA_SPEC_BIT)
63 #define DO_FOG (IND & VIA_FOG_BIT)
64 #define DO_TEX0 (IND & VIA_TEX0_BIT)
65 #define DO_TEX1 (IND & VIA_TEX1_BIT)
68 #define DO_PTEX (IND & VIA_PTEX_BIT)
70 #define VERTEX viaVertex
71 #define VERTEX_COLOR via_color_t
72 #define GET_VIEWPORT_MAT() VIA_CONTEXT(ctx)->ViewportMatrix.m
73 #define GET_TEXSOURCE(n) n
74 #define GET_VERTEX_FORMAT() VIA_CONTEXT(ctx)->vertexSize
75 #define GET_VERTEX_SIZE() VIA_CONTEXT(ctx)->vertexSize
76 #define GET_VERTEX_STORE() VIA_CONTEXT(ctx)->verts
77 #define GET_VERTEX_STRIDE_SHIFT() VIA_CONTEXT(ctx)->vertexStrideShift
78 #define GET_UBYTE_COLOR_STORE() &VIA_CONTEXT(ctx)->UbyteColor
79 #define GET_UBYTE_SPEC_COLOR_STORE() &VIA_CONTEXT(ctx)->UbyteSecondaryColor
80 #define INVALIDATE_STORED_VERTICES()
82 #define HAVE_HW_VIEWPORT 0
83 #define HAVE_HW_DIVIDE 0
84 #define HAVE_RGBA_COLOR 0
85 #define HAVE_TINY_VERTICES 1
86 #define HAVE_NOTEX_VERTICES 1
87 #define HAVE_TEX0_VERTICES 1
88 #define HAVE_TEX1_VERTICES 1
89 #define HAVE_TEX2_VERTICES 0
90 #define HAVE_TEX3_VERTICES 0
91 #define HAVE_PTEX_VERTICES 0
93 #define UNVIEWPORT_VARS GLfloat h = VIA_CONTEXT(ctx)->driDrawable->h
94 #define UNVIEWPORT_X(x) x - SUBPIXEL_X
95 #define UNVIEWPORT_Y(y) - y + h + SUBPIXEL_Y
96 #define UNVIEWPORT_Z(z) z * (float)0xffffffff
98 #define PTEX_FALLBACK() FALLBACK(VIA_CONTEXT(ctx), VIA_FALLBACK_TEXTURE, 1)
100 #define IMPORT_FLOAT_COLORS via_import_float_colors
101 #define IMPORT_FLOAT_SPEC_COLORS via_import_float_spec_colors
103 #define INTERP_VERTEX setup_tab[VIA_CONTEXT(ctx)->setupIndex].interp
104 #define COPY_PV_VERTEX setup_tab[VIA_CONTEXT(ctx)->setupIndex].copyPv
107 /***********************************************************************
108 * Generate pv-copying and translation functions *
109 ***********************************************************************/
111 #define TAG(x) via_##x
112 #include "tnl_dd/t_dd_vb.c"
114 /***********************************************************************
115 * Generate vertex emit and interp functions *
116 ***********************************************************************/
117 #define IND (VIA_XYZW_BIT | VIA_RGBA_BIT)
118 #define TAG(x) x##_wg
119 #include "via_dd_vbtmp.h"
121 #define IND (VIA_XYZW_BIT | VIA_RGBA_BIT | VIA_SPEC_BIT)
122 #define TAG(x) x##_wgs
123 #include "via_dd_vbtmp.h"
125 #define IND (VIA_XYZW_BIT | VIA_RGBA_BIT | VIA_TEX0_BIT)
126 #define TAG(x) x##_wgt0
127 #include "via_dd_vbtmp.h"
129 #define IND (VIA_XYZW_BIT | VIA_RGBA_BIT | VIA_TEX0_BIT | VIA_TEX1_BIT)
130 #define TAG(x) x##_wgt0t1
131 #include "via_dd_vbtmp.h"
133 #define IND (VIA_XYZW_BIT | VIA_RGBA_BIT | VIA_TEX0_BIT | VIA_PTEX_BIT)
134 #define TAG(x) x##_wgpt0
135 #include "via_dd_vbtmp.h"
137 #define IND (VIA_XYZW_BIT | VIA_RGBA_BIT | VIA_TEX0_BIT | VIA_TEX1_BIT |\
139 #define TAG(x) x##_wgpt0t1
140 #include "via_dd_vbtmp.h"
142 #define IND (VIA_XYZW_BIT | VIA_RGBA_BIT | VIA_SPEC_BIT | VIA_TEX0_BIT)
143 #define TAG(x) x##_wgst0
144 #include "via_dd_vbtmp.h"
146 #define IND (VIA_XYZW_BIT | VIA_RGBA_BIT | VIA_SPEC_BIT | VIA_TEX0_BIT |\
148 #define TAG(x) x##_wgst0t1
149 #include "via_dd_vbtmp.h"
151 #define IND (VIA_XYZW_BIT | VIA_RGBA_BIT | VIA_SPEC_BIT | VIA_TEX0_BIT |\
153 #define TAG(x) x##_wgspt0
154 #include "via_dd_vbtmp.h"
156 #define IND (VIA_XYZW_BIT | VIA_RGBA_BIT | VIA_SPEC_BIT | VIA_TEX0_BIT |\
157 VIA_TEX1_BIT | VIA_PTEX_BIT)
158 #define TAG(x) x##_wgspt0t1
159 #include "via_dd_vbtmp.h"
161 #define IND (VIA_XYZW_BIT | VIA_RGBA_BIT | VIA_FOG_BIT)
162 #define TAG(x) x##_wgf
163 #include "via_dd_vbtmp.h"
165 #define IND (VIA_XYZW_BIT | VIA_RGBA_BIT | VIA_FOG_BIT | VIA_SPEC_BIT)
166 #define TAG(x) x##_wgfs
167 #include "via_dd_vbtmp.h"
169 #define IND (VIA_XYZW_BIT | VIA_RGBA_BIT | VIA_FOG_BIT | VIA_TEX0_BIT)
170 #define TAG(x) x##_wgft0
171 #include "via_dd_vbtmp.h"
173 #define IND (VIA_XYZW_BIT | VIA_RGBA_BIT | VIA_FOG_BIT | VIA_TEX0_BIT |\
175 #define TAG(x) x##_wgft0t1
176 #include "via_dd_vbtmp.h"
178 #define IND (VIA_XYZW_BIT | VIA_RGBA_BIT | VIA_FOG_BIT | VIA_TEX0_BIT |\
180 #define TAG(x) x##_wgfpt0
181 #include "via_dd_vbtmp.h"
183 #define IND (VIA_XYZW_BIT | VIA_RGBA_BIT | VIA_FOG_BIT | VIA_TEX0_BIT |\
184 VIA_TEX1_BIT | VIA_PTEX_BIT)
185 #define TAG(x) x##_wgfpt0t1
186 #include "via_dd_vbtmp.h"
188 #define IND (VIA_XYZW_BIT | VIA_RGBA_BIT | VIA_FOG_BIT | VIA_SPEC_BIT |\
190 #define TAG(x) x##_wgfst0
191 #include "via_dd_vbtmp.h"
193 #define IND (VIA_XYZW_BIT | VIA_RGBA_BIT | VIA_FOG_BIT | VIA_SPEC_BIT |\
194 VIA_TEX0_BIT | VIA_TEX1_BIT)
195 #define TAG(x) x##_wgfst0t1
196 #include "via_dd_vbtmp.h"
198 #define IND (VIA_XYZW_BIT | VIA_RGBA_BIT | VIA_FOG_BIT | VIA_SPEC_BIT |\
199 VIA_TEX0_BIT | VIA_PTEX_BIT)
200 #define TAG(x) x##_wgfspt0
201 #include "via_dd_vbtmp.h"
203 #define IND (VIA_XYZW_BIT | VIA_RGBA_BIT | VIA_FOG_BIT | VIA_SPEC_BIT |\
204 VIA_TEX0_BIT | VIA_TEX1_BIT | VIA_PTEX_BIT)
205 #define TAG(x) x##_wgfspt0t1
206 #include "via_dd_vbtmp.h"
208 static void init_setup_tab(void) {
232 void viaPrintSetupFlags(char *msg
, GLuint flags
) {
234 if (VIA_DEBUG
) fprintf(stderr
, "%s(%x): %s%s%s%s%s%s\n",
237 (flags
& VIA_XYZW_BIT
) ? " xyzw," : "",
238 (flags
& VIA_RGBA_BIT
) ? " rgba," : "",
239 (flags
& VIA_SPEC_BIT
) ? " spec," : "",
240 (flags
& VIA_FOG_BIT
) ? " fog," : "",
241 (flags
& VIA_TEX0_BIT
) ? " tex-0," : "",
242 (flags
& VIA_TEX1_BIT
) ? " tex-1," : "");
246 void viaCheckTexSizes(GLcontext
*ctx
) {
247 TNLcontext
*tnl
= TNL_CONTEXT(ctx
);
248 viaContextPtr vmesa
= VIA_CONTEXT(ctx
);
251 fprintf(stderr
, "%s - in\n", __FUNCTION__
);
252 fprintf(stderr
, "setupIndex = %x\n", vmesa
->setupIndex
);
255 if (!setup_tab
[vmesa
->setupIndex
].check_tex_sizes(ctx
)) {
256 /* Invalidate stored verts
258 vmesa
->setupNewInputs
= ~0;
259 vmesa
->setupIndex
|= VIA_PTEX_BIT
;
261 if (!vmesa
->Fallback
&&
262 !(ctx
->_TriangleCaps
& (DD_TRI_LIGHT_TWOSIDE
|DD_TRI_UNFILLED
))) {
263 tnl
->Driver
.Render
.Interp
= setup_tab
[vmesa
->setupIndex
].interp
;
264 tnl
->Driver
.Render
.CopyPV
= setup_tab
[vmesa
->setupIndex
].copyPv
;
268 if (VIA_DEBUG
) fprintf(stderr
, "%s - out\n", __FUNCTION__
);
272 void viaBuildVertices(GLcontext
*ctx
,
277 viaContextPtr vmesa
= VIA_CONTEXT(ctx
);
278 GLubyte
*v
= ((GLubyte
*)vmesa
->verts
+ (start
<< vmesa
->vertexStrideShift
));
279 GLuint stride
= 1 << vmesa
->vertexStrideShift
;
281 if (VIA_DEBUG
) fprintf(stderr
, "%s - in\n", __FUNCTION__
);
283 newinputs
|= vmesa
->setupNewInputs
;
284 vmesa
->setupNewInputs
= 0;
287 if (newinputs
& VERT_BIT_CLIP
) {
288 setup_tab
[vmesa
->setupIndex
].emit(ctx
, start
, count
, v
, stride
);
293 if (newinputs
& VERT_BIT_COLOR0
)
296 if (newinputs
& VERT_BIT_COLOR1
)
299 if (newinputs
& VERT_BIT_TEX0
)
302 if (newinputs
& VERT_BIT_TEX1
)
305 if (newinputs
& VERT_BIT_FOG
)
308 if (vmesa
->setupIndex
& VIA_PTEX_BIT
)
311 ind
&= vmesa
->setupIndex
;
315 setup_tab
[ind
].emit(ctx
, start
, count
, v
, stride
);
319 if (VIA_DEBUG
) fprintf(stderr
, "%s - out\n", __FUNCTION__
);
323 void viaChooseVertexState(GLcontext
*ctx
) {
324 TNLcontext
*tnl
= TNL_CONTEXT(ctx
);
325 viaContextPtr vmesa
= VIA_CONTEXT(ctx
);
326 GLuint ind
= VIA_XYZW_BIT
| VIA_RGBA_BIT
;
328 if (VIA_DEBUG
) fprintf(stderr
, "%s - in\n", __FUNCTION__
);
330 if (ctx
->_TriangleCaps
& DD_SEPARATE_SPECULAR
)
333 if (ctx
->Fog
.Enabled
)
336 if (ctx
->Texture
._EnabledUnits
> 1)
337 ind
|= VIA_TEX1_BIT
| VIA_TEX0_BIT
;
338 else if (ctx
->Texture
._EnabledUnits
== 1)
341 vmesa
->setupIndex
= ind
;
343 if (VIA_DEBUG
) fprintf(stderr
, "setupIndex = %x\n", vmesa
->setupIndex
);
346 if (ctx
->_TriangleCaps
& (DD_TRI_LIGHT_TWOSIDE
|DD_TRI_UNFILLED
)) {
347 tnl
->Driver
.Render
.Interp
= via_interp_extras
;
348 tnl
->Driver
.Render
.CopyPV
= via_copy_pv_extras
;
351 tnl
->Driver
.Render
.Interp
= setup_tab
[ind
].interp
;
352 tnl
->Driver
.Render
.CopyPV
= setup_tab
[ind
].copyPv
;
355 vmesa
->vertexSize
= setup_tab
[ind
].vertexSize
;
356 vmesa
->vertexStrideShift
= setup_tab
[ind
].vertexStrideShift
;
358 if (VIA_DEBUG
) fprintf(stderr
, "%s - out\n", __FUNCTION__
);
363 void via_emit_contiguous_verts(GLcontext
*ctx
,
366 viaContextPtr vmesa
= VIA_CONTEXT(ctx
);
367 GLuint vertexSize
= vmesa
->vertexSize
* 4;
368 GLuint
*dest
= viaCheckDma(vmesa
, (count
- start
) * vertexSize
);
370 if (VIA_DEBUG
) fprintf(stderr
, "%s - in\n", __FUNCTION__
);
372 if (VIA_DEBUG
) fprintf(stderr
, "choose setup_tab[0x%x]\n", vmesa
->setupIndex
);
374 setup_tab
[vmesa
->setupIndex
].emit(ctx
, start
, count
, dest
, vertexSize
);
375 vmesa
->dmaLow
+= (count
- start
) * vertexSize
;
377 if (VIA_DEBUG
) fprintf(stderr
, "%s - out\n", __FUNCTION__
);
381 void viaInitVB(GLcontext
*ctx
) {
382 viaContextPtr vmesa
= VIA_CONTEXT(ctx
);
383 GLuint size
= TNL_CONTEXT(ctx
)->vb
.Size
;
385 vmesa
->verts
= ALIGN_MALLOC(size
* 4 * 16, 32);
388 static int firsttime
= 1;
396 void viaFreeVB(GLcontext
*ctx
) {
397 viaContextPtr vmesa
= VIA_CONTEXT(ctx
);
400 ALIGN_FREE(vmesa
->verts
);
404 if (vmesa
->UbyteSecondaryColor
.Ptr
) {
405 ALIGN_FREE((void*)vmesa
->UbyteSecondaryColor
.Ptr
);
406 vmesa
->UbyteSecondaryColor
.Ptr
= 0;
409 if (vmesa
->UbyteColor
.Ptr
) {
410 ALIGN_FREE((void*)vmesa
->UbyteColor
.Ptr
);
411 vmesa
->UbyteColor
.Ptr
= 0;