1524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu/*
2524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu * Mesa 3-D graphics library
3524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu * Version:  7.9
4524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu *
5524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
6524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu * Copyright (C) 2010 LunarG Inc.
7524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu *
8524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu * Permission is hereby granted, free of charge, to any person obtaining a
9524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu * copy of this software and associated documentation files (the "Software"),
10524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu * to deal in the Software without restriction, including without limitation
11524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu * and/or sell copies of the Software, and to permit persons to whom the
13524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu * Software is furnished to do so, subject to the following conditions:
14524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu *
15524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu * The above copyright notice and this permission notice shall be included
16524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu * in all copies or substantial portions of the Software.
17524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu *
18524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
21524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
23524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
24524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu * DEALINGS IN THE SOFTWARE.
25524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu *
26524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu * Authors:
27524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu  *   Keith Whitwell <keith@tungstengraphics.com>
28524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu *    Chia-I Wu <olv@lunarg.com>
29524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu */
30524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu
31524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu/* these macros are optional */
32524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu#ifndef LOCAL_VARS
33d38afcd2f286e924e0f9b7f484712ac19e3f98fcChia-I Wu#define LOCAL_VARS
34524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu#endif
35524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu#ifndef FUNC_ENTER
36524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu#define FUNC_ENTER do {} while (0)
37524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu#endif
38524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu#ifndef FUNC_EXIT
39524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu#define FUNC_EXIT do {} while (0)
40524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu#endif
41524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu#ifndef LINE_ADJ
42524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu#define LINE_ADJ(flags, a0, i0, i1, a1) LINE(flags, i0, i1)
43524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu#endif
44524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu#ifndef TRIANGLE_ADJ
45524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu#define TRIANGLE_ADJ(flags, i0, a0, i1, a1, i2, a2) TRIANGLE(flags, i0, i1, i2)
46524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu#endif
47524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu
48524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wustatic void
49524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I WuFUNC(FUNC_VARS)
50524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu{
51524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu   unsigned idx[6], i;
52524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu   ushort flags;
53d38afcd2f286e924e0f9b7f484712ac19e3f98fcChia-I Wu   LOCAL_VARS
54524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu
55524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu   FUNC_ENTER;
56524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu
57f141abdc8fdbff41e16b0ce53fa3fa8fba32a7f9Chia-I Wu   /* prim, prim_flags, count, and last_vertex_last should have been defined */
58524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu   if (0) {
59f141abdc8fdbff41e16b0ce53fa3fa8fba32a7f9Chia-I Wu      debug_printf("%s: prim 0x%x, prim_flags 0x%x, count %d, last_vertex_last %d\n",
60f141abdc8fdbff41e16b0ce53fa3fa8fba32a7f9Chia-I Wu            __FUNCTION__, prim, prim_flags, count, last_vertex_last);
61524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu   }
62524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu
63524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu   switch (prim) {
64524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu   case PIPE_PRIM_POINTS:
65524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu      for (i = 0; i < count; i++) {
66524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu         idx[0] = GET_ELT(i);
67524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu         POINT(idx[0]);
68524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu      }
69524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu      break;
70524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu
71524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu   case PIPE_PRIM_LINES:
72524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu      flags = DRAW_PIPE_RESET_STIPPLE;
73524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu      for (i = 0; i + 1 < count; i += 2) {
74524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu         idx[0] = GET_ELT(i);
75524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu         idx[1] = GET_ELT(i + 1);
76524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu         LINE(flags, idx[0], idx[1]);
77524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu      }
78524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu      break;
79524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu
80524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu   case PIPE_PRIM_LINE_LOOP:
81524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu   case PIPE_PRIM_LINE_STRIP:
82524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu      if (count >= 2) {
83f141abdc8fdbff41e16b0ce53fa3fa8fba32a7f9Chia-I Wu         flags = (prim_flags & DRAW_SPLIT_BEFORE) ? 0 : DRAW_PIPE_RESET_STIPPLE;
84524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu         idx[1] = GET_ELT(0);
85524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu         idx[2] = idx[1];
86524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu
87524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu         for (i = 1; i < count; i++, flags = 0) {
88524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu            idx[0] = idx[1];
89524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu            idx[1] = GET_ELT(i);
90524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu            LINE(flags, idx[0], idx[1]);
91524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu         }
92524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu         /* close the loop */
93f141abdc8fdbff41e16b0ce53fa3fa8fba32a7f9Chia-I Wu         if (prim == PIPE_PRIM_LINE_LOOP && !prim_flags)
94524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu            LINE(flags, idx[1], idx[2]);
95524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu      }
96524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu      break;
97524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu
98524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu   case PIPE_PRIM_TRIANGLES:
99524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu      flags = DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL;
100524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu      for (i = 0; i + 2 < count; i += 3) {
101524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu         idx[0] = GET_ELT(i);
102524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu         idx[1] = GET_ELT(i + 1);
103524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu         idx[2] = GET_ELT(i + 2);
104524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu         TRIANGLE(flags, idx[0], idx[1], idx[2]);
105524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu      }
106524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu      break;
107524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu
108524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu   case PIPE_PRIM_TRIANGLE_STRIP:
109524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu      if (count >= 3) {
110524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu         flags = DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL;
111524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu         idx[1] = GET_ELT(0);
112524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu         idx[2] = GET_ELT(1);
113524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu
114524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu         if (last_vertex_last) {
115524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu            for (i = 0; i + 2 < count; i++) {
116524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu               idx[0] = idx[1];
117524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu               idx[1] = idx[2];
118524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu               idx[2] = GET_ELT(i + 2);
119524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu               /* always emit idx[2] last */
120524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu               if (i & 1)
121524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu                  TRIANGLE(flags, idx[1], idx[0], idx[2]);
122524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu               else
123524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu                  TRIANGLE(flags, idx[0], idx[1], idx[2]);
124524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu            }
125524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu         }
126524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu         else {
127524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu            for (i = 0; i + 2 < count; i++) {
128524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu               idx[0] = idx[1];
129524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu               idx[1] = idx[2];
130524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu               idx[2] = GET_ELT(i + 2);
131524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu               /* always emit idx[0] first */
132524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu               if (i & 1)
133524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu                  TRIANGLE(flags, idx[0], idx[2], idx[1]);
134524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu               else
135524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu                  TRIANGLE(flags, idx[0], idx[1], idx[2]);
136524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu            }
137524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu         }
138524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu      }
139524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu      break;
140524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu
141524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu   case PIPE_PRIM_TRIANGLE_FAN:
142524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu      if (count >= 3) {
143524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu         flags = DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL;
144524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu         idx[0] = GET_ELT(0);
145524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu         idx[2] = GET_ELT(1);
146524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu
147524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu         /* idx[0] is neither the first nor the last vertex */
148524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu         if (last_vertex_last) {
149524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu            for (i = 0; i + 2 < count; i++) {
150524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu               idx[1] = idx[2];
151524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu               idx[2] = GET_ELT(i + 2);
152524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu               /* always emit idx[2] last */
153524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu               TRIANGLE(flags, idx[0], idx[1], idx[2]);
154524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu            }
155524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu         }
156524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu         else {
157524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu            for (i = 0; i + 2 < count; i++) {
158524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu               idx[1] = idx[2];
159524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu               idx[2] = GET_ELT(i + 2);
160524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu               /* always emit idx[1] first */
161524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu               TRIANGLE(flags, idx[1], idx[2], idx[0]);
162524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu            }
163524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu         }
164524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu      }
165524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu      break;
166524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu
167524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu   case PIPE_PRIM_QUADS:
168524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu      if (last_vertex_last) {
169524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu         for (i = 0; i + 3 < count; i += 4) {
170524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu            idx[0] = GET_ELT(i);
171524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu            idx[1] = GET_ELT(i + 1);
172524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu            idx[2] = GET_ELT(i + 2);
173524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu            idx[3] = GET_ELT(i + 3);
174524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu
175524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu            flags = DRAW_PIPE_RESET_STIPPLE |
176524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu                    DRAW_PIPE_EDGE_FLAG_0 |
177524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu                    DRAW_PIPE_EDGE_FLAG_2;
178524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu            /* always emit idx[3] last */
179524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu            TRIANGLE(flags, idx[0], idx[1], idx[3]);
180524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu
181524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu            flags = DRAW_PIPE_EDGE_FLAG_0 |
182524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu                    DRAW_PIPE_EDGE_FLAG_1;
183524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu            TRIANGLE(flags, idx[1], idx[2], idx[3]);
184524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu         }
185524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu      }
186524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu      else {
187524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu         for (i = 0; i + 3 < count; i += 4) {
188524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu            idx[0] = GET_ELT(i);
189524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu            idx[1] = GET_ELT(i + 1);
190524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu            idx[2] = GET_ELT(i + 2);
191524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu            idx[3] = GET_ELT(i + 3);
192524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu
193524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu            flags = DRAW_PIPE_RESET_STIPPLE |
194524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu                    DRAW_PIPE_EDGE_FLAG_0 |
195524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu                    DRAW_PIPE_EDGE_FLAG_1;
1968b4f7b0672d663273310fffa9490ad996f5b914aChristoph Bumiller            /* always emit idx[3] / idx[0] first */
1978b4f7b0672d663273310fffa9490ad996f5b914aChristoph Bumiller            if (quads_flatshade_last)
1988b4f7b0672d663273310fffa9490ad996f5b914aChristoph Bumiller               TRIANGLE(flags, idx[3], idx[0], idx[1]);
1998b4f7b0672d663273310fffa9490ad996f5b914aChristoph Bumiller            else
2008b4f7b0672d663273310fffa9490ad996f5b914aChristoph Bumiller               TRIANGLE(flags, idx[0], idx[1], idx[2]);
201524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu
202524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu            flags = DRAW_PIPE_EDGE_FLAG_1 |
203524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu                    DRAW_PIPE_EDGE_FLAG_2;
2048b4f7b0672d663273310fffa9490ad996f5b914aChristoph Bumiller            if (quads_flatshade_last)
2058b4f7b0672d663273310fffa9490ad996f5b914aChristoph Bumiller               TRIANGLE(flags, idx[3], idx[1], idx[2]);
2068b4f7b0672d663273310fffa9490ad996f5b914aChristoph Bumiller            else
2078b4f7b0672d663273310fffa9490ad996f5b914aChristoph Bumiller               TRIANGLE(flags, idx[0], idx[2], idx[3]);
208524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu         }
209524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu      }
210524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu      break;
211524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu
212524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu   case PIPE_PRIM_QUAD_STRIP:
213524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu      if (count >= 4) {
214524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu         idx[2] = GET_ELT(0);
215524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu         idx[3] = GET_ELT(1);
216524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu
217524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu         if (last_vertex_last) {
218524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu            for (i = 0; i + 3 < count; i += 2) {
219524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu               idx[0] = idx[2];
220524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu               idx[1] = idx[3];
221524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu               idx[2] = GET_ELT(i + 2);
222524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu               idx[3] = GET_ELT(i + 3);
223524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu
224524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu               /* always emit idx[3] last */
225524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu               flags = DRAW_PIPE_RESET_STIPPLE |
226524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu                       DRAW_PIPE_EDGE_FLAG_0 |
227524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu                       DRAW_PIPE_EDGE_FLAG_2;
228524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu               TRIANGLE(flags, idx[2], idx[0], idx[3]);
229524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu
230524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu               flags = DRAW_PIPE_EDGE_FLAG_0 |
231524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu                       DRAW_PIPE_EDGE_FLAG_1;
232524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu               TRIANGLE(flags, idx[0], idx[1], idx[3]);
233524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu            }
234524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu         }
235524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu         else {
236524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu            for (i = 0; i + 3 < count; i += 2) {
237524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu               idx[0] = idx[2];
238524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu               idx[1] = idx[3];
239524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu               idx[2] = GET_ELT(i + 2);
240524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu               idx[3] = GET_ELT(i + 3);
241524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu
242524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu               flags = DRAW_PIPE_RESET_STIPPLE |
243524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu                       DRAW_PIPE_EDGE_FLAG_0 |
244524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu                       DRAW_PIPE_EDGE_FLAG_1;
2458b4f7b0672d663273310fffa9490ad996f5b914aChristoph Bumiller               /* always emit idx[3] / idx[0 first */
2468b4f7b0672d663273310fffa9490ad996f5b914aChristoph Bumiller               if (quads_flatshade_last)
2478b4f7b0672d663273310fffa9490ad996f5b914aChristoph Bumiller                  TRIANGLE(flags, idx[3], idx[2], idx[0]);
2488b4f7b0672d663273310fffa9490ad996f5b914aChristoph Bumiller               else
2498b4f7b0672d663273310fffa9490ad996f5b914aChristoph Bumiller                  TRIANGLE(flags, idx[0], idx[3], idx[2]);
250524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu
251524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu               flags = DRAW_PIPE_EDGE_FLAG_1 |
252524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu                       DRAW_PIPE_EDGE_FLAG_2;
2538b4f7b0672d663273310fffa9490ad996f5b914aChristoph Bumiller               if (quads_flatshade_last)
2548b4f7b0672d663273310fffa9490ad996f5b914aChristoph Bumiller                  TRIANGLE(flags, idx[3], idx[0], idx[1]);
2558b4f7b0672d663273310fffa9490ad996f5b914aChristoph Bumiller               else
2568b4f7b0672d663273310fffa9490ad996f5b914aChristoph Bumiller                  TRIANGLE(flags, idx[0], idx[1], idx[3]);
257524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu            }
258524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu         }
259524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu      }
260524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu      break;
261524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu
262524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu   case PIPE_PRIM_POLYGON:
263524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu      if (count >= 3) {
264524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu         ushort edge_next, edge_finish;
265524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu
266524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu         if (last_vertex_last) {
267524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu            flags = (DRAW_PIPE_RESET_STIPPLE |
268524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu                     DRAW_PIPE_EDGE_FLAG_0);
269f141abdc8fdbff41e16b0ce53fa3fa8fba32a7f9Chia-I Wu            if (!(prim_flags & DRAW_SPLIT_BEFORE))
2709271059b361128070c68b3d1a7982b4f9f151546Chia-I Wu               flags |= DRAW_PIPE_EDGE_FLAG_2;
271f141abdc8fdbff41e16b0ce53fa3fa8fba32a7f9Chia-I Wu
272524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu            edge_next = DRAW_PIPE_EDGE_FLAG_0;
273f141abdc8fdbff41e16b0ce53fa3fa8fba32a7f9Chia-I Wu            edge_finish =
274f141abdc8fdbff41e16b0ce53fa3fa8fba32a7f9Chia-I Wu               (prim_flags & DRAW_SPLIT_AFTER) ? 0 : DRAW_PIPE_EDGE_FLAG_1;
275524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu         }
276524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu         else {
277524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu            flags = (DRAW_PIPE_RESET_STIPPLE |
278524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu                     DRAW_PIPE_EDGE_FLAG_1);
279f141abdc8fdbff41e16b0ce53fa3fa8fba32a7f9Chia-I Wu            if (!(prim_flags & DRAW_SPLIT_BEFORE))
280f141abdc8fdbff41e16b0ce53fa3fa8fba32a7f9Chia-I Wu               flags |= DRAW_PIPE_EDGE_FLAG_0;
281f141abdc8fdbff41e16b0ce53fa3fa8fba32a7f9Chia-I Wu
282524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu            edge_next = DRAW_PIPE_EDGE_FLAG_1;
283f141abdc8fdbff41e16b0ce53fa3fa8fba32a7f9Chia-I Wu            edge_finish =
284f141abdc8fdbff41e16b0ce53fa3fa8fba32a7f9Chia-I Wu               (prim_flags & DRAW_SPLIT_AFTER) ? 0 : DRAW_PIPE_EDGE_FLAG_2;
285524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu         }
286524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu
287524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu         idx[0] = GET_ELT(0);
288524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu         idx[2] = GET_ELT(1);
289524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu
290524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu         for (i = 0; i + 2 < count; i++, flags = edge_next) {
291524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu            idx[1] = idx[2];
292524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu            idx[2] = GET_ELT(i + 2);
293524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu
294524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu            if (i + 3 == count)
295524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu               flags |= edge_finish;
296524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu
297524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu            /* idx[0] is both the first and the last vertex */
298524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu            if (last_vertex_last)
299524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu               TRIANGLE(flags, idx[1], idx[2], idx[0]);
300524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu            else
301524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu               TRIANGLE(flags, idx[0], idx[1], idx[2]);
302524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu         }
303524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu      }
304524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu      break;
305524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu
306524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu   case PIPE_PRIM_LINES_ADJACENCY:
307524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu      flags = DRAW_PIPE_RESET_STIPPLE;
308524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu      for (i = 0; i + 3 < count; i += 4) {
309524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu         idx[0] = GET_ELT(i);
310524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu         idx[1] = GET_ELT(i + 1);
311524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu         idx[2] = GET_ELT(i + 2);
312524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu         idx[3] = GET_ELT(i + 3);
313524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu         LINE_ADJ(flags, idx[0], idx[1], idx[2], idx[3]);
314524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu      }
315524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu      break;
316524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu
317524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu   case PIPE_PRIM_LINE_STRIP_ADJACENCY:
318524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu      if (count >= 4) {
319f141abdc8fdbff41e16b0ce53fa3fa8fba32a7f9Chia-I Wu         flags = (prim_flags & DRAW_SPLIT_BEFORE) ? 0 : DRAW_PIPE_RESET_STIPPLE;
320524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu         idx[1] = GET_ELT(0);
321524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu         idx[2] = GET_ELT(1);
322524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu         idx[3] = GET_ELT(2);
323524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu
324524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu         for (i = 1; i + 2 < count; i++, flags = 0) {
325524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu            idx[0] = idx[1];
326524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu            idx[1] = idx[2];
327524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu            idx[2] = idx[3];
328524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu            idx[3] = GET_ELT(i + 2);
329524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu            LINE_ADJ(flags, idx[0], idx[1], idx[2], idx[3]);
330524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu         }
331524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu      }
332524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu      break;
333524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu
334524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu   case PIPE_PRIM_TRIANGLES_ADJACENCY:
335524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu      flags = DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL;
336524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu      for (i = 0; i + 5 < count; i += 6) {
337524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu         idx[0] = GET_ELT(i);
338524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu         idx[1] = GET_ELT(i + 1);
339524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu         idx[2] = GET_ELT(i + 2);
340524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu         idx[3] = GET_ELT(i + 3);
341524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu         idx[4] = GET_ELT(i + 4);
342524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu         idx[5] = GET_ELT(i + 5);
343524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu         TRIANGLE_ADJ(flags, idx[0], idx[1], idx[2], idx[3], idx[4], idx[5]);
344524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu      }
345524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu      break;
346524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu
347524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu   case PIPE_PRIM_TRIANGLE_STRIP_ADJACENCY:
348524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu      if (count >= 6) {
349524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu         flags = DRAW_PIPE_RESET_STIPPLE | DRAW_PIPE_EDGE_FLAG_ALL;
350524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu         idx[0] = GET_ELT(1);
351524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu         idx[2] = GET_ELT(0);
352524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu         idx[4] = GET_ELT(2);
353524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu         idx[3] = GET_ELT(4);
354524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu
355524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu         /*
356524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu          * The vertices of the i-th triangle are stored in
357524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu          * idx[0,2,4] = { 2*i, 2*i+2, 2*i+4 };
358524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu          *
359524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu          * The adjacent vertices are stored in
360524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu          * idx[1,3,5] = { 2*i-2, 2*i+6, 2*i+3 }.
361524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu          *
362524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu          * However, there are two exceptions:
363524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu          *
364524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu          * For the first triangle, idx[1] = 1;
365524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu          * For the  last triangle, idx[3] = 2*i+5.
366524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu          */
367524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu         if (last_vertex_last) {
368524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu            for (i = 0; i + 5 < count; i += 2) {
369524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu               idx[1] = idx[0];
370524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu
371524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu               idx[0] = idx[2];
372524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu               idx[2] = idx[4];
373524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu               idx[4] = idx[3];
374524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu
375524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu               idx[3] = GET_ELT(i + ((i + 7 < count) ? 6 : 5));
376524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu               idx[5] = GET_ELT(i + 3);
377524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu
378524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu               /*
379524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu                * alternate the first two vertices (idx[0] and idx[2]) and the
380524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu                * corresponding adjacent vertices (idx[3] and idx[5]) to have
381524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu                * the correct orientation
382524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu                */
383524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu               if (i & 2) {
384524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu                  TRIANGLE_ADJ(flags,
385524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu                        idx[2], idx[1], idx[0], idx[5], idx[4], idx[3]);
386524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu               }
387524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu               else {
388524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu                  TRIANGLE_ADJ(flags,
389524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu                        idx[0], idx[1], idx[2], idx[3], idx[4], idx[5]);
390524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu               }
391524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu            }
392524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu         }
393524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu         else {
394524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu            for (i = 0; i + 5 < count; i += 2) {
395524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu               idx[1] = idx[0];
396524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu
397524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu               idx[0] = idx[2];
398524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu               idx[2] = idx[4];
399524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu               idx[4] = idx[3];
400524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu
401524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu               idx[3] = GET_ELT(i + ((i + 7 < count) ? 6 : 5));
402524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu               idx[5] = GET_ELT(i + 3);
403524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu
404524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu               /*
405524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu                * alternate the last two vertices (idx[2] and idx[4]) and the
406524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu                * corresponding adjacent vertices (idx[1] and idx[5]) to have
407524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu                * the correct orientation
408524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu                */
409524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu               if (i & 2) {
410524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu                  TRIANGLE_ADJ(flags,
411524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu                        idx[0], idx[5], idx[4], idx[3], idx[2], idx[1]);
412524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu               }
413524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu               else {
414524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu                  TRIANGLE_ADJ(flags,
415524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu                        idx[0], idx[1], idx[2], idx[3], idx[4], idx[5]);
416524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu               }
417524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu            }
418524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu         }
419524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu      }
420524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu      break;
421524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu
422524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu   default:
423524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu      assert(0);
424524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu      break;
425524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu   }
426524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu
427524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu   FUNC_EXIT;
428524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu}
429524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu
430524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu#undef LOCAL_VARS
431524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu#undef FUNC_ENTER
432524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu#undef FUNC_EXIT
433524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu#undef LINE_ADJ
434524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu#undef TRIANGLE_ADJ
435524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu
436524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu#undef FUNC
437524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu#undef FUNC_VARS
438524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu#undef GET_ELT
439524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu#undef POINT
440524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu#undef LINE
441524b2626c2d018f330ae7423c858ef73ea0424b5Chia-I Wu#undef TRIANGLE
442