1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Mesa 3-D graphics library
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Version:  6.5
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 1999-2005  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#ifndef POSTFIX
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define POSTFIX
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifndef INIT
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define INIT(x)
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifndef NEED_EDGEFLAG_SETUP
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define NEED_EDGEFLAG_SETUP 0
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define EDGEFLAG_GET(a) 0
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define EDGEFLAG_SET(a,b) (void)b
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifndef RESET_STIPPLE
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define RESET_STIPPLE
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifndef TEST_PRIM_END
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define TEST_PRIM_END(prim) (flags & PRIM_END)
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define TEST_PRIM_BEGIN(prim) (flags & PRIM_BEGIN)
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifndef ELT
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define ELT(x) x
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifndef RENDER_TAB_QUALIFIER
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define RENDER_TAB_QUALIFIER static
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void TAG(render_points)( struct gl_context *ctx,
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				GLuint start,
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				GLuint count,
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				GLuint flags )
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   LOCAL_VARS;
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) flags;
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   INIT(GL_POINTS);
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   RENDER_POINTS( start, count );
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   POSTFIX;
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void TAG(render_lines)( struct gl_context *ctx,
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			       GLuint start,
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			       GLuint count,
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			       GLuint flags )
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint j;
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   LOCAL_VARS;
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) flags;
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   INIT(GL_LINES);
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (j=start+1; j<count; j+=2 ) {
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      RESET_STIPPLE;
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (ctx->Light.ProvokingVertex == GL_LAST_VERTEX_CONVENTION_EXT)
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RENDER_LINE( ELT(j-1), ELT(j) );
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RENDER_LINE( ELT(j), ELT(j-1) );
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   POSTFIX;
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void TAG(render_line_strip)( struct gl_context *ctx,
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				    GLuint start,
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				    GLuint count,
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				    GLuint flags )
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint j;
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   LOCAL_VARS;
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) flags;
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   INIT(GL_LINE_STRIP);
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (TEST_PRIM_BEGIN(flags)) {
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      RESET_STIPPLE;
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (j=start+1; j<count; j++ ) {
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (ctx->Light.ProvokingVertex == GL_LAST_VERTEX_CONVENTION_EXT)
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RENDER_LINE( ELT(j-1), ELT(j) );
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RENDER_LINE( ELT(j), ELT(j-1) );
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   POSTFIX;
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void TAG(render_line_loop)( struct gl_context *ctx,
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				   GLuint start,
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				   GLuint count,
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				   GLuint flags )
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint i;
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   LOCAL_VARS;
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) flags;
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   INIT(GL_LINE_LOOP);
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (start+1 < count) {
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (TEST_PRIM_BEGIN(flags)) {
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RESET_STIPPLE;
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (ctx->Light.ProvokingVertex == GL_LAST_VERTEX_CONVENTION_EXT)
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            RENDER_LINE( ELT(start), ELT(start+1) );
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         else
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            RENDER_LINE( ELT(start+1), ELT(start) );
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for ( i = start+2 ; i < count ; i++) {
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (ctx->Light.ProvokingVertex == GL_LAST_VERTEX_CONVENTION_EXT)
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            RENDER_LINE( ELT(i-1), ELT(i) );
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         else
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            RENDER_LINE( ELT(i), ELT(i-1) );
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if ( TEST_PRIM_END(flags)) {
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (ctx->Light.ProvokingVertex == GL_LAST_VERTEX_CONVENTION_EXT)
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            RENDER_LINE( ELT(count-1), ELT(start) );
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         else
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            RENDER_LINE( ELT(start), ELT(count-1) );
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   POSTFIX;
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void TAG(render_triangles)( struct gl_context *ctx,
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				   GLuint start,
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				   GLuint count,
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				   GLuint flags )
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint j;
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   LOCAL_VARS;
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) flags;
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   INIT(GL_TRIANGLES);
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (NEED_EDGEFLAG_SETUP) {
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (j=start+2; j<count; j+=3) {
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 /* Leave the edgeflags as supplied by the user.
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  */
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RESET_STIPPLE;
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (ctx->Light.ProvokingVertex == GL_LAST_VERTEX_CONVENTION_EXT)
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            RENDER_TRI( ELT(j-2), ELT(j-1), ELT(j) );
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         else
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            RENDER_TRI( ELT(j-1), ELT(j), ELT(j-2) );
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (j=start+2; j<count; j+=3) {
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (ctx->Light.ProvokingVertex == GL_LAST_VERTEX_CONVENTION_EXT)
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            RENDER_TRI( ELT(j-2), ELT(j-1), ELT(j) );
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         else
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            RENDER_TRI( ELT(j-1), ELT(j), ELT(j-2) );
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   POSTFIX;
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void TAG(render_tri_strip)( struct gl_context *ctx,
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				   GLuint start,
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				   GLuint count,
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				   GLuint flags )
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint j;
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint parity = 0;
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   LOCAL_VARS;
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   INIT(GL_TRIANGLE_STRIP);
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (NEED_EDGEFLAG_SETUP) {
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (j=start+2;j<count;j++,parity^=1) {
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLuint ej2, ej1, ej;
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLboolean ef2, ef1, ef;
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (ctx->Light.ProvokingVertex == GL_LAST_VERTEX_CONVENTION_EXT) {
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ej2 = ELT(j-2+parity);
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ej1 = ELT(j-1-parity);
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ej = ELT(j);
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         else {
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ej2 = ELT(j-1+parity);
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ej1 = ELT(j-parity);
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ej = ELT(j-2);
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 ef2 = EDGEFLAG_GET( ej2 );
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 ef1 = EDGEFLAG_GET( ej1 );
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 ef = EDGEFLAG_GET( ej );
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (TEST_PRIM_BEGIN(flags)) {
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RESET_STIPPLE;
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 EDGEFLAG_SET( ej2, GL_TRUE );
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 EDGEFLAG_SET( ej1, GL_TRUE );
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 EDGEFLAG_SET( ej, GL_TRUE );
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         RENDER_TRI( ej2, ej1, ej );
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 EDGEFLAG_SET( ej2, ef2 );
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 EDGEFLAG_SET( ej1, ef1 );
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 EDGEFLAG_SET( ej, ef );
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (j=start+2; j<count ; j++, parity^=1) {
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (ctx->Light.ProvokingVertex == GL_LAST_VERTEX_CONVENTION_EXT)
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            RENDER_TRI( ELT(j-2+parity), ELT(j-1-parity), ELT(j) );
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         else
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            RENDER_TRI( ELT(j-1+parity), ELT(j-parity), ELT(j-2) );
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   POSTFIX;
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void TAG(render_tri_fan)( struct gl_context *ctx,
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				 GLuint start,
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				 GLuint count,
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				 GLuint flags )
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint j;
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   LOCAL_VARS;
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) flags;
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   INIT(GL_TRIANGLE_FAN);
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (NEED_EDGEFLAG_SETUP) {
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (j=start+2;j<count;j++) {
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 /* For trifans, all edges are boundary.
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  */
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 GLuint ejs = ELT(start);
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 GLuint ej1 = ELT(j-1);
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 GLuint ej = ELT(j);
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 GLboolean efs = EDGEFLAG_GET( ejs );
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 GLboolean ef1 = EDGEFLAG_GET( ej1 );
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 GLboolean ef = EDGEFLAG_GET( ej );
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (TEST_PRIM_BEGIN(flags)) {
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RESET_STIPPLE;
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 EDGEFLAG_SET( ejs, GL_TRUE );
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 EDGEFLAG_SET( ej1, GL_TRUE );
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 EDGEFLAG_SET( ej, GL_TRUE );
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (ctx->Light.ProvokingVertex == GL_LAST_VERTEX_CONVENTION_EXT)
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            RENDER_TRI( ejs, ej1, ej);
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         else
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            RENDER_TRI( ej, ejs, ej1);
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 EDGEFLAG_SET( ejs, efs );
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 EDGEFLAG_SET( ej1, ef1 );
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 EDGEFLAG_SET( ej, ef );
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (j=start+2;j<count;j++) {
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (ctx->Light.ProvokingVertex == GL_LAST_VERTEX_CONVENTION_EXT)
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            RENDER_TRI( ELT(start), ELT(j-1), ELT(j) );
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         else
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            RENDER_TRI( ELT(j), ELT(start), ELT(j-1) );
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   POSTFIX;
286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void TAG(render_poly)( struct gl_context *ctx,
290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      GLuint start,
291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      GLuint count,
292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      GLuint flags )
293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint j = start+2;
295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   LOCAL_VARS;
296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) flags;
297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   INIT(GL_POLYGON);
299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (NEED_EDGEFLAG_SETUP) {
300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLboolean efstart = EDGEFLAG_GET( ELT(start) );
301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLboolean efcount = EDGEFLAG_GET( ELT(count-1) );
302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* If the primitive does not begin here, the first edge
304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * is non-boundary.
305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!TEST_PRIM_BEGIN(flags))
307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 EDGEFLAG_SET( ELT(start), GL_FALSE );
308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else {
309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RESET_STIPPLE;
310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* If the primitive does not end here, the final edge is
313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * non-boundary.
314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!TEST_PRIM_END(flags))
316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 EDGEFLAG_SET( ELT(count-1), GL_FALSE );
317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Draw the first triangles (possibly zero)
319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (j+1<count) {
321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 GLboolean ef = EDGEFLAG_GET( ELT(j) );
322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 EDGEFLAG_SET( ELT(j), GL_FALSE );
323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RENDER_TRI( ELT(j-1), ELT(j), ELT(start) );
324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 EDGEFLAG_SET( ELT(j), ef );
325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 j++;
326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 /* Don't render the first edge again:
328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  */
329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 EDGEFLAG_SET( ELT(start), GL_FALSE );
330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 for (;j+1<count;j++) {
332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    GLboolean efj = EDGEFLAG_GET( ELT(j) );
333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    EDGEFLAG_SET( ELT(j), GL_FALSE );
334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RENDER_TRI( ELT(j-1), ELT(j), ELT(start) );
335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    EDGEFLAG_SET( ELT(j), efj );
336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Draw the last or only triangle
340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (j < count)
342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RENDER_TRI( ELT(j-1), ELT(j), ELT(start) );
343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Restore the first and last edgeflags:
345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      EDGEFLAG_SET( ELT(count-1), efcount );
347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      EDGEFLAG_SET( ELT(start), efstart );
348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (j=start+2;j<count;j++) {
352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RENDER_TRI( ELT(j-1), ELT(j), ELT(start) );
353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   POSTFIX;
356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void TAG(render_quads)( struct gl_context *ctx,
359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			       GLuint start,
360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			       GLuint count,
361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			       GLuint flags )
362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint j;
364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   LOCAL_VARS;
365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) flags;
366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   INIT(GL_QUADS);
368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (NEED_EDGEFLAG_SETUP) {
369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (j=start+3; j<count; j+=4) {
370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 /* Use user-specified edgeflags for quads.
371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  */
372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 RESET_STIPPLE;
373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (ctx->Light.ProvokingVertex == GL_LAST_VERTEX_CONVENTION_EXT ||
374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             !ctx->Const.QuadsFollowProvokingVertexConvention)
375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            RENDER_QUAD( ELT(j-3), ELT(j-2), ELT(j-1), ELT(j) );
376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         else
377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            RENDER_QUAD( ELT(j-2), ELT(j-1), ELT(j), ELT(j-3) );
378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (j=start+3; j<count; j+=4) {
381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (ctx->Light.ProvokingVertex == GL_LAST_VERTEX_CONVENTION_EXT ||
382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             !ctx->Const.QuadsFollowProvokingVertexConvention)
383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            RENDER_QUAD( ELT(j-3), ELT(j-2), ELT(j-1), ELT(j) );
384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         else
385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            RENDER_QUAD( ELT(j-2), ELT(j-1), ELT(j), ELT(j-3) );
386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   POSTFIX;
389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void TAG(render_quad_strip)( struct gl_context *ctx,
392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				    GLuint start,
393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				    GLuint count,
394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				    GLuint flags )
395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint j;
397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   LOCAL_VARS;
398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) flags;
399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   INIT(GL_QUAD_STRIP);
401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (NEED_EDGEFLAG_SETUP) {
402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (j=start+3;j<count;j+=2) {
403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 /* All edges are boundary.  Set edgeflags to 1, draw the
404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  * quad, and restore them to the original values.
405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  */
406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 GLboolean ef3 = EDGEFLAG_GET( ELT(j-3) );
407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 GLboolean ef2 = EDGEFLAG_GET( ELT(j-2) );
408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 GLboolean ef1 = EDGEFLAG_GET( ELT(j-1) );
409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 GLboolean ef = EDGEFLAG_GET( ELT(j) );
410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (TEST_PRIM_BEGIN(flags)) {
411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    RESET_STIPPLE;
412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 EDGEFLAG_SET( ELT(j-3), GL_TRUE );
414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 EDGEFLAG_SET( ELT(j-2), GL_TRUE );
415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 EDGEFLAG_SET( ELT(j-1), GL_TRUE );
416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 EDGEFLAG_SET( ELT(j), GL_TRUE );
417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (ctx->Light.ProvokingVertex == GL_LAST_VERTEX_CONVENTION_EXT ||
418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             !ctx->Const.QuadsFollowProvokingVertexConvention)
419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            RENDER_QUAD( ELT(j-1), ELT(j-3), ELT(j-2), ELT(j) );
420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         else
421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            RENDER_QUAD( ELT(j-2), ELT(j), ELT(j-1), ELT(j-3) );
422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 EDGEFLAG_SET( ELT(j-3), ef3 );
423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 EDGEFLAG_SET( ELT(j-2), ef2 );
424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 EDGEFLAG_SET( ELT(j-1), ef1 );
425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 EDGEFLAG_SET( ELT(j), ef );
426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (j=start+3;j<count;j+=2) {
429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (ctx->Light.ProvokingVertex == GL_LAST_VERTEX_CONVENTION_EXT ||
430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             !ctx->Const.QuadsFollowProvokingVertexConvention)
431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            RENDER_QUAD( ELT(j-1), ELT(j-3), ELT(j-2), ELT(j) );
432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         else
433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            RENDER_QUAD( ELT(j-2), ELT(j), ELT(j-1), ELT(j-3) );
434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   POSTFIX;
437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void TAG(render_noop)( struct gl_context *ctx,
440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      GLuint start,
441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      GLuint count,
442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      GLuint flags )
443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void)(ctx && start && count && flags);
445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgRENDER_TAB_QUALIFIER void (*TAG(render_tab)[GL_POLYGON+2])(struct gl_context *,
448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org							   GLuint,
449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org							   GLuint,
450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org							   GLuint) =
451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   TAG(render_points),
453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   TAG(render_lines),
454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   TAG(render_line_loop),
455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   TAG(render_line_strip),
456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   TAG(render_triangles),
457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   TAG(render_tri_strip),
458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   TAG(render_tri_fan),
459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   TAG(render_quads),
460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   TAG(render_quad_strip),
461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   TAG(render_poly),
462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   TAG(render_noop),
463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifndef PRESERVE_VB_DEFS
468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef RENDER_TRI
469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef RENDER_QUAD
470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef RENDER_LINE
471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef RENDER_POINTS
472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef LOCAL_VARS
473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef INIT
474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef POSTFIX
475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef RESET_STIPPLE
476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef DBG
477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef ELT
478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef RENDER_TAB_QUALIFIER
479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifndef PRESERVE_TAG
482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef TAG
483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef PRESERVE_VB_DEFS
486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef PRESERVE_TAG
487