1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Mesa 3-D graphics library
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Version:  6.5.1
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 1999-2006  Brian Paul   All Rights Reserved.
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"),
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and/or sell copies of the Software, and to permit persons to whom the
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software is furnished to do so, subject to the following conditions:
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice shall be included
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * in all copies or substantial portions of the Software.
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Authors:
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *    Keith Whitwell <keith@tungstengraphics.com>
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \file t_dd_dmatmp.h
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Template for render stages which build and emit vertices directly
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to fixed-size dma buffers.  Useful for rendering strips and other
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * native primitives where clipping and per-vertex tweaks such as
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * those in t_dd_tritmp.h are not required.
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Produces code for both inline triangles and indexed triangles.
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Where various primitive types are unaccelerated by hardware, the
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * code attempts to fallback to other primitive types (quadstrips to
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * tristrips, lineloops to linestrips), or to indexed vertices.
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if !defined(HAVE_TRIANGLES)
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#error "must have at least triangles to use render template"
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if !HAVE_ELTS
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define ELTS_VARS(buf)
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define ALLOC_ELTS(nr) 0
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define EMIT_ELT( offset, elt )
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define EMIT_TWO_ELTS( offset, elt0, elt1 )
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define INCR_ELTS( nr )
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define ELT_INIT(prim)
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define GET_CURRENT_VB_MAX_ELTS() 0
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define GET_SUBSEQUENT_VB_MAX_ELTS() 0
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define RELEASE_ELT_VERTS()
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define EMIT_INDEXED_VERTS( ctx, start, count )
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifndef EMIT_TWO_ELTS
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define EMIT_TWO_ELTS( offset, elt0, elt1 )	\
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdo { 						\
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   EMIT_ELT( offset, elt0 ); 			\
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   EMIT_ELT( offset+1, elt1 ); 			\
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} while (0)
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*                  Render whole begin/end objects                    */
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if (HAVE_ELTS)
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void *TAG(emit_elts)( struct gl_context *ctx, GLuint *elts, GLuint nr,
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			     void *buf)
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint i;
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   LOCAL_VARS;
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ELTS_VARS(buf);
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for ( i = 0 ; i+1 < nr ; i+=2, elts += 2 ) {
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      EMIT_TWO_ELTS( 0, elts[0], elts[1] );
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      INCR_ELTS( 2 );
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (i < nr) {
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      EMIT_ELT( 0, elts[0] );
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      INCR_ELTS( 1 );
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return (void *)ELTPTR;
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic __inline void *TAG(emit_verts)( struct gl_context *ctx, GLuint start,
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				     GLuint count, void *buf )
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return EMIT_VERTS(ctx, start, count, buf);
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/***********************************************************************
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *                    Render non-indexed primitives.
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ***********************************************************************/
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void TAG(render_points_verts)( struct gl_context *ctx,
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				      GLuint start,
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				      GLuint count,
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				      GLuint flags )
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (HAVE_POINTS) {
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      LOCAL_VARS;
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int dmasz = GET_SUBSEQUENT_VB_MAX_VERTS();
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int currentsz;
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint j, nr;
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      INIT( GL_POINTS );
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      currentsz = GET_CURRENT_VB_MAX_VERTS();
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (currentsz < 8)
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 currentsz = dmasz;
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (j = start; j < count; j += nr ) {
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 nr = MIN2( currentsz, count - j );
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 TAG(emit_verts)( ctx, j, nr, ALLOC_VERTS(nr) );
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 currentsz = dmasz;
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fprintf(stderr, "%s - cannot draw primitive\n", __FUNCTION__);
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void TAG(render_lines_verts)( struct gl_context *ctx,
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				     GLuint start,
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				     GLuint count,
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				     GLuint flags )
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (HAVE_LINES) {
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      LOCAL_VARS;
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int dmasz = GET_SUBSEQUENT_VB_MAX_VERTS();
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int currentsz;
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint j, nr;
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      INIT( GL_LINES );
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Emit whole number of lines in total and in each buffer:
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      count -= (count-start) & 1;
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      currentsz = GET_CURRENT_VB_MAX_VERTS();
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      currentsz -= currentsz & 1;
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dmasz -= dmasz & 1;
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (currentsz < 8)
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 currentsz = dmasz;
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (j = start; j < count; j += nr ) {
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 nr = MIN2( currentsz, count - j );
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 TAG(emit_verts)( ctx, j, nr, ALLOC_VERTS(nr) );
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 currentsz = dmasz;
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fprintf(stderr, "%s - cannot draw primitive\n", __FUNCTION__);
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void TAG(render_line_strip_verts)( struct gl_context *ctx,
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					  GLuint start,
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					  GLuint count,
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					  GLuint flags )
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (HAVE_LINE_STRIPS) {
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      LOCAL_VARS;
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int dmasz = GET_SUBSEQUENT_VB_MAX_VERTS();
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int currentsz;
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint j, nr;
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      INIT( GL_LINE_STRIP );
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      currentsz = GET_CURRENT_VB_MAX_VERTS();
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (currentsz < 8)
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 currentsz = dmasz;
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (j = start; j + 1 < count; j += nr - 1 ) {
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 nr = MIN2( currentsz, count - j );
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 TAG(emit_verts)( ctx, j, nr, ALLOC_VERTS(nr) );
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 currentsz = dmasz;
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      FLUSH();
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fprintf(stderr, "%s - cannot draw primitive\n", __FUNCTION__);
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void TAG(render_line_loop_verts)( struct gl_context *ctx,
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					 GLuint start,
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					 GLuint count,
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					 GLuint flags )
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (HAVE_LINE_STRIPS) {
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      LOCAL_VARS;
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int dmasz = GET_SUBSEQUENT_VB_MAX_VERTS();
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int currentsz;
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint j, nr;
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      INIT( GL_LINE_STRIP );
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (flags & PRIM_BEGIN)
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 j = start;
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 j = start + 1;
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Ensure last vertex won't wrap buffers:
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      currentsz = GET_CURRENT_VB_MAX_VERTS();
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      currentsz--;
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dmasz--;
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (currentsz < 8) {
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 currentsz = dmasz;
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (j + 1 < count) {
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 for ( ; j + 1 < count; j += nr - 1 ) {
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    nr = MIN2( currentsz, count - j );
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    if (j + nr >= count &&
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		start < count - 1 &&
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		(flags & PRIM_END))
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    {
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       void *tmp;
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       tmp = ALLOC_VERTS(nr+1);
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       tmp = TAG(emit_verts)( ctx, j, nr, tmp );
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       tmp = TAG(emit_verts)( ctx, start, 1, tmp );
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       (void) tmp;
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    }
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    else {
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       TAG(emit_verts)( ctx, j, nr, ALLOC_VERTS(nr) );
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       currentsz = dmasz;
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    }
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else if (start + 1 < count && (flags & PRIM_END)) {
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 void *tmp;
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 tmp = ALLOC_VERTS(2);
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 tmp = TAG(emit_verts)( ctx, start+1, 1, tmp );
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 tmp = TAG(emit_verts)( ctx, start, 1, tmp );
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 (void) tmp;
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      FLUSH();
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fprintf(stderr, "%s - cannot draw primitive\n", __FUNCTION__);
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void TAG(render_triangles_verts)( struct gl_context *ctx,
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					 GLuint start,
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					 GLuint count,
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					 GLuint flags )
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   LOCAL_VARS;
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int dmasz = (GET_SUBSEQUENT_VB_MAX_VERTS()/3) * 3;
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int currentsz;
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint j, nr;
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   INIT(GL_TRIANGLES);
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   currentsz = (GET_CURRENT_VB_MAX_VERTS()/3) * 3;
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Emit whole number of tris in total.  dmasz is already a multiple
285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * of 3.
286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   count -= (count-start)%3;
288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (currentsz < 8)
290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      currentsz = dmasz;
291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (j = start; j < count; j += nr) {
293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      nr = MIN2( currentsz, count - j );
294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      TAG(emit_verts)( ctx, j, nr, ALLOC_VERTS(nr) );
295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      currentsz = dmasz;
296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void TAG(render_tri_strip_verts)( struct gl_context *ctx,
302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					 GLuint start,
303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					 GLuint count,
304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					 GLuint flags )
305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (HAVE_TRI_STRIPS) {
307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      LOCAL_VARS;
308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint j, nr;
309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int dmasz = GET_SUBSEQUENT_VB_MAX_VERTS();
310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int currentsz;
311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      INIT(GL_TRIANGLE_STRIP);
313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      currentsz = GET_CURRENT_VB_MAX_VERTS();
315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (currentsz < 8) {
317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 currentsz = dmasz;
318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* From here on emit even numbers of tris when wrapping over buffers:
321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dmasz -= (dmasz & 1);
323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      currentsz -= (currentsz & 1);
324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (j = start ; j + 2 < count; j += nr - 2 ) {
326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 nr = MIN2( currentsz, count - j );
327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 TAG(emit_verts)( ctx, j, nr, ALLOC_VERTS(nr) );
328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 currentsz = dmasz;
329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      FLUSH();
332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fprintf(stderr, "%s - cannot draw primitive\n", __FUNCTION__);
335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void TAG(render_tri_fan_verts)( struct gl_context *ctx,
340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				       GLuint start,
341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				       GLuint count,
342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				       GLuint flags )
343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (HAVE_TRI_FANS) {
345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      LOCAL_VARS;
346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint j, nr;
347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int dmasz = GET_SUBSEQUENT_VB_MAX_VERTS();
348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int currentsz;
349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      INIT(GL_TRIANGLE_FAN);
351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      currentsz = GET_CURRENT_VB_MAX_VERTS();
353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (currentsz < 8) {
354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 currentsz = dmasz;
355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (j = start + 1 ; j + 1 < count; j += nr - 2 ) {
358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 void *tmp;
359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 nr = MIN2( currentsz, count - j + 1 );
360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 tmp = ALLOC_VERTS( nr );
361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 tmp = TAG(emit_verts)( ctx, start, 1, tmp );
362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 tmp = TAG(emit_verts)( ctx, j, nr - 1, tmp );
363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 (void) tmp;
364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 currentsz = dmasz;
365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      FLUSH();
368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Could write code to emit these as indexed vertices (for the
371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * g400, for instance).
372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fprintf(stderr, "%s - cannot draw primitive\n", __FUNCTION__);
374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void TAG(render_poly_verts)( struct gl_context *ctx,
380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				    GLuint start,
381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				    GLuint count,
382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				    GLuint flags )
383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (HAVE_POLYGONS) {
385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      LOCAL_VARS;
386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint j, nr;
387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int dmasz = GET_SUBSEQUENT_VB_MAX_VERTS();
388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int currentsz;
389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      INIT(GL_POLYGON);
391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      currentsz = GET_CURRENT_VB_MAX_VERTS();
393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (currentsz < 8) {
394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 currentsz = dmasz;
395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (j = start + 1 ; j + 1 < count ; j += nr - 2 ) {
398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 void *tmp;
399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 nr = MIN2( currentsz, count - j + 1 );
400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 tmp = ALLOC_VERTS( nr );
401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 tmp = TAG(emit_verts)( ctx, start, 1, tmp );
402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 tmp = TAG(emit_verts)( ctx, j, nr - 1, tmp );
403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 (void) tmp;
404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 currentsz = dmasz;
405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      FLUSH();
408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (HAVE_TRI_FANS && ctx->Light.ShadeModel == GL_SMOOTH) {
410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      TAG(render_tri_fan_verts)( ctx, start, count, flags );
411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fprintf(stderr, "%s - cannot draw primitive\n", __FUNCTION__);
413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void TAG(render_quad_strip_verts)( struct gl_context *ctx,
418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					  GLuint start,
419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					  GLuint count,
420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					  GLuint flags )
421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint j, nr;
423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (HAVE_QUAD_STRIPS) {
425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      LOCAL_VARS;
426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint j, nr;
427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int dmasz = GET_SUBSEQUENT_VB_MAX_VERTS();
428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int currentsz;
429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      INIT(GL_QUAD_STRIP);
431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      currentsz = GET_CURRENT_VB_MAX_VERTS();
433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (currentsz < 8) {
434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 currentsz = dmasz;
435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dmasz -= (dmasz & 2);
438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      currentsz -= (currentsz & 2);
439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (j = start ; j + 3 < count; j += nr - 2 ) {
441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 nr = MIN2( currentsz, count - j );
442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 TAG(emit_verts)( ctx, j, nr, ALLOC_VERTS(nr) );
443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 currentsz = dmasz;
444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      FLUSH();
447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else if (HAVE_TRI_STRIPS &&
449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	      ctx->Light.ShadeModel == GL_FLAT &&
450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	      TNL_CONTEXT(ctx)->vb.AttribPtr[_TNL_ATTRIB_COLOR0]->stride) {
451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (HAVE_ELTS) {
452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 LOCAL_VARS;
453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 int dmasz = GET_SUBSEQUENT_VB_MAX_ELTS();
454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 int currentsz;
455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 GLuint j, nr;
456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         EMIT_INDEXED_VERTS( ctx, start, count );
458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 /* Simulate flat-shaded quadstrips using indexed vertices:
460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  */
461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 ELT_INIT( GL_TRIANGLES );
462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 currentsz = GET_CURRENT_VB_MAX_ELTS();
464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 /* Emit whole number of quads in total, and in each buffer.
466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  */
467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 dmasz -= dmasz & 1;
468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 count -= (count-start) & 1;
469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 currentsz -= currentsz & 1;
470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (currentsz < 12)
472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    currentsz = dmasz;
473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 currentsz = currentsz/6*2;
475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 dmasz = dmasz/6*2;
476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 for (j = start; j + 3 < count; j += nr - 2 ) {
478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    nr = MIN2( currentsz, count - j );
479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    if (nr >= 4) {
480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       GLint quads = (nr/2)-1;
481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       GLint i;
482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       ELTS_VARS( ALLOC_ELTS( quads*6 ) );
483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       for ( i = j-start ; i < j-start+quads*2 ; i+=2 ) {
485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		  EMIT_TWO_ELTS( 0, (i+0), (i+1) );
486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		  EMIT_TWO_ELTS( 2, (i+2), (i+1) );
487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		  EMIT_TWO_ELTS( 4, (i+3), (i+2) );
488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		  INCR_ELTS( 6 );
489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       }
490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       FLUSH();
492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    }
493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    currentsz = dmasz;
494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RELEASE_ELT_VERTS();
497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 FLUSH();
498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else {
500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 /* Vertices won't fit in a single buffer or elts not
501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  * available - should never happen.
502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  */
503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 fprintf(stderr, "%s - cannot draw primitive\n", __FUNCTION__);
504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 return;
505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (HAVE_TRI_STRIPS) {
508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      LOCAL_VARS;
509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int dmasz = GET_SUBSEQUENT_VB_MAX_VERTS();
510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int currentsz;
511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Emit smooth-shaded quadstrips as tristrips:
513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      FLUSH();
515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      INIT( GL_TRIANGLE_STRIP );
516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Emit whole number of quads in total, and in each buffer.
518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dmasz -= dmasz & 1;
520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      currentsz = GET_CURRENT_VB_MAX_VERTS();
521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      currentsz -= currentsz & 1;
522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      count -= (count-start) & 1;
523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (currentsz < 8) {
525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 currentsz = dmasz;
526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (j = start; j + 3 < count; j += nr - 2 ) {
529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 nr = MIN2( currentsz, count - j );
530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 TAG(emit_verts)( ctx, j, nr, ALLOC_VERTS(nr) );
531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 currentsz = dmasz;
532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      FLUSH();
535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fprintf(stderr, "%s - cannot draw primitive\n", __FUNCTION__);
538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void TAG(render_quads_verts)( struct gl_context *ctx,
544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				     GLuint start,
545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				     GLuint count,
546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				     GLuint flags )
547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (HAVE_QUADS) {
549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      LOCAL_VARS;
550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int dmasz = (GET_SUBSEQUENT_VB_MAX_VERTS()/4) * 4;
551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int currentsz;
552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint j, nr;
553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      INIT(GL_QUADS);
555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Emit whole number of quads in total.  dmasz is already a multiple
557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * of 4.
558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      count -= (count-start)%4;
560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      currentsz = (GET_CURRENT_VB_MAX_VERTS()/4) * 4;
562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (currentsz < 8)
563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         currentsz = dmasz;
564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (j = start; j < count; j += nr) {
566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         nr = MIN2( currentsz, count - j );
567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         TAG(emit_verts)( ctx, j, nr, ALLOC_VERTS(nr) );
568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         currentsz = dmasz;
569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (HAVE_ELTS) {
572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Hardware doesn't have a quad primitive type -- try to
573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * simulate it using indexed vertices and the triangle
574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * primitive:
575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      LOCAL_VARS;
577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int dmasz = GET_SUBSEQUENT_VB_MAX_ELTS();
578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int currentsz;
579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint j, nr;
580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      EMIT_INDEXED_VERTS( ctx, start, count );
582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      FLUSH();
584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ELT_INIT( GL_TRIANGLES );
585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      currentsz = GET_CURRENT_VB_MAX_ELTS();
586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Emit whole number of quads in total, and in each buffer.
588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dmasz -= dmasz & 3;
590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      count -= (count-start) & 3;
591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      currentsz -= currentsz & 3;
592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Adjust for rendering as triangles:
594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      currentsz = currentsz/6*4;
596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dmasz = dmasz/6*4;
597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (currentsz < 8)
599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 currentsz = dmasz;
600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (j = start; j < count; j += nr ) {
602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 nr = MIN2( currentsz, count - j );
603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (nr >= 4) {
604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    GLint quads = nr/4;
605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    GLint i;
606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    ELTS_VARS( ALLOC_ELTS( quads*6 ) );
607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    for ( i = j-start ; i < j-start+quads*4 ; i+=4 ) {
609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       EMIT_TWO_ELTS( 0, (i+0), (i+1) );
610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       EMIT_TWO_ELTS( 2, (i+3), (i+1) );
611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       EMIT_TWO_ELTS( 4, (i+2), (i+3) );
612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       INCR_ELTS( 6 );
613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    }
614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    FLUSH();
616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 currentsz = dmasz;
618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      RELEASE_ELT_VERTS();
621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (HAVE_TRIANGLES) {
623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Hardware doesn't have a quad primitive type -- try to
624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * simulate it using triangle primitive.  This is a win for
625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * gears, but is it useful in the broader world?
626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      LOCAL_VARS;
628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint j;
629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      INIT(GL_TRIANGLES);
631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (j = start; j < count-3; j += 4) {
633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 void *tmp = ALLOC_VERTS( 6 );
634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 /* Send v0, v1, v3
635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  */
636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 tmp = EMIT_VERTS(ctx, j,     2, tmp);
637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 tmp = EMIT_VERTS(ctx, j + 3, 1, tmp);
638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 /* Send v1, v2, v3
639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  */
640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 tmp = EMIT_VERTS(ctx, j + 1, 3, tmp);
641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 (void) tmp;
642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Vertices won't fit in a single buffer, should never happen.
646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fprintf(stderr, "%s - cannot draw primitive\n", __FUNCTION__);
648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void TAG(render_noop)( struct gl_context *ctx,
653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      GLuint start,
654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      GLuint count,
655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      GLuint flags )
656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic tnl_render_func TAG(render_tab_verts)[GL_POLYGON+2] =
663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   TAG(render_points_verts),
665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   TAG(render_lines_verts),
666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   TAG(render_line_loop_verts),
667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   TAG(render_line_strip_verts),
668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   TAG(render_triangles_verts),
669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   TAG(render_tri_strip_verts),
670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   TAG(render_tri_fan_verts),
671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   TAG(render_quads_verts),
672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   TAG(render_quad_strip_verts),
673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   TAG(render_poly_verts),
674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   TAG(render_noop),
675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/****************************************************************************
679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *                 Render elts using hardware indexed verts                 *
680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ****************************************************************************/
681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if (HAVE_ELTS)
683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void TAG(render_points_elts)( struct gl_context *ctx,
684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				     GLuint start,
685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				     GLuint count,
686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				     GLuint flags )
687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (HAVE_POINTS) {
689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      LOCAL_VARS;
690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int dmasz = GET_SUBSEQUENT_VB_MAX_ELTS();
691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int currentsz;
692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint *elts = TNL_CONTEXT(ctx)->vb.Elts;
693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint j, nr;
694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ELT_INIT( GL_POINTS );
696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      currentsz = GET_CURRENT_VB_MAX_ELTS();
698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (currentsz < 8)
699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 currentsz = dmasz;
700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (j = start; j < count; j += nr ) {
702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 nr = MIN2( currentsz, count - j );
703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 TAG(emit_elts)( ctx, elts+j, nr, ALLOC_ELTS(nr) );
704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 FLUSH();
705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 currentsz = dmasz;
706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fprintf(stderr, "%s - cannot draw primitive\n", __FUNCTION__);
709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void TAG(render_lines_elts)( struct gl_context *ctx,
716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				    GLuint start,
717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				    GLuint count,
718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				    GLuint flags )
719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (HAVE_LINES) {
721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      LOCAL_VARS;
722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int dmasz = GET_SUBSEQUENT_VB_MAX_ELTS();
723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int currentsz;
724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint *elts = TNL_CONTEXT(ctx)->vb.Elts;
725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint j, nr;
726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ELT_INIT( GL_LINES );
728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Emit whole number of lines in total and in each buffer:
730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      count -= (count-start) & 1;
732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      currentsz -= currentsz & 1;
733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dmasz -= dmasz & 1;
734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      currentsz = GET_CURRENT_VB_MAX_ELTS();
736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (currentsz < 8)
737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 currentsz = dmasz;
738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (j = start; j < count; j += nr ) {
740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 nr = MIN2( currentsz, count - j );
741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 TAG(emit_elts)( ctx, elts+j, nr, ALLOC_ELTS(nr) );
742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 FLUSH();
743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 currentsz = dmasz;
744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fprintf(stderr, "%s - cannot draw primitive\n", __FUNCTION__);
747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void TAG(render_line_strip_elts)( struct gl_context *ctx,
753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					 GLuint start,
754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					 GLuint count,
755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					 GLuint flags )
756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (HAVE_LINE_STRIPS) {
758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      LOCAL_VARS;
759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int dmasz = GET_SUBSEQUENT_VB_MAX_ELTS();
760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int currentsz;
761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint *elts = TNL_CONTEXT(ctx)->vb.Elts;
762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint j, nr;
763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      FLUSH(); /* always a new primitive */
765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ELT_INIT( GL_LINE_STRIP );
766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      currentsz = GET_CURRENT_VB_MAX_ELTS();
768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (currentsz < 8)
769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 currentsz = dmasz;
770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (j = start; j + 1 < count; j += nr - 1 ) {
772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 nr = MIN2( currentsz, count - j );
773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 TAG(emit_elts)( ctx, elts+j, nr, ALLOC_ELTS(nr) );
774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 FLUSH();
775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 currentsz = dmasz;
776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* TODO: Try to emit as indexed lines.
779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fprintf(stderr, "%s - cannot draw primitive\n", __FUNCTION__);
781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void TAG(render_line_loop_elts)( struct gl_context *ctx,
787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					GLuint start,
788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					GLuint count,
789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					GLuint flags )
790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (HAVE_LINE_STRIPS) {
792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      LOCAL_VARS;
793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int dmasz = GET_SUBSEQUENT_VB_MAX_ELTS();
794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int currentsz;
795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint *elts = TNL_CONTEXT(ctx)->vb.Elts;
796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint j, nr;
797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      FLUSH();
799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ELT_INIT( GL_LINE_STRIP );
800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (flags & PRIM_BEGIN)
802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 j = start;
803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else
804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 j = start + 1;
805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      currentsz = GET_CURRENT_VB_MAX_ELTS();
807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (currentsz < 8) {
808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 currentsz = dmasz;
809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Ensure last vertex doesn't wrap:
812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      currentsz--;
814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dmasz--;
815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (j + 1 < count) {
817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 for ( ; j + 1 < count; j += nr - 1 ) {
818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    nr = MIN2( currentsz, count - j );
819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    if (j + nr >= count &&
821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		start < count - 1 &&
822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		(flags & PRIM_END))
823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    {
824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       void *tmp;
825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       tmp = ALLOC_ELTS(nr+1);
826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       tmp = TAG(emit_elts)( ctx, elts+j, nr, tmp );
827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       tmp = TAG(emit_elts)( ctx, elts+start, 1, tmp );
828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       (void) tmp;
829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    }
830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    else {
831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       TAG(emit_elts)( ctx, elts+j, nr, ALLOC_ELTS(nr) );
832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       currentsz = dmasz;
833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    }
834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else if (start + 1 < count && (flags & PRIM_END)) {
838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 void *tmp;
839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 tmp = ALLOC_ELTS(2);
840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 tmp = TAG(emit_elts)( ctx, elts+start+1, 1, tmp );
841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 tmp = TAG(emit_elts)( ctx, elts+start, 1, tmp );
842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 (void) tmp;
843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      FLUSH();
846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* TODO: Try to emit as indexed lines */
848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fprintf(stderr, "%s - cannot draw primitive\n", __FUNCTION__);
849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* For verts, we still eliminate the copy from main memory to dma
855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * buffers.  For elts, this is probably no better (worse?) than the
856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * standard path.
857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void TAG(render_triangles_elts)( struct gl_context *ctx,
859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					GLuint start,
860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					GLuint count,
861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					GLuint flags )
862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   LOCAL_VARS;
864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint *elts = TNL_CONTEXT(ctx)->vb.Elts;
865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int dmasz = GET_SUBSEQUENT_VB_MAX_ELTS()/3*3;
866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int currentsz;
867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint j, nr;
868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   FLUSH();
870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ELT_INIT( GL_TRIANGLES );
871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   currentsz = GET_CURRENT_VB_MAX_ELTS();
873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Emit whole number of tris in total.  dmasz is already a multiple
875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * of 3.
876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   count -= (count-start)%3;
878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   currentsz -= currentsz%3;
879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (currentsz < 8)
880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      currentsz = dmasz;
881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (j = start; j < count; j += nr) {
883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      nr = MIN2( currentsz, count - j );
884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      TAG(emit_elts)( ctx, elts+j, nr, ALLOC_ELTS(nr) );
885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      FLUSH();
886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      currentsz = dmasz;
887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void TAG(render_tri_strip_elts)( struct gl_context *ctx,
893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					GLuint start,
894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					GLuint count,
895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					GLuint flags )
896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (HAVE_TRI_STRIPS) {
898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      LOCAL_VARS;
899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint j, nr;
900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint *elts = TNL_CONTEXT(ctx)->vb.Elts;
901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int dmasz = GET_SUBSEQUENT_VB_MAX_ELTS();
902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int currentsz;
903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      FLUSH();
905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ELT_INIT( GL_TRIANGLE_STRIP );
906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      currentsz = GET_CURRENT_VB_MAX_ELTS();
908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (currentsz < 8) {
909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 currentsz = dmasz;
910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Keep the same winding over multiple buffers:
913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dmasz -= (dmasz & 1);
915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      currentsz -= (currentsz & 1);
916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (j = start ; j + 2 < count; j += nr - 2 ) {
918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 nr = MIN2( currentsz, count - j );
919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 TAG(emit_elts)( ctx, elts+j, nr, ALLOC_ELTS(nr) );
920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 FLUSH();
921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 currentsz = dmasz;
922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* TODO: try to emit as indexed triangles */
925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fprintf(stderr, "%s - cannot draw primitive\n", __FUNCTION__);
926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void TAG(render_tri_fan_elts)( struct gl_context *ctx,
931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				      GLuint start,
932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				      GLuint count,
933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				      GLuint flags )
934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (HAVE_TRI_FANS) {
936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      LOCAL_VARS;
937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint *elts = TNL_CONTEXT(ctx)->vb.Elts;
938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint j, nr;
939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int dmasz = GET_SUBSEQUENT_VB_MAX_ELTS();
940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int currentsz;
941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      FLUSH();
943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ELT_INIT( GL_TRIANGLE_FAN );
944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      currentsz = GET_CURRENT_VB_MAX_ELTS();
946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (currentsz < 8) {
947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 currentsz = dmasz;
948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (j = start + 1 ; j + 1 < count; j += nr - 2 ) {
951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 void *tmp;
952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 nr = MIN2( currentsz, count - j + 1 );
953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 tmp = ALLOC_ELTS( nr );
954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 tmp = TAG(emit_elts)( ctx, elts+start, 1, tmp );
955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 tmp = TAG(emit_elts)( ctx, elts+j, nr - 1, tmp );
956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 (void) tmp;
957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 FLUSH();
958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 currentsz = dmasz;
959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* TODO: try to emit as indexed triangles */
962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fprintf(stderr, "%s - cannot draw primitive\n", __FUNCTION__);
963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void TAG(render_poly_elts)( struct gl_context *ctx,
969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				   GLuint start,
970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				   GLuint count,
971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				   GLuint flags )
972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (HAVE_POLYGONS) {
974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      LOCAL_VARS;
975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint *elts = TNL_CONTEXT(ctx)->vb.Elts;
976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint j, nr;
977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int dmasz = GET_SUBSEQUENT_VB_MAX_ELTS();
978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int currentsz;
979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      FLUSH();
981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ELT_INIT( GL_POLYGON );
982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      currentsz = GET_CURRENT_VB_MAX_ELTS();
984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (currentsz < 8) {
985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 currentsz = dmasz;
986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (j = start + 1 ; j + 1 < count; j += nr - 2 ) {
989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 void *tmp;
990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 nr = MIN2( currentsz, count - j + 1 );
991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 tmp = ALLOC_ELTS( nr );
992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 tmp = TAG(emit_elts)( ctx, elts+start, 1, tmp );
993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 tmp = TAG(emit_elts)( ctx, elts+j, nr - 1, tmp );
994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 (void) tmp;
995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 FLUSH();
996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 currentsz = dmasz;
997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else if (HAVE_TRI_FANS && ctx->Light.ShadeModel == GL_SMOOTH) {
999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      TAG(render_tri_fan_verts)( ctx, start, count, flags );
1000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
1001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fprintf(stderr, "%s - cannot draw primitive\n", __FUNCTION__);
1002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
1003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void TAG(render_quad_strip_elts)( struct gl_context *ctx,
1007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					 GLuint start,
1008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					 GLuint count,
1009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					 GLuint flags )
1010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (HAVE_QUAD_STRIPS && 0) {
1012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (HAVE_TRI_STRIPS) {
1014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      LOCAL_VARS;
1015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint *elts = TNL_CONTEXT(ctx)->vb.Elts;
1016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int dmasz = GET_SUBSEQUENT_VB_MAX_ELTS();
1017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int currentsz;
1018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint j, nr;
1019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      FLUSH();
1021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      currentsz = GET_CURRENT_VB_MAX_ELTS();
1022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Emit whole number of quads in total, and in each buffer.
1024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
1025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dmasz -= dmasz & 1;
1026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      count -= (count-start) & 1;
1027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      currentsz -= currentsz & 1;
1028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (currentsz < 12)
1030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 currentsz = dmasz;
1031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (ctx->Light.ShadeModel == GL_FLAT) {
1033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 ELT_INIT( GL_TRIANGLES );
1034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 currentsz = currentsz/6*2;
1036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 dmasz = dmasz/6*2;
1037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 for (j = start; j + 3 < count; j += nr - 2 ) {
1039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    nr = MIN2( currentsz, count - j );
1040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    if (nr >= 4)
1042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    {
1043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       GLint i;
1044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       GLint quads = (nr/2)-1;
1045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       ELTS_VARS( ALLOC_ELTS( quads*6 ) );
1046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       for ( i = j-start ; i < j-start+quads ; i++, elts += 2 ) {
1048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		  EMIT_TWO_ELTS( 0, elts[0], elts[1] );
1049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		  EMIT_TWO_ELTS( 2, elts[2], elts[1] );
1050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		  EMIT_TWO_ELTS( 4, elts[3], elts[2] );
1051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		  INCR_ELTS( 6 );
1052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       }
1053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       FLUSH();
1055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    }
1056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    currentsz = dmasz;
1058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
1059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else {
1061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 ELT_INIT( GL_TRIANGLE_STRIP );
1062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 for (j = start; j + 3 < count; j += nr - 2 ) {
1064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    nr = MIN2( currentsz, count - j );
1065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    TAG(emit_elts)( ctx, elts+j, nr, ALLOC_ELTS(nr) );
1066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    FLUSH();
1067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    currentsz = dmasz;
1068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
1069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void TAG(render_quads_elts)( struct gl_context *ctx,
1075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				    GLuint start,
1076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				    GLuint count,
1077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				    GLuint flags )
1078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (HAVE_QUADS) {
1080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      LOCAL_VARS;
1081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint *elts = TNL_CONTEXT(ctx)->vb.Elts;
1082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int dmasz = GET_SUBSEQUENT_VB_MAX_ELTS()/4*4;
1083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int currentsz;
1084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint j, nr;
1085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      FLUSH();
1087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ELT_INIT( GL_TRIANGLES );
1088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      currentsz = GET_CURRENT_VB_MAX_ELTS()/4*4;
1090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      count -= (count-start)%4;
1092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (currentsz < 8)
1094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 currentsz = dmasz;
1095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (j = start; j < count; j += nr) {
1097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 nr = MIN2( currentsz, count - j );
1098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 TAG(emit_elts)( ctx, elts+j, nr, ALLOC_ELTS(nr) );
1099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 FLUSH();
1100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 currentsz = dmasz;
1101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
1103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      LOCAL_VARS;
1104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint *elts = TNL_CONTEXT(ctx)->vb.Elts;
1105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int dmasz = GET_SUBSEQUENT_VB_MAX_ELTS();
1106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int currentsz;
1107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint j, nr;
1108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ELT_INIT( GL_TRIANGLES );
1110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      currentsz = GET_CURRENT_VB_MAX_ELTS();
1111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Emit whole number of quads in total, and in each buffer.
1113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
1114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dmasz -= dmasz & 3;
1115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      count -= (count-start) & 3;
1116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      currentsz -= currentsz & 3;
1117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Adjust for rendering as triangles:
1119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
1120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      currentsz = currentsz/6*4;
1121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dmasz = dmasz/6*4;
1122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (currentsz < 8)
1124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 currentsz = dmasz;
1125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (j = start; j + 3 < count; j += nr - 2 ) {
1127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 nr = MIN2( currentsz, count - j );
1128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (nr >= 4)
1130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 {
1131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    GLint quads = nr/4;
1132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    GLint i;
1133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    ELTS_VARS( ALLOC_ELTS( quads * 6 ) );
1134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    for ( i = j-start ; i < j-start+quads ; i++, elts += 4 ) {
1136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       EMIT_TWO_ELTS( 0, elts[0], elts[1] );
1137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       EMIT_TWO_ELTS( 2, elts[3], elts[1] );
1138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       EMIT_TWO_ELTS( 4, elts[2], elts[3] );
1139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       INCR_ELTS( 6 );
1140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    }
1141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    FLUSH();
1143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
1144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 currentsz = dmasz;
1146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic tnl_render_func TAG(render_tab_elts)[GL_POLYGON+2] =
1153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   TAG(render_points_elts),
1155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   TAG(render_lines_elts),
1156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   TAG(render_line_loop_elts),
1157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   TAG(render_line_strip_elts),
1158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   TAG(render_triangles_elts),
1159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   TAG(render_tri_strip_elts),
1160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   TAG(render_tri_fan_elts),
1161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   TAG(render_quads_elts),
1162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   TAG(render_quad_strip_elts),
1163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   TAG(render_poly_elts),
1164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   TAG(render_noop),
1165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
1166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
1170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Pre-check the primitives in the VB to prevent the need for
1174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * fallbacks later on.
1175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean TAG(validate_render)( struct gl_context *ctx,
1177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				       struct vertex_buffer *VB )
1178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint i;
1180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (VB->ClipOrMask & ~CLIP_CULL_BIT)
1182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_FALSE;
1183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (VB->Elts && !HAVE_ELTS)
1185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return GL_FALSE;
1186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0 ; i < VB->PrimitiveCount ; i++) {
1188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint prim = VB->Primitive[i].mode;
1189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint count = VB->Primitive[i].count;
1190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLboolean ok = GL_FALSE;
1191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!count)
1193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 continue;
1194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (prim & PRIM_MODE_MASK) {
1196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_POINTS:
1197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 ok = HAVE_POINTS;
1198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
1199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LINES:
1200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 ok = HAVE_LINES && !ctx->Line.StippleFlag;
1201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
1202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LINE_STRIP:
1203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 ok = HAVE_LINE_STRIPS && !ctx->Line.StippleFlag;
1204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
1205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_LINE_LOOP:
1206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 ok = HAVE_LINE_STRIPS && !ctx->Line.StippleFlag;
1207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
1208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_TRIANGLES:
1209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 ok = HAVE_TRIANGLES;
1210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
1211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_TRIANGLE_STRIP:
1212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 ok = HAVE_TRI_STRIPS;
1213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
1214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_TRIANGLE_FAN:
1215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 ok = HAVE_TRI_FANS;
1216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
1217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_POLYGON:
1218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (HAVE_POLYGONS) {
1219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    ok = GL_TRUE;
1220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
1221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 else {
1222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    ok = (HAVE_TRI_FANS && ctx->Light.ShadeModel == GL_SMOOTH);
1223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
1224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
1225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_QUAD_STRIP:
1226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (VB->Elts) {
1227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    ok = HAVE_TRI_STRIPS;
1228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
1229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 else if (HAVE_QUAD_STRIPS) {
1230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    ok = GL_TRUE;
1231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 } else if (HAVE_TRI_STRIPS &&
1232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    ctx->Light.ShadeModel == GL_FLAT &&
1233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		    VB->AttribPtr[_TNL_ATTRIB_COLOR0]->stride != 0) {
1234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    if (HAVE_ELTS) {
1235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       ok = (GLint) count < GET_SUBSEQUENT_VB_MAX_ELTS();
1236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    }
1237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    else {
1238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	       ok = GL_FALSE;
1239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    }
1240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
1241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 else
1242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    ok = HAVE_TRI_STRIPS;
1243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
1244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_QUADS:
1245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (HAVE_QUADS) {
1246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    ok = GL_TRUE;
1247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 } else if (HAVE_ELTS) {
1248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    ok = (GLint) count < GET_SUBSEQUENT_VB_MAX_ELTS();
1249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
1250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 else {
1251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    ok = HAVE_TRIANGLES; /* flatshading is ok. */
1252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
1253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
1254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
1255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
1256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!ok) {
1259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 	 fprintf(stderr, "not ok %s\n", _mesa_lookup_enum_by_nr(prim & PRIM_MODE_MASK)); */
1260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 return GL_FALSE;
1261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return GL_TRUE;
1265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1267