1 /* $XFree86: xc/lib/GL/mesa/src/drv/r200/r200_maos_verts.c,v 1.1 2002/10/30 12:51:52 alanh Exp $ */
3 Copyright (C) The Weather Channel, Inc. 2002. All Rights Reserved.
5 The Weather Channel (TM) funded Tungsten Graphics to develop the
6 initial release of the Radeon 8500 driver under the XFree86 license.
7 This notice must be preserved.
9 Permission is hereby granted, free of charge, to any person obtaining
10 a copy of this software and associated documentation files (the
11 "Software"), to deal in the Software without restriction, including
12 without limitation the rights to use, copy, modify, merge, publish,
13 distribute, sublicense, and/or sell copies of the Software, and to
14 permit persons to whom the Software is furnished to do so, subject to
15 the following conditions:
17 The above copyright notice and this permission notice (including the
18 next paragraph) shall be included in all copies or substantial
19 portions of the Software.
21 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
22 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
24 IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
25 LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
26 OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
27 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29 **************************************************************************/
33 * Keith Whitwell <keith@tungstengraphics.com>
44 #include "array_cache/acache.h"
46 #include "tnl/t_pipeline.h"
47 #include "tnl/t_imm_debug.h"
49 #include "r200_context.h"
50 #include "r200_state.h"
51 #include "r200_ioctl.h"
54 #include "r200_swtcl.h"
55 #include "r200_maos.h"
58 #define R200_TCL_MAX_SETUP 13
60 union emit_union
{ float f
; GLuint ui
; GLubyte ub
[4]; };
63 void (*emit
)( GLcontext
*, GLuint
, GLuint
, void * );
66 } setup_tab
[R200_TCL_MAX_SETUP
];
68 #define DO_W (IND & R200_CP_VC_FRMT_W0)
69 #define DO_RGBA (IND & R200_CP_VC_FRMT_PKCOLOR)
70 #define DO_SPEC (IND & R200_CP_VC_FRMT_PKSPEC)
71 #define DO_FOG (IND & R200_CP_VC_FRMT_PKSPEC)
72 #define DO_TEX0 (IND & R200_CP_VC_FRMT_ST0)
73 #define DO_TEX1 (IND & R200_CP_VC_FRMT_ST1)
74 #define DO_PTEX (IND & R200_CP_VC_FRMT_Q0)
75 #define DO_NORM (IND & R200_CP_VC_FRMT_N0)
80 #define GET_TEXSOURCE(n) n
82 /***********************************************************************
83 * Generate vertex emit functions *
84 ***********************************************************************/
87 /* Defined in order of increasing vertex size:
90 #define IND (R200_CP_VC_FRMT_XY| \
92 R200_CP_VC_FRMT_PKCOLOR)
93 #define TAG(x) x##_rgba
94 #include "r200_maos_vbtmp.h"
97 #define IND (R200_CP_VC_FRMT_XY| \
101 #include "r200_maos_vbtmp.h"
104 #define IND (R200_CP_VC_FRMT_XY| \
106 R200_CP_VC_FRMT_PKCOLOR| \
108 #define TAG(x) x##_rgba_st
109 #include "r200_maos_vbtmp.h"
112 #define IND (R200_CP_VC_FRMT_XY| \
114 R200_CP_VC_FRMT_PKCOLOR| \
116 #define TAG(x) x##_rgba_n
117 #include "r200_maos_vbtmp.h"
120 #define IND (R200_CP_VC_FRMT_XY| \
122 R200_CP_VC_FRMT_ST0| \
124 #define TAG(x) x##_st_n
125 #include "r200_maos_vbtmp.h"
128 #define IND (R200_CP_VC_FRMT_XY| \
130 R200_CP_VC_FRMT_PKCOLOR| \
131 R200_CP_VC_FRMT_ST0| \
133 #define TAG(x) x##_rgba_st_st
134 #include "r200_maos_vbtmp.h"
137 #define IND (R200_CP_VC_FRMT_XY| \
139 R200_CP_VC_FRMT_PKCOLOR| \
140 R200_CP_VC_FRMT_ST0| \
142 #define TAG(x) x##_rgba_st_n
143 #include "r200_maos_vbtmp.h"
146 #define IND (R200_CP_VC_FRMT_XY| \
148 R200_CP_VC_FRMT_PKCOLOR| \
149 R200_CP_VC_FRMT_PKSPEC| \
150 R200_CP_VC_FRMT_ST0| \
152 #define TAG(x) x##_rgba_spec_st_st
153 #include "r200_maos_vbtmp.h"
156 #define IND (R200_CP_VC_FRMT_XY| \
158 R200_CP_VC_FRMT_ST0| \
159 R200_CP_VC_FRMT_ST1| \
161 #define TAG(x) x##_st_st_n
162 #include "r200_maos_vbtmp.h"
165 #define IND (R200_CP_VC_FRMT_XY| \
167 R200_CP_VC_FRMT_PKCOLOR| \
168 R200_CP_VC_FRMT_PKSPEC| \
169 R200_CP_VC_FRMT_ST0| \
170 R200_CP_VC_FRMT_ST1| \
172 #define TAG(x) x##_rgba_spec_st_st_n
173 #include "r200_maos_vbtmp.h"
176 #define IND (R200_CP_VC_FRMT_XY| \
178 R200_CP_VC_FRMT_PKCOLOR| \
179 R200_CP_VC_FRMT_ST0| \
181 #define TAG(x) x##_rgba_stq
182 #include "r200_maos_vbtmp.h"
185 #define IND (R200_CP_VC_FRMT_XY| \
187 R200_CP_VC_FRMT_PKCOLOR| \
188 R200_CP_VC_FRMT_ST1| \
189 R200_CP_VC_FRMT_Q1| \
190 R200_CP_VC_FRMT_ST0| \
192 #define TAG(x) x##_rgba_stq_stq
193 #include "r200_maos_vbtmp.h"
196 #define IND (R200_CP_VC_FRMT_XY| \
198 R200_CP_VC_FRMT_W0| \
199 R200_CP_VC_FRMT_PKCOLOR| \
200 R200_CP_VC_FRMT_PKSPEC| \
201 R200_CP_VC_FRMT_ST0| \
202 R200_CP_VC_FRMT_Q0| \
203 R200_CP_VC_FRMT_ST1| \
204 R200_CP_VC_FRMT_Q1| \
206 #define TAG(x) x##_w_rgba_spec_stq_stq_n
207 #include "r200_maos_vbtmp.h"
213 /***********************************************************************
215 ***********************************************************************/
218 static void init_tcl_verts( void )
227 init_rgba_spec_st_st();
229 init_rgba_spec_st_st_n();
232 init_w_rgba_spec_stq_stq_n();
236 void r200EmitArrays( GLcontext
*ctx
, GLuint inputs
)
238 r200ContextPtr rmesa
= R200_CONTEXT(ctx
);
239 struct vertex_buffer
*VB
= &TNL_CONTEXT(ctx
)->vb
;
241 GLuint vtx
= (rmesa
->hw
.tcl
.cmd
[TCL_OUTPUT_VTXFMT
] &
242 ~(R200_TCL_VTX_Q0
|R200_TCL_VTX_Q1
));
244 static int firsttime
= 1;
252 req
|= R200_CP_VC_FRMT_Z
;
253 if (VB
->ObjPtr
->size
== 4) {
254 req
|= R200_CP_VC_FRMT_W0
;
258 if (inputs
& VERT_BIT_NORMAL
) {
259 req
|= R200_CP_VC_FRMT_N0
;
262 if (inputs
& VERT_BIT_COLOR0
) {
263 req
|= R200_CP_VC_FRMT_PKCOLOR
;
266 if (inputs
& VERT_BIT_COLOR1
) {
267 req
|= R200_CP_VC_FRMT_PKSPEC
;
270 if (inputs
& VERT_BIT_TEX0
) {
271 req
|= R200_CP_VC_FRMT_ST0
;
273 if (VB
->TexCoordPtr
[0]->size
== 4) {
274 req
|= R200_CP_VC_FRMT_Q0
;
275 vtx
|= R200_TCL_VTX_Q0
;
279 if (inputs
& VERT_BIT_TEX1
) {
280 req
|= R200_CP_VC_FRMT_ST1
;
282 if (VB
->TexCoordPtr
[1]->size
== 4) {
283 req
|= R200_CP_VC_FRMT_Q1
;
284 vtx
|= R200_TCL_VTX_Q1
;
288 if (vtx
!= rmesa
->hw
.tcl
.cmd
[TCL_OUTPUT_VTXFMT
]) {
289 R200_STATECHANGE( rmesa
, tcl
);
290 rmesa
->hw
.tcl
.cmd
[TCL_OUTPUT_VTXFMT
] = vtx
;
293 for (i
= 0 ; i
< R200_TCL_MAX_SETUP
; i
++)
294 if ((setup_tab
[i
].vertex_format
& req
) == req
)
297 if (rmesa
->tcl
.vertex_format
== setup_tab
[i
].vertex_format
&&
298 rmesa
->tcl
.indexed_verts
.buf
)
301 if (rmesa
->tcl
.indexed_verts
.buf
)
302 r200ReleaseArrays( ctx
, ~0 );
304 r200AllocDmaRegionVerts( rmesa
,
305 &rmesa
->tcl
.indexed_verts
,
307 setup_tab
[i
].vertex_size
* 4,
310 setup_tab
[i
].emit( ctx
, 0, VB
->Count
,
311 rmesa
->tcl
.indexed_verts
.address
+
312 rmesa
->tcl
.indexed_verts
.start
);
314 rmesa
->tcl
.vertex_format
= setup_tab
[i
].vertex_format
;
315 rmesa
->tcl
.indexed_verts
.aos_start
= GET_START( &rmesa
->tcl
.indexed_verts
);
316 rmesa
->tcl
.indexed_verts
.aos_size
= setup_tab
[i
].vertex_size
;
317 rmesa
->tcl
.indexed_verts
.aos_stride
= setup_tab
[i
].vertex_size
;
319 rmesa
->tcl
.aos_components
[0] = &rmesa
->tcl
.indexed_verts
;
320 rmesa
->tcl
.nr_aos_components
= 1;
325 void r200ReleaseArrays( GLcontext
*ctx
, GLuint newinputs
)
327 r200ContextPtr rmesa
= R200_CONTEXT( ctx
);
329 if (R200_DEBUG
& DEBUG_VERTS
)
330 _tnl_print_vert_flags( __FUNCTION__
, newinputs
);
333 r200ReleaseDmaRegion( rmesa
, &rmesa
->tcl
.indexed_verts
, __FUNCTION__
);