1 /* $XFree86: xc/lib/GL/mesa/src/drv/r200/r200_vtxfmt.c,v 1.4 2003/05/06 23:52:08 daenzer 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>
38 #include "r200_context.h"
39 #include "r200_state.h"
40 #include "r200_ioctl.h"
43 #include "r200_swtcl.h"
44 #include "r200_vtxfmt.h"
47 #include "api_arrayelt.h"
58 #include "tnl/t_context.h"
59 #include "tnl/t_array_api.h"
61 static void r200VtxFmtFlushVertices( GLcontext
*, GLuint
);
63 static void count_func( const char *name
, struct dynfn
*l
)
68 if (i
) fprintf(stderr
, "%s: %d\n", name
, i
);
71 static void count_funcs( r200ContextPtr rmesa
)
73 count_func( "Vertex2f", &rmesa
->vb
.dfn_cache
.Vertex2f
);
74 count_func( "Vertex2fv", &rmesa
->vb
.dfn_cache
.Vertex2fv
);
75 count_func( "Vertex3f", &rmesa
->vb
.dfn_cache
.Vertex3f
);
76 count_func( "Vertex3fv", &rmesa
->vb
.dfn_cache
.Vertex3fv
);
77 count_func( "Color4ub", &rmesa
->vb
.dfn_cache
.Color4ub
);
78 count_func( "Color4ubv", &rmesa
->vb
.dfn_cache
.Color4ubv
);
79 count_func( "Color3ub", &rmesa
->vb
.dfn_cache
.Color3ub
);
80 count_func( "Color3ubv", &rmesa
->vb
.dfn_cache
.Color3ubv
);
81 count_func( "Color4f", &rmesa
->vb
.dfn_cache
.Color4f
);
82 count_func( "Color4fv", &rmesa
->vb
.dfn_cache
.Color4fv
);
83 count_func( "Color3f", &rmesa
->vb
.dfn_cache
.Color3f
);
84 count_func( "Color3fv", &rmesa
->vb
.dfn_cache
.Color3fv
);
85 count_func( "SecondaryColor3f", &rmesa
->vb
.dfn_cache
.SecondaryColor3fEXT
);
86 count_func( "SecondaryColor3fv", &rmesa
->vb
.dfn_cache
.SecondaryColor3fvEXT
);
87 count_func( "SecondaryColor3ub", &rmesa
->vb
.dfn_cache
.SecondaryColor3ubEXT
);
88 count_func( "SecondaryColor3ubv", &rmesa
->vb
.dfn_cache
.SecondaryColor3ubvEXT
);
89 count_func( "Normal3f", &rmesa
->vb
.dfn_cache
.Normal3f
);
90 count_func( "Normal3fv", &rmesa
->vb
.dfn_cache
.Normal3fv
);
91 count_func( "TexCoord2f", &rmesa
->vb
.dfn_cache
.TexCoord2f
);
92 count_func( "TexCoord2fv", &rmesa
->vb
.dfn_cache
.TexCoord2fv
);
93 count_func( "TexCoord1f", &rmesa
->vb
.dfn_cache
.TexCoord1f
);
94 count_func( "TexCoord1fv", &rmesa
->vb
.dfn_cache
.TexCoord1fv
);
95 count_func( "MultiTexCoord2fARB", &rmesa
->vb
.dfn_cache
.MultiTexCoord2fARB
);
96 count_func( "MultiTexCoord2fvARB", &rmesa
->vb
.dfn_cache
.MultiTexCoord2fvARB
);
97 count_func( "MultiTexCoord1fARB", &rmesa
->vb
.dfn_cache
.MultiTexCoord1fARB
);
98 count_func( "MultiTexCoord1fvARB", &rmesa
->vb
.dfn_cache
.MultiTexCoord1fvARB
);
102 void r200_copy_to_current( GLcontext
*ctx
)
104 r200ContextPtr rmesa
= R200_CONTEXT(ctx
);
106 if (R200_DEBUG
& DEBUG_VFMT
)
107 fprintf(stderr
, "%s\n", __FUNCTION__
);
109 assert(ctx
->Driver
.NeedFlush
& FLUSH_UPDATE_CURRENT
);
111 if (rmesa
->vb
.vtxfmt_0
& R200_VTX_N0
) {
112 ctx
->Current
.Attrib
[VERT_ATTRIB_NORMAL
][0] = rmesa
->vb
.normalptr
[0];
113 ctx
->Current
.Attrib
[VERT_ATTRIB_NORMAL
][1] = rmesa
->vb
.normalptr
[1];
114 ctx
->Current
.Attrib
[VERT_ATTRIB_NORMAL
][2] = rmesa
->vb
.normalptr
[2];
117 switch( VTX_COLOR(rmesa
->vb
.vtxfmt_0
, 0) ) {
118 case R200_VTX_PK_RGBA
:
119 ctx
->Current
.Attrib
[VERT_ATTRIB_COLOR0
][0] = UBYTE_TO_FLOAT( rmesa
->vb
.colorptr
->red
);
120 ctx
->Current
.Attrib
[VERT_ATTRIB_COLOR0
][1] = UBYTE_TO_FLOAT( rmesa
->vb
.colorptr
->green
);
121 ctx
->Current
.Attrib
[VERT_ATTRIB_COLOR0
][2] = UBYTE_TO_FLOAT( rmesa
->vb
.colorptr
->blue
);
122 ctx
->Current
.Attrib
[VERT_ATTRIB_COLOR0
][3] = UBYTE_TO_FLOAT( rmesa
->vb
.colorptr
->alpha
);
125 case R200_VTX_FP_RGB
:
126 ctx
->Current
.Attrib
[VERT_ATTRIB_COLOR0
][0] = rmesa
->vb
.floatcolorptr
[0];
127 ctx
->Current
.Attrib
[VERT_ATTRIB_COLOR0
][1] = rmesa
->vb
.floatcolorptr
[1];
128 ctx
->Current
.Attrib
[VERT_ATTRIB_COLOR0
][2] = rmesa
->vb
.floatcolorptr
[2];
131 case R200_VTX_FP_RGBA
:
132 ctx
->Current
.Attrib
[VERT_ATTRIB_COLOR0
][0] = rmesa
->vb
.floatcolorptr
[0];
133 ctx
->Current
.Attrib
[VERT_ATTRIB_COLOR0
][1] = rmesa
->vb
.floatcolorptr
[1];
134 ctx
->Current
.Attrib
[VERT_ATTRIB_COLOR0
][2] = rmesa
->vb
.floatcolorptr
[2];
135 ctx
->Current
.Attrib
[VERT_ATTRIB_COLOR0
][3] = rmesa
->vb
.floatcolorptr
[3];
142 if (VTX_COLOR(rmesa
->vb
.vtxfmt_0
, 1) == R200_VTX_PK_RGBA
) {
143 ctx
->Current
.Attrib
[VERT_ATTRIB_COLOR1
][0] = UBYTE_TO_FLOAT( rmesa
->vb
.specptr
->red
);
144 ctx
->Current
.Attrib
[VERT_ATTRIB_COLOR1
][1] = UBYTE_TO_FLOAT( rmesa
->vb
.specptr
->green
);
145 ctx
->Current
.Attrib
[VERT_ATTRIB_COLOR1
][2] = UBYTE_TO_FLOAT( rmesa
->vb
.specptr
->blue
);
148 if (rmesa
->vb
.vtxfmt_1
& (7 << R200_VTX_TEX0_COMP_CNT_SHIFT
)) {
149 ctx
->Current
.Attrib
[VERT_ATTRIB_TEX0
][0] = rmesa
->vb
.texcoordptr
[0][0];
150 ctx
->Current
.Attrib
[VERT_ATTRIB_TEX0
][1] = rmesa
->vb
.texcoordptr
[0][1];
151 ctx
->Current
.Attrib
[VERT_ATTRIB_TEX0
][2] = 0.0F
;
152 ctx
->Current
.Attrib
[VERT_ATTRIB_TEX0
][3] = 1.0F
;
155 if (rmesa
->vb
.vtxfmt_1
& (7 << R200_VTX_TEX1_COMP_CNT_SHIFT
)) {
156 ctx
->Current
.Attrib
[VERT_ATTRIB_TEX1
][0] = rmesa
->vb
.texcoordptr
[1][0];
157 ctx
->Current
.Attrib
[VERT_ATTRIB_TEX1
][1] = rmesa
->vb
.texcoordptr
[1][1];
158 ctx
->Current
.Attrib
[VERT_ATTRIB_TEX1
][2] = 0.0F
;
159 ctx
->Current
.Attrib
[VERT_ATTRIB_TEX1
][3] = 1.0F
;
162 ctx
->Driver
.NeedFlush
&= ~FLUSH_UPDATE_CURRENT
;
165 static GLboolean discreet_gl_prim
[GL_POLYGON
+1] = {
168 0, /* 2 line_strip */
178 static void flush_prims( r200ContextPtr rmesa
)
181 struct r200_dma_region tmp
= rmesa
->dma
.current
;
184 tmp
.aos_size
= rmesa
->vb
.vertex_size
;
185 tmp
.aos_stride
= rmesa
->vb
.vertex_size
;
186 tmp
.aos_start
= GET_START(&tmp
);
188 rmesa
->dma
.current
.ptr
= rmesa
->dma
.current
.start
+=
189 (rmesa
->vb
.initial_counter
- rmesa
->vb
.counter
) *
190 rmesa
->vb
.vertex_size
* 4;
192 rmesa
->tcl
.vertex_format
= rmesa
->vb
.vtxfmt_0
;
193 rmesa
->tcl
.aos_components
[0] = &tmp
;
194 rmesa
->tcl
.nr_aos_components
= 1;
195 rmesa
->dma
.flush
= 0;
197 /* Optimize the primitive list:
199 if (rmesa
->vb
.nrprims
> 1) {
200 for (j
= 0, i
= 1 ; i
< rmesa
->vb
.nrprims
; i
++) {
201 int pj
= rmesa
->vb
.primlist
[j
].prim
& 0xf;
202 int pi
= rmesa
->vb
.primlist
[i
].prim
& 0xf;
204 if (pj
== pi
&& discreet_gl_prim
[pj
] &&
205 rmesa
->vb
.primlist
[i
].start
== rmesa
->vb
.primlist
[j
].end
) {
206 rmesa
->vb
.primlist
[j
].end
= rmesa
->vb
.primlist
[i
].end
;
210 if (j
!= i
) rmesa
->vb
.primlist
[j
] = rmesa
->vb
.primlist
[i
];
213 rmesa
->vb
.nrprims
= j
+1;
216 if (rmesa
->vb
.vtxfmt_0
!= rmesa
->hw
.vtx
.cmd
[VTX_VTXFMT_0
] ||
217 rmesa
->vb
.vtxfmt_1
!= rmesa
->hw
.vtx
.cmd
[VTX_VTXFMT_1
]) {
218 R200_STATECHANGE( rmesa
, vtx
);
219 rmesa
->hw
.vtx
.cmd
[VTX_VTXFMT_0
] = rmesa
->vb
.vtxfmt_0
;
220 rmesa
->hw
.vtx
.cmd
[VTX_VTXFMT_1
] = rmesa
->vb
.vtxfmt_1
;
224 for (i
= 0 ; i
< rmesa
->vb
.nrprims
; i
++) {
225 if (R200_DEBUG
& DEBUG_PRIMS
)
226 fprintf(stderr
, "vtxfmt prim %d: %s %d..%d\n", i
,
227 _mesa_lookup_enum_by_nr( rmesa
->vb
.primlist
[i
].prim
&
229 rmesa
->vb
.primlist
[i
].start
,
230 rmesa
->vb
.primlist
[i
].end
);
232 if (rmesa
->vb
.primlist
[i
].start
< rmesa
->vb
.primlist
[i
].end
)
233 r200EmitPrimitive( rmesa
->glCtx
,
234 rmesa
->vb
.primlist
[i
].start
,
235 rmesa
->vb
.primlist
[i
].end
,
236 rmesa
->vb
.primlist
[i
].prim
);
239 rmesa
->vb
.nrprims
= 0;
240 r200ReleaseDmaRegion( rmesa
, &tmp
, __FUNCTION__
);
244 static void start_prim( r200ContextPtr rmesa
, GLuint mode
)
246 if (R200_DEBUG
& DEBUG_VFMT
)
247 fprintf(stderr
, "%s %d\n", __FUNCTION__
,
248 rmesa
->vb
.initial_counter
- rmesa
->vb
.counter
);
250 rmesa
->vb
.primlist
[rmesa
->vb
.nrprims
].start
=
251 rmesa
->vb
.initial_counter
- rmesa
->vb
.counter
;
252 rmesa
->vb
.primlist
[rmesa
->vb
.nrprims
].prim
= mode
;
255 static void note_last_prim( r200ContextPtr rmesa
, GLuint flags
)
257 if (R200_DEBUG
& DEBUG_VFMT
)
258 fprintf(stderr
, "%s %d\n", __FUNCTION__
,
259 rmesa
->vb
.initial_counter
- rmesa
->vb
.counter
);
261 if (rmesa
->vb
.prim
[0] != GL_POLYGON
+1) {
262 rmesa
->vb
.primlist
[rmesa
->vb
.nrprims
].prim
|= flags
;
263 rmesa
->vb
.primlist
[rmesa
->vb
.nrprims
].end
=
264 rmesa
->vb
.initial_counter
- rmesa
->vb
.counter
;
266 if (++(rmesa
->vb
.nrprims
) == R200_MAX_PRIMS
)
267 flush_prims( rmesa
);
272 static void copy_vertex( r200ContextPtr rmesa
, GLuint n
, GLfloat
*dst
)
275 GLfloat
*src
= (GLfloat
*)(rmesa
->dma
.current
.address
+
276 rmesa
->dma
.current
.ptr
+
277 (rmesa
->vb
.primlist
[rmesa
->vb
.nrprims
].start
+ n
) *
278 rmesa
->vb
.vertex_size
* 4);
280 if (R200_DEBUG
& DEBUG_VFMT
)
281 fprintf(stderr
, "copy_vertex %d\n", rmesa
->vb
.primlist
[rmesa
->vb
.nrprims
].start
+ n
);
283 for (i
= 0 ; i
< rmesa
->vb
.vertex_size
; i
++) {
288 /* NOTE: This actually reads the copied vertices back from uncached
289 * memory. Could also use the counter/notify mechanism to populate
290 * tmp on the fly as vertices are generated.
292 static GLuint
copy_dma_verts( r200ContextPtr rmesa
, GLfloat (*tmp
)[15] )
295 GLuint nr
= (rmesa
->vb
.initial_counter
- rmesa
->vb
.counter
) -
296 rmesa
->vb
.primlist
[rmesa
->vb
.nrprims
].start
;
298 if (R200_DEBUG
& DEBUG_VFMT
)
299 fprintf(stderr
, "%s %d verts\n", __FUNCTION__
, nr
);
301 switch( rmesa
->vb
.prim
[0] )
307 for (i
= 0 ; i
< ovf
; i
++)
308 copy_vertex( rmesa
, nr
-ovf
+i
, tmp
[i
] );
312 for (i
= 0 ; i
< ovf
; i
++)
313 copy_vertex( rmesa
, nr
-ovf
+i
, tmp
[i
] );
317 for (i
= 0 ; i
< ovf
; i
++)
318 copy_vertex( rmesa
, nr
-ovf
+i
, tmp
[i
] );
323 copy_vertex( rmesa
, nr
-1, tmp
[0] );
326 case GL_TRIANGLE_FAN
:
331 copy_vertex( rmesa
, 0, tmp
[0] );
334 copy_vertex( rmesa
, 0, tmp
[0] );
335 copy_vertex( rmesa
, nr
-1, tmp
[1] );
338 case GL_TRIANGLE_STRIP
:
340 for (i
= 0 ; i
< ovf
; i
++)
341 copy_vertex( rmesa
, nr
-ovf
+i
, tmp
[i
] );
345 case 0: ovf
= 0; break;
346 case 1: ovf
= 1; break;
347 default: ovf
= 2 + (nr
&1); break;
349 for (i
= 0 ; i
< ovf
; i
++)
350 copy_vertex( rmesa
, nr
-ovf
+i
, tmp
[i
] );
358 static void VFMT_FALLBACK_OUTSIDE_BEGIN_END( const char *caller
)
360 GET_CURRENT_CONTEXT(ctx
);
361 r200ContextPtr rmesa
= R200_CONTEXT(ctx
);
363 if (R200_DEBUG
& (DEBUG_VFMT
|DEBUG_FALLBACKS
))
364 fprintf(stderr
, "%s from %s\n", __FUNCTION__
, caller
);
366 if (ctx
->Driver
.NeedFlush
)
367 r200VtxFmtFlushVertices( ctx
, ctx
->Driver
.NeedFlush
);
370 _mesa_update_state( ctx
); /* clear state so fell_back sticks */
372 _tnl_wakeup_exec( ctx
);
373 ctx
->Driver
.FlushVertices
= r200FlushVertices
;
375 assert( rmesa
->dma
.flush
== 0 );
376 rmesa
->vb
.fell_back
= GL_TRUE
;
377 rmesa
->vb
.installed
= GL_FALSE
;
381 static void VFMT_FALLBACK( const char *caller
)
383 GET_CURRENT_CONTEXT(ctx
);
384 r200ContextPtr rmesa
= R200_CONTEXT(ctx
);
387 GLuint ind0
= rmesa
->vb
.vtxfmt_0
;
388 GLuint ind1
= rmesa
->vb
.vtxfmt_1
;
392 if (R200_DEBUG
& (DEBUG_FALLBACKS
|DEBUG_VFMT
))
393 fprintf(stderr
, "%s from %s\n", __FUNCTION__
, caller
);
395 if (rmesa
->vb
.prim
[0] == GL_POLYGON
+1) {
396 VFMT_FALLBACK_OUTSIDE_BEGIN_END( __FUNCTION__
);
400 /* Copy vertices out of dma:
402 nrverts
= copy_dma_verts( rmesa
, tmp
);
404 /* Finish the prim at this point:
406 note_last_prim( rmesa
, 0 );
407 flush_prims( rmesa
);
409 /* Update ctx->Driver.CurrentExecPrimitive and swap in swtnl.
411 prim
= rmesa
->vb
.prim
[0];
412 ctx
->Driver
.CurrentExecPrimitive
= GL_POLYGON
+1;
413 _tnl_wakeup_exec( ctx
);
414 ctx
->Driver
.FlushVertices
= r200FlushVertices
;
416 assert(rmesa
->dma
.flush
== 0);
417 rmesa
->vb
.fell_back
= GL_TRUE
;
418 rmesa
->vb
.installed
= GL_FALSE
;
421 if (rmesa
->vb
.installed_color_3f_sz
== 4)
422 alpha
= ctx
->Current
.Attrib
[VERT_ATTRIB_COLOR0
][3];
424 /* Replay saved vertices
426 for (i
= 0 ; i
< nrverts
; i
++) {
428 if (ind0
& R200_VTX_N0
) {
429 glNormal3fv( &tmp
[i
][offset
] );
433 if (VTX_COLOR(ind0
, 0) == R200_VTX_PK_RGBA
) {
434 glColor4ubv( (GLubyte
*)&tmp
[i
][offset
] );
437 else if (VTX_COLOR(ind0
, 0) == R200_VTX_FP_RGBA
) {
438 glColor4fv( &tmp
[i
][offset
] );
441 else if (VTX_COLOR(ind0
, 0) == R200_VTX_FP_RGB
) {
442 glColor3fv( &tmp
[i
][offset
] );
446 if (VTX_COLOR(ind0
, 1) == R200_VTX_PK_RGBA
) {
447 _glapi_Dispatch
->SecondaryColor3ubvEXT( (GLubyte
*)&tmp
[i
][offset
] );
451 if (ind1
& (7 << R200_VTX_TEX0_COMP_CNT_SHIFT
)) {
452 glTexCoord2fv( &tmp
[i
][offset
] );
456 if (ind1
& (7 << R200_VTX_TEX1_COMP_CNT_SHIFT
)) {
457 glMultiTexCoord2fvARB( GL_TEXTURE1_ARB
, &tmp
[i
][offset
] );
461 glVertex3fv( &tmp
[i
][0] );
464 /* Replay current vertex
466 if (ind0
& R200_VTX_N0
)
467 glNormal3fv( rmesa
->vb
.normalptr
);
469 if (VTX_COLOR(ind0
, 0) == R200_VTX_PK_RGBA
)
470 glColor4ub( rmesa
->vb
.colorptr
->red
,
471 rmesa
->vb
.colorptr
->green
,
472 rmesa
->vb
.colorptr
->blue
,
473 rmesa
->vb
.colorptr
->alpha
);
474 else if (VTX_COLOR(ind0
, 0) == R200_VTX_FP_RGBA
)
475 glColor4fv( rmesa
->vb
.floatcolorptr
);
476 else if (VTX_COLOR(ind0
, 0) == R200_VTX_FP_RGB
) {
477 if (rmesa
->vb
.installed_color_3f_sz
== 4 && alpha
!= 1.0)
478 glColor4f( rmesa
->vb
.floatcolorptr
[0],
479 rmesa
->vb
.floatcolorptr
[1],
480 rmesa
->vb
.floatcolorptr
[2],
483 glColor3fv( rmesa
->vb
.floatcolorptr
);
486 if (VTX_COLOR(ind0
, 1) == R200_VTX_PK_RGBA
)
487 _glapi_Dispatch
->SecondaryColor3ubEXT( rmesa
->vb
.specptr
->red
,
488 rmesa
->vb
.specptr
->green
,
489 rmesa
->vb
.specptr
->blue
);
491 if (ind1
& (7 << R200_VTX_TEX0_COMP_CNT_SHIFT
))
492 glTexCoord2fv( rmesa
->vb
.texcoordptr
[0] );
494 if (ind1
& (7 << R200_VTX_TEX1_COMP_CNT_SHIFT
))
495 glMultiTexCoord2fvARB( GL_TEXTURE1_ARB
, rmesa
->vb
.texcoordptr
[1] );
500 static void wrap_buffer( void )
502 GET_CURRENT_CONTEXT(ctx
);
503 r200ContextPtr rmesa
= R200_CONTEXT(ctx
);
507 if (R200_DEBUG
& (DEBUG_VFMT
|DEBUG_PRIMS
))
508 fprintf(stderr
, "%s %d\n", __FUNCTION__
,
509 rmesa
->vb
.initial_counter
- rmesa
->vb
.counter
);
511 /* Don't deal with parity.
513 if ((((rmesa
->vb
.initial_counter
- rmesa
->vb
.counter
) -
514 rmesa
->vb
.primlist
[rmesa
->vb
.nrprims
].start
) & 1)) {
516 rmesa
->vb
.initial_counter
++;
520 /* Copy vertices out of dma:
522 if (rmesa
->vb
.prim
[0] == GL_POLYGON
+1)
525 nrverts
= copy_dma_verts( rmesa
, tmp
);
527 if (R200_DEBUG
& DEBUG_VFMT
)
528 fprintf(stderr
, "%d vertices to copy\n", nrverts
);
530 /* Finish the prim at this point:
532 note_last_prim( rmesa
, 0 );
535 /* Fire any buffered primitives
537 flush_prims( rmesa
);
541 r200RefillCurrentDmaRegion( rmesa
);
543 /* Reset counter, dmaptr
545 rmesa
->vb
.dmaptr
= (int *)(rmesa
->dma
.current
.ptr
+ rmesa
->dma
.current
.address
);
546 rmesa
->vb
.counter
= (rmesa
->dma
.current
.end
- rmesa
->dma
.current
.ptr
) /
547 (rmesa
->vb
.vertex_size
* 4);
549 rmesa
->vb
.initial_counter
= rmesa
->vb
.counter
;
550 rmesa
->vb
.notify
= wrap_buffer
;
552 rmesa
->dma
.flush
= flush_prims
;
554 /* Restart wrapped primitive:
556 if (rmesa
->vb
.prim
[0] != GL_POLYGON
+1)
557 start_prim( rmesa
, rmesa
->vb
.prim
[0] );
560 /* Reemit saved vertices
562 for (i
= 0 ; i
< nrverts
; i
++) {
563 if (R200_DEBUG
& DEBUG_VERTS
) {
565 fprintf(stderr
, "re-emit vertex %d to %p\n", i
,
566 (void *)rmesa
->vb
.dmaptr
);
567 if (R200_DEBUG
& DEBUG_VERBOSE
)
568 for (j
= 0 ; j
< rmesa
->vb
.vertex_size
; j
++)
569 fprintf(stderr
, "\t%08x/%f\n", *(int*)&tmp
[i
][j
], tmp
[i
][j
]);
572 memcpy( rmesa
->vb
.dmaptr
, tmp
[i
], rmesa
->vb
.vertex_size
* 4 );
573 rmesa
->vb
.dmaptr
+= rmesa
->vb
.vertex_size
;
580 static GLboolean
check_vtx_fmt( GLcontext
*ctx
)
582 r200ContextPtr rmesa
= R200_CONTEXT(ctx
);
583 GLuint ind0
= R200_VTX_Z0
;
586 if (rmesa
->TclFallback
|| rmesa
->vb
.fell_back
|| ctx
->CompileFlag
)
589 if (ctx
->Driver
.NeedFlush
& FLUSH_UPDATE_CURRENT
)
590 ctx
->Driver
.FlushVertices( ctx
, FLUSH_UPDATE_CURRENT
);
592 /* Make all this event-driven:
594 if (ctx
->Light
.Enabled
) {
597 /* TODO: make this data driven: If we receive only ubytes, send
598 * color as ubytes. Also check if converting (with free
599 * checking for overflow) is cheaper than sending floats
602 if (ctx
->Light
.ColorMaterialEnabled
)
603 ind0
|= R200_VTX_FP_RGBA
<< R200_VTX_COLOR_0_SHIFT
;
605 ind0
|= R200_VTX_PK_RGBA
<< R200_VTX_COLOR_0_SHIFT
;
608 /* TODO: make this data driven?
610 ind0
|= R200_VTX_PK_RGBA
<< R200_VTX_COLOR_0_SHIFT
;
612 if (ctx
->_TriangleCaps
& DD_SEPARATE_SPECULAR
) {
613 ind0
|= R200_VTX_PK_RGBA
<< R200_VTX_COLOR_1_SHIFT
;
617 if (ctx
->Texture
.Unit
[0]._ReallyEnabled
) {
618 if (ctx
->Texture
.Unit
[0].TexGenEnabled
) {
619 if (rmesa
->TexGenNeedNormals
[0]) {
623 if (ctx
->Current
.Attrib
[VERT_ATTRIB_TEX0
][2] != 0.0F
||
624 ctx
->Current
.Attrib
[VERT_ATTRIB_TEX0
][3] != 1.0) {
625 if (R200_DEBUG
& (DEBUG_VFMT
|DEBUG_FALLBACKS
))
626 fprintf(stderr
, "%s: rq0\n", __FUNCTION__
);
629 ind1
|= 2 << R200_VTX_TEX0_COMP_CNT_SHIFT
;
633 if (ctx
->Texture
.Unit
[1]._ReallyEnabled
) {
634 if (ctx
->Texture
.Unit
[1].TexGenEnabled
) {
635 if (rmesa
->TexGenNeedNormals
[1]) {
639 if (ctx
->Current
.Attrib
[VERT_ATTRIB_TEX1
][2] != 0.0F
||
640 ctx
->Current
.Attrib
[VERT_ATTRIB_TEX1
][3] != 1.0) {
641 if (R200_DEBUG
& (DEBUG_VFMT
|DEBUG_FALLBACKS
))
642 fprintf(stderr
, "%s: rq1\n", __FUNCTION__
);
645 ind1
|= 2 << R200_VTX_TEX1_COMP_CNT_SHIFT
;
649 if (R200_DEBUG
& (DEBUG_VFMT
|DEBUG_STATE
))
650 fprintf(stderr
, "%s: format: 0x%x, 0x%x\n", __FUNCTION__
, ind0
, ind1
);
653 rmesa
->vb
.vtxfmt_0
= ind0
;
654 rmesa
->vb
.vtxfmt_1
= ind1
;
655 rmesa
->vb
.prim
= &ctx
->Driver
.CurrentExecPrimitive
;
657 rmesa
->vb
.vertex_size
= 3;
658 rmesa
->vb
.normalptr
= ctx
->Current
.Attrib
[VERT_ATTRIB_NORMAL
];
659 rmesa
->vb
.colorptr
= NULL
;
660 rmesa
->vb
.floatcolorptr
= ctx
->Current
.Attrib
[VERT_ATTRIB_COLOR0
];
661 rmesa
->vb
.specptr
= NULL
;
662 rmesa
->vb
.floatspecptr
= ctx
->Current
.Attrib
[VERT_ATTRIB_COLOR1
];
663 rmesa
->vb
.texcoordptr
[0] = ctx
->Current
.Attrib
[VERT_ATTRIB_TEX0
];
664 rmesa
->vb
.texcoordptr
[1] = ctx
->Current
.Attrib
[VERT_ATTRIB_TEX1
];
666 /* Run through and initialize the vertex components in the order
667 * the hardware understands:
669 if (ind0
& R200_VTX_N0
) {
670 rmesa
->vb
.normalptr
= &rmesa
->vb
.vertex
[rmesa
->vb
.vertex_size
].f
;
671 rmesa
->vb
.vertex_size
+= 3;
672 rmesa
->vb
.normalptr
[0] = ctx
->Current
.Attrib
[VERT_ATTRIB_NORMAL
][0];
673 rmesa
->vb
.normalptr
[1] = ctx
->Current
.Attrib
[VERT_ATTRIB_NORMAL
][1];
674 rmesa
->vb
.normalptr
[2] = ctx
->Current
.Attrib
[VERT_ATTRIB_NORMAL
][2];
677 if (VTX_COLOR(ind0
, 0) == R200_VTX_PK_RGBA
) {
678 rmesa
->vb
.colorptr
= &rmesa
->vb
.vertex
[rmesa
->vb
.vertex_size
].color
;
679 rmesa
->vb
.vertex_size
+= 1;
680 UNCLAMPED_FLOAT_TO_CHAN( rmesa
->vb
.colorptr
->red
, ctx
->Current
.Attrib
[VERT_ATTRIB_COLOR0
][0] );
681 UNCLAMPED_FLOAT_TO_CHAN( rmesa
->vb
.colorptr
->green
, ctx
->Current
.Attrib
[VERT_ATTRIB_COLOR0
][1] );
682 UNCLAMPED_FLOAT_TO_CHAN( rmesa
->vb
.colorptr
->blue
, ctx
->Current
.Attrib
[VERT_ATTRIB_COLOR0
][2] );
683 UNCLAMPED_FLOAT_TO_CHAN( rmesa
->vb
.colorptr
->alpha
, ctx
->Current
.Attrib
[VERT_ATTRIB_COLOR0
][3] );
685 else if (VTX_COLOR(ind0
, 0) == R200_VTX_FP_RGBA
) {
686 rmesa
->vb
.floatcolorptr
= &rmesa
->vb
.vertex
[rmesa
->vb
.vertex_size
].f
;
687 rmesa
->vb
.vertex_size
+= 4;
688 rmesa
->vb
.floatcolorptr
[0] = ctx
->Current
.Attrib
[VERT_ATTRIB_COLOR0
][0];
689 rmesa
->vb
.floatcolorptr
[1] = ctx
->Current
.Attrib
[VERT_ATTRIB_COLOR0
][1];
690 rmesa
->vb
.floatcolorptr
[2] = ctx
->Current
.Attrib
[VERT_ATTRIB_COLOR0
][2];
691 rmesa
->vb
.floatcolorptr
[3] = ctx
->Current
.Attrib
[VERT_ATTRIB_COLOR0
][3];
693 else if (VTX_COLOR(ind0
, 0) == R200_VTX_FP_RGB
) {
694 rmesa
->vb
.floatcolorptr
= &rmesa
->vb
.vertex
[rmesa
->vb
.vertex_size
].f
;
695 rmesa
->vb
.vertex_size
+= 3;
696 rmesa
->vb
.floatcolorptr
[0] = ctx
->Current
.Attrib
[VERT_ATTRIB_COLOR0
][0];
697 rmesa
->vb
.floatcolorptr
[1] = ctx
->Current
.Attrib
[VERT_ATTRIB_COLOR0
][1];
698 rmesa
->vb
.floatcolorptr
[2] = ctx
->Current
.Attrib
[VERT_ATTRIB_COLOR0
][2];
701 if (VTX_COLOR(ind0
, 1) == R200_VTX_PK_RGBA
) {
702 rmesa
->vb
.specptr
= &rmesa
->vb
.vertex
[rmesa
->vb
.vertex_size
].color
;
703 rmesa
->vb
.vertex_size
+= 1;
704 UNCLAMPED_FLOAT_TO_CHAN( rmesa
->vb
.specptr
->red
, ctx
->Current
.Attrib
[VERT_ATTRIB_COLOR1
][0] );
705 UNCLAMPED_FLOAT_TO_CHAN( rmesa
->vb
.specptr
->green
, ctx
->Current
.Attrib
[VERT_ATTRIB_COLOR1
][1] );
706 UNCLAMPED_FLOAT_TO_CHAN( rmesa
->vb
.specptr
->blue
, ctx
->Current
.Attrib
[VERT_ATTRIB_COLOR1
][2] );
710 if (ind1
& (7 << R200_VTX_TEX0_COMP_CNT_SHIFT
)) {
711 rmesa
->vb
.texcoordptr
[0] = &rmesa
->vb
.vertex
[rmesa
->vb
.vertex_size
].f
;
712 rmesa
->vb
.vertex_size
+= 2;
713 rmesa
->vb
.texcoordptr
[0][0] = ctx
->Current
.Attrib
[VERT_ATTRIB_TEX0
][0];
714 rmesa
->vb
.texcoordptr
[0][1] = ctx
->Current
.Attrib
[VERT_ATTRIB_TEX0
][1];
717 if (ind1
& (7 << R200_VTX_TEX1_COMP_CNT_SHIFT
)) {
718 rmesa
->vb
.texcoordptr
[1] = &rmesa
->vb
.vertex
[rmesa
->vb
.vertex_size
].f
;
719 rmesa
->vb
.vertex_size
+= 2;
720 rmesa
->vb
.texcoordptr
[1][0] = ctx
->Current
.Attrib
[VERT_ATTRIB_TEX1
][0];
721 rmesa
->vb
.texcoordptr
[1][1] = ctx
->Current
.Attrib
[VERT_ATTRIB_TEX1
][1];
724 if (rmesa
->vb
.installed_vertex_format
!= rmesa
->vb
.vtxfmt_0
) {
725 if (R200_DEBUG
& DEBUG_VFMT
)
726 fprintf(stderr
, "reinstall on vertex_format change\n");
727 _mesa_install_exec_vtxfmt( ctx
, &rmesa
->vb
.vtxfmt
);
728 rmesa
->vb
.installed_vertex_format
= rmesa
->vb
.vtxfmt_0
;
731 if (R200_DEBUG
& DEBUG_VFMT
)
732 fprintf(stderr
, "%s -- success\n", __FUNCTION__
);
738 void r200VtxfmtInvalidate( GLcontext
*ctx
)
740 r200ContextPtr rmesa
= R200_CONTEXT( ctx
);
742 rmesa
->vb
.recheck
= GL_TRUE
;
743 rmesa
->vb
.fell_back
= GL_FALSE
;
747 static void r200VtxfmtValidate( GLcontext
*ctx
)
749 r200ContextPtr rmesa
= R200_CONTEXT( ctx
);
751 if (R200_DEBUG
& DEBUG_VFMT
)
752 fprintf(stderr
, "%s\n", __FUNCTION__
);
754 if (ctx
->Driver
.NeedFlush
)
755 ctx
->Driver
.FlushVertices( ctx
, ctx
->Driver
.NeedFlush
);
757 rmesa
->vb
.recheck
= GL_FALSE
;
759 if (check_vtx_fmt( ctx
)) {
760 if (!rmesa
->vb
.installed
) {
761 if (R200_DEBUG
& DEBUG_VFMT
)
762 fprintf(stderr
, "reinstall (new install)\n");
764 _mesa_install_exec_vtxfmt( ctx
, &rmesa
->vb
.vtxfmt
);
765 ctx
->Driver
.FlushVertices
= r200VtxFmtFlushVertices
;
766 rmesa
->vb
.installed
= GL_TRUE
;
768 else if (R200_DEBUG
& DEBUG_VFMT
)
769 fprintf(stderr
, "%s: already installed", __FUNCTION__
);
772 if (R200_DEBUG
& DEBUG_VFMT
)
773 fprintf(stderr
, "%s: failed\n", __FUNCTION__
);
775 if (rmesa
->vb
.installed
) {
776 if (rmesa
->dma
.flush
)
777 rmesa
->dma
.flush( rmesa
);
778 _tnl_wakeup_exec( ctx
);
779 ctx
->Driver
.FlushVertices
= r200FlushVertices
;
780 rmesa
->vb
.installed
= GL_FALSE
;
789 static void r200_Materialfv( GLenum face
, GLenum pname
,
790 const GLfloat
*params
)
792 GET_CURRENT_CONTEXT(ctx
);
793 r200ContextPtr rmesa
= R200_CONTEXT( ctx
);
795 if (R200_DEBUG
& DEBUG_VFMT
)
796 fprintf(stderr
, "%s\n", __FUNCTION__
);
798 if (rmesa
->vb
.prim
[0] != GL_POLYGON
+1) {
799 VFMT_FALLBACK( __FUNCTION__
);
800 glMaterialfv( face
, pname
, params
);
803 _mesa_noop_Materialfv( face
, pname
, params
);
804 r200UpdateMaterial( ctx
);
810 static void r200_Begin( GLenum mode
)
812 GET_CURRENT_CONTEXT(ctx
);
813 r200ContextPtr rmesa
= R200_CONTEXT(ctx
);
815 if (R200_DEBUG
& DEBUG_VFMT
)
816 fprintf(stderr
, "%s( %s )\n", __FUNCTION__
,
817 _mesa_lookup_enum_by_nr( mode
));
819 if (mode
> GL_POLYGON
) {
820 _mesa_error( ctx
, GL_INVALID_ENUM
, "glBegin" );
824 if (rmesa
->vb
.prim
[0] != GL_POLYGON
+1) {
825 _mesa_error( ctx
, GL_INVALID_OPERATION
, "glBegin" );
830 _mesa_update_state( ctx
);
832 if (rmesa
->NewGLState
)
833 r200ValidateState( ctx
);
835 if (rmesa
->vb
.recheck
)
836 r200VtxfmtValidate( ctx
);
838 if (!rmesa
->vb
.installed
) {
844 if (rmesa
->dma
.flush
&& rmesa
->vb
.counter
< 12) {
845 if (R200_DEBUG
& DEBUG_VFMT
)
846 fprintf(stderr
, "%s: flush almost-empty buffers\n", __FUNCTION__
);
847 flush_prims( rmesa
);
850 /* Need to arrange to save vertices here? Or always copy from dma (yuk)?
852 if (!rmesa
->dma
.flush
) {
853 if (rmesa
->dma
.current
.ptr
+ 12*rmesa
->vb
.vertex_size
*4 >
854 rmesa
->dma
.current
.end
) {
855 R200_NEWPRIM( rmesa
);
856 r200RefillCurrentDmaRegion( rmesa
);
859 rmesa
->vb
.dmaptr
= (int *)(rmesa
->dma
.current
.address
+ rmesa
->dma
.current
.ptr
);
860 rmesa
->vb
.counter
= (rmesa
->dma
.current
.end
- rmesa
->dma
.current
.ptr
) /
861 (rmesa
->vb
.vertex_size
* 4);
863 rmesa
->vb
.initial_counter
= rmesa
->vb
.counter
;
864 rmesa
->vb
.notify
= wrap_buffer
;
865 rmesa
->dma
.flush
= flush_prims
;
866 ctx
->Driver
.NeedFlush
|= FLUSH_STORED_VERTICES
;
870 rmesa
->vb
.prim
[0] = mode
;
871 start_prim( rmesa
, mode
| PRIM_BEGIN
);
876 static void r200_End( void )
878 GET_CURRENT_CONTEXT(ctx
);
879 r200ContextPtr rmesa
= R200_CONTEXT(ctx
);
881 if (R200_DEBUG
& DEBUG_VFMT
)
882 fprintf(stderr
, "%s\n", __FUNCTION__
);
884 if (rmesa
->vb
.prim
[0] == GL_POLYGON
+1) {
885 _mesa_error( ctx
, GL_INVALID_OPERATION
, "glEnd" );
889 note_last_prim( rmesa
, PRIM_END
);
890 rmesa
->vb
.prim
[0] = GL_POLYGON
+1;
894 /* Fallback on difficult entrypoints:
896 #define PRE_LOOPBACK( FUNC ) \
898 if (R200_DEBUG & DEBUG_VFMT) \
899 fprintf(stderr, "%s\n", __FUNCTION__); \
900 VFMT_FALLBACK( __FUNCTION__ ); \
902 #define TAG(x) r200_fallback_##x
903 #include "vtxfmt_tmp.h"
907 static GLboolean
r200NotifyBegin( GLcontext
*ctx
, GLenum p
)
909 r200ContextPtr rmesa
= R200_CONTEXT( ctx
);
911 if (R200_DEBUG
& DEBUG_VFMT
)
912 fprintf(stderr
, "%s\n", __FUNCTION__
);
914 assert(!rmesa
->vb
.installed
);
917 _mesa_update_state( ctx
);
919 if (rmesa
->NewGLState
)
920 r200ValidateState( ctx
);
922 if (ctx
->Driver
.NeedFlush
)
923 ctx
->Driver
.FlushVertices( ctx
, ctx
->Driver
.NeedFlush
);
925 if (rmesa
->vb
.recheck
)
926 r200VtxfmtValidate( ctx
);
928 if (!rmesa
->vb
.installed
) {
929 if (R200_DEBUG
& DEBUG_VFMT
)
930 fprintf(stderr
, "%s -- failed\n", __FUNCTION__
);
938 static void r200VtxFmtFlushVertices( GLcontext
*ctx
, GLuint flags
)
940 r200ContextPtr rmesa
= R200_CONTEXT( ctx
);
942 if (R200_DEBUG
& DEBUG_VFMT
)
943 fprintf(stderr
, "%s\n", __FUNCTION__
);
945 assert(rmesa
->vb
.installed
);
947 if (flags
& FLUSH_UPDATE_CURRENT
) {
948 r200_copy_to_current( ctx
);
949 if (R200_DEBUG
& DEBUG_VFMT
)
950 fprintf(stderr
, "reinstall on update_current\n");
951 _mesa_install_exec_vtxfmt( ctx
, &rmesa
->vb
.vtxfmt
);
952 ctx
->Driver
.NeedFlush
&= ~FLUSH_UPDATE_CURRENT
;
955 if (flags
& FLUSH_STORED_VERTICES
) {
956 assert (rmesa
->dma
.flush
== 0 ||
957 rmesa
->dma
.flush
== flush_prims
);
958 if (rmesa
->dma
.flush
== flush_prims
)
959 flush_prims( rmesa
);
960 ctx
->Driver
.NeedFlush
&= ~FLUSH_STORED_VERTICES
;
966 /* At this point, don't expect very many versions of each function to
967 * be generated, so not concerned about freeing them?
971 void r200VtxfmtInit( GLcontext
*ctx
, GLboolean useCodegen
)
973 r200ContextPtr rmesa
= R200_CONTEXT( ctx
);
974 GLvertexformat
*vfmt
= &(rmesa
->vb
.vtxfmt
);
976 MEMSET( vfmt
, 0, sizeof(GLvertexformat
) );
978 /* Hook in chooser functions for codegen, etc:
980 r200VtxfmtInitChoosers( vfmt
);
982 /* Handled fully in supported states, but no codegen:
984 vfmt
->Materialfv
= r200_Materialfv
;
985 vfmt
->ArrayElement
= _ae_loopback_array_elt
; /* generic helper */
986 vfmt
->Rectf
= _mesa_noop_Rectf
; /* generic helper */
987 vfmt
->Begin
= r200_Begin
;
988 vfmt
->End
= r200_End
;
990 /* Fallback for performance reasons: (Fix with cva/elt path here and
991 * dmatmp2.h style primitive-merging)
993 * These should call NotifyBegin(), as should _tnl_EvalMesh, to allow
996 vfmt
->DrawArrays
= r200_fallback_DrawArrays
;
997 vfmt
->DrawElements
= r200_fallback_DrawElements
;
998 vfmt
->DrawRangeElements
= r200_fallback_DrawRangeElements
;
1001 /* Not active in supported states; just keep ctx->Current uptodate:
1003 vfmt
->FogCoordfvEXT
= _mesa_noop_FogCoordfvEXT
;
1004 vfmt
->FogCoordfEXT
= _mesa_noop_FogCoordfEXT
;
1005 vfmt
->EdgeFlag
= _mesa_noop_EdgeFlag
;
1006 vfmt
->EdgeFlagv
= _mesa_noop_EdgeFlagv
;
1007 vfmt
->Indexf
= _mesa_noop_Indexf
;
1008 vfmt
->Indexfv
= _mesa_noop_Indexfv
;
1011 /* Active but unsupported -- fallback if we receive these:
1013 vfmt
->CallList
= r200_fallback_CallList
;
1014 vfmt
->CallLists
= r200_fallback_CallLists
;
1015 vfmt
->EvalCoord1f
= r200_fallback_EvalCoord1f
;
1016 vfmt
->EvalCoord1fv
= r200_fallback_EvalCoord1fv
;
1017 vfmt
->EvalCoord2f
= r200_fallback_EvalCoord2f
;
1018 vfmt
->EvalCoord2fv
= r200_fallback_EvalCoord2fv
;
1019 vfmt
->EvalMesh1
= r200_fallback_EvalMesh1
;
1020 vfmt
->EvalMesh2
= r200_fallback_EvalMesh2
;
1021 vfmt
->EvalPoint1
= r200_fallback_EvalPoint1
;
1022 vfmt
->EvalPoint2
= r200_fallback_EvalPoint2
;
1023 vfmt
->TexCoord3f
= r200_fallback_TexCoord3f
;
1024 vfmt
->TexCoord3fv
= r200_fallback_TexCoord3fv
;
1025 vfmt
->TexCoord4f
= r200_fallback_TexCoord4f
;
1026 vfmt
->TexCoord4fv
= r200_fallback_TexCoord4fv
;
1027 vfmt
->MultiTexCoord3fARB
= r200_fallback_MultiTexCoord3fARB
;
1028 vfmt
->MultiTexCoord3fvARB
= r200_fallback_MultiTexCoord3fvARB
;
1029 vfmt
->MultiTexCoord4fARB
= r200_fallback_MultiTexCoord4fARB
;
1030 vfmt
->MultiTexCoord4fvARB
= r200_fallback_MultiTexCoord4fvARB
;
1031 vfmt
->Vertex4f
= r200_fallback_Vertex4f
;
1032 vfmt
->Vertex4fv
= r200_fallback_Vertex4fv
;
1033 vfmt
->VertexAttrib1fNV
= r200_fallback_VertexAttrib1fNV
;
1034 vfmt
->VertexAttrib1fvNV
= r200_fallback_VertexAttrib1fvNV
;
1035 vfmt
->VertexAttrib2fNV
= r200_fallback_VertexAttrib2fNV
;
1036 vfmt
->VertexAttrib2fvNV
= r200_fallback_VertexAttrib2fvNV
;
1037 vfmt
->VertexAttrib3fNV
= r200_fallback_VertexAttrib3fNV
;
1038 vfmt
->VertexAttrib3fvNV
= r200_fallback_VertexAttrib3fvNV
;
1039 vfmt
->VertexAttrib4fNV
= r200_fallback_VertexAttrib4fNV
;
1040 vfmt
->VertexAttrib4fvNV
= r200_fallback_VertexAttrib4fvNV
;
1042 (void)r200_fallback_vtxfmt
;
1044 TNL_CONTEXT(ctx
)->Driver
.NotifyBegin
= r200NotifyBegin
;
1046 rmesa
->vb
.enabled
= 1;
1047 rmesa
->vb
.prim
= &ctx
->Driver
.CurrentExecPrimitive
;
1048 rmesa
->vb
.primflags
= 0;
1050 make_empty_list( &rmesa
->vb
.dfn_cache
.Vertex2f
);
1051 make_empty_list( &rmesa
->vb
.dfn_cache
.Vertex2fv
);
1052 make_empty_list( &rmesa
->vb
.dfn_cache
.Vertex3f
);
1053 make_empty_list( &rmesa
->vb
.dfn_cache
.Vertex3fv
);
1054 make_empty_list( &rmesa
->vb
.dfn_cache
.Color4ub
);
1055 make_empty_list( &rmesa
->vb
.dfn_cache
.Color4ubv
);
1056 make_empty_list( &rmesa
->vb
.dfn_cache
.Color3ub
);
1057 make_empty_list( &rmesa
->vb
.dfn_cache
.Color3ubv
);
1058 make_empty_list( &rmesa
->vb
.dfn_cache
.Color4f
);
1059 make_empty_list( &rmesa
->vb
.dfn_cache
.Color4fv
);
1060 make_empty_list( &rmesa
->vb
.dfn_cache
.Color3f
);
1061 make_empty_list( &rmesa
->vb
.dfn_cache
.Color3fv
);
1062 make_empty_list( &rmesa
->vb
.dfn_cache
.SecondaryColor3fEXT
);
1063 make_empty_list( &rmesa
->vb
.dfn_cache
.SecondaryColor3fvEXT
);
1064 make_empty_list( &rmesa
->vb
.dfn_cache
.SecondaryColor3ubEXT
);
1065 make_empty_list( &rmesa
->vb
.dfn_cache
.SecondaryColor3ubvEXT
);
1066 make_empty_list( &rmesa
->vb
.dfn_cache
.Normal3f
);
1067 make_empty_list( &rmesa
->vb
.dfn_cache
.Normal3fv
);
1068 make_empty_list( &rmesa
->vb
.dfn_cache
.TexCoord2f
);
1069 make_empty_list( &rmesa
->vb
.dfn_cache
.TexCoord2fv
);
1070 make_empty_list( &rmesa
->vb
.dfn_cache
.TexCoord1f
);
1071 make_empty_list( &rmesa
->vb
.dfn_cache
.TexCoord1fv
);
1072 make_empty_list( &rmesa
->vb
.dfn_cache
.MultiTexCoord2fARB
);
1073 make_empty_list( &rmesa
->vb
.dfn_cache
.MultiTexCoord2fvARB
);
1074 make_empty_list( &rmesa
->vb
.dfn_cache
.MultiTexCoord1fARB
);
1075 make_empty_list( &rmesa
->vb
.dfn_cache
.MultiTexCoord1fvARB
);
1077 r200InitCodegen( &rmesa
->vb
.codegen
, useCodegen
);
1080 static void free_funcs( struct dynfn
*l
)
1082 struct dynfn
*f
, *tmp
;
1083 foreach_s (f
, tmp
, l
) {
1084 remove_from_list( f
);
1085 ALIGN_FREE( f
->code
);
1090 void r200VtxfmtUnbindContext( GLcontext
*ctx
)
1095 void r200VtxfmtMakeCurrent( GLcontext
*ctx
)
1100 void r200VtxfmtDestroy( GLcontext
*ctx
)
1102 r200ContextPtr rmesa
= R200_CONTEXT( ctx
);
1104 count_funcs( rmesa
);
1105 free_funcs( &rmesa
->vb
.dfn_cache
.Vertex2f
);
1106 free_funcs( &rmesa
->vb
.dfn_cache
.Vertex2fv
);
1107 free_funcs( &rmesa
->vb
.dfn_cache
.Vertex3f
);
1108 free_funcs( &rmesa
->vb
.dfn_cache
.Vertex3fv
);
1109 free_funcs( &rmesa
->vb
.dfn_cache
.Color4ub
);
1110 free_funcs( &rmesa
->vb
.dfn_cache
.Color4ubv
);
1111 free_funcs( &rmesa
->vb
.dfn_cache
.Color3ub
);
1112 free_funcs( &rmesa
->vb
.dfn_cache
.Color3ubv
);
1113 free_funcs( &rmesa
->vb
.dfn_cache
.Color4f
);
1114 free_funcs( &rmesa
->vb
.dfn_cache
.Color4fv
);
1115 free_funcs( &rmesa
->vb
.dfn_cache
.Color3f
);
1116 free_funcs( &rmesa
->vb
.dfn_cache
.Color3fv
);
1117 free_funcs( &rmesa
->vb
.dfn_cache
.SecondaryColor3ubEXT
);
1118 free_funcs( &rmesa
->vb
.dfn_cache
.SecondaryColor3ubvEXT
);
1119 free_funcs( &rmesa
->vb
.dfn_cache
.SecondaryColor3fEXT
);
1120 free_funcs( &rmesa
->vb
.dfn_cache
.SecondaryColor3fvEXT
);
1121 free_funcs( &rmesa
->vb
.dfn_cache
.Normal3f
);
1122 free_funcs( &rmesa
->vb
.dfn_cache
.Normal3fv
);
1123 free_funcs( &rmesa
->vb
.dfn_cache
.TexCoord2f
);
1124 free_funcs( &rmesa
->vb
.dfn_cache
.TexCoord2fv
);
1125 free_funcs( &rmesa
->vb
.dfn_cache
.TexCoord1f
);
1126 free_funcs( &rmesa
->vb
.dfn_cache
.TexCoord1fv
);
1127 free_funcs( &rmesa
->vb
.dfn_cache
.MultiTexCoord2fARB
);
1128 free_funcs( &rmesa
->vb
.dfn_cache
.MultiTexCoord2fvARB
);
1129 free_funcs( &rmesa
->vb
.dfn_cache
.MultiTexCoord1fARB
);
1130 free_funcs( &rmesa
->vb
.dfn_cache
.MultiTexCoord1fvARB
);