18e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell/**************************************************************************
28e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell *
38e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
48e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * All Rights Reserved.
58e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell *
68e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * Permission is hereby granted, free of charge, to any person obtaining a
78e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * copy of this software and associated documentation files (the
88e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * "Software"), to deal in the Software without restriction, including
98e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * without limitation the rights to use, copy, modify, merge, publish,
108e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * distribute, sub license, and/or sell copies of the Software, and to
118e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * permit persons to whom the Software is furnished to do so, subject to
128e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * the following conditions:
138e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell *
148e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * The above copyright notice and this permission notice (including the
158e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * next paragraph) shall be included in all copies or substantial portions
168e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * of the Software.
178e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell *
188e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
198e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
208e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
218e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
228e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
238e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
248e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
258e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell *
268e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell **************************************************************************/
278e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell
288e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell/* Authors:  Keith Whitwell <keith@tungstengraphics.com>
298e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell */
308e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell
314f25420bdd834e81a3e22733304efc5261c2998aBrian Paul#include "util/u_math.h"
324f25420bdd834e81a3e22733304efc5261c2998aBrian Paul#include "util/u_memory.h"
334f25420bdd834e81a3e22733304efc5261c2998aBrian Paul
34cd3643698eafa0869a8317b002e5b066de0172e7Brian#include "pipe/p_shader_tokens.h"
35280bcff1fa200b790d8712946a4ffbaa47a67433Keith Whitwell#include "draw_vs.h"
36507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell#include "draw_pipe.h"
378e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell
388e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell
39cd3643698eafa0869a8317b002e5b066de0172e7Brian/** subclass of draw_stage */
40cd3643698eafa0869a8317b002e5b066de0172e7Brianstruct flat_stage
418e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell{
42cd3643698eafa0869a8317b002e5b066de0172e7Brian   struct draw_stage stage;
43cd3643698eafa0869a8317b002e5b066de0172e7Brian
44cd3643698eafa0869a8317b002e5b066de0172e7Brian   uint num_color_attribs;
45807f8f177b3a2833806d84a70e71019f8849239fKeith Whitwell   uint color_attribs[2];  /* front/back primary colors */
46807f8f177b3a2833806d84a70e71019f8849239fKeith Whitwell
47807f8f177b3a2833806d84a70e71019f8849239fKeith Whitwell   uint num_spec_attribs;
48807f8f177b3a2833806d84a70e71019f8849239fKeith Whitwell   uint spec_attribs[2];  /* front/back secondary colors */
49cd3643698eafa0869a8317b002e5b066de0172e7Brian};
508e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell
51807f8f177b3a2833806d84a70e71019f8849239fKeith Whitwell#define COPY_3FV( DST, SRC )         \
52807f8f177b3a2833806d84a70e71019f8849239fKeith Whitwelldo {                                \
53807f8f177b3a2833806d84a70e71019f8849239fKeith Whitwell   (DST)[0] = (SRC)[0];             \
54807f8f177b3a2833806d84a70e71019f8849239fKeith Whitwell   (DST)[1] = (SRC)[1];             \
55807f8f177b3a2833806d84a70e71019f8849239fKeith Whitwell   (DST)[2] = (SRC)[2];             \
56807f8f177b3a2833806d84a70e71019f8849239fKeith Whitwell} while (0)
57807f8f177b3a2833806d84a70e71019f8849239fKeith Whitwell
588e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell
59cd3643698eafa0869a8317b002e5b066de0172e7Brianstatic INLINE struct flat_stage *
60cd3643698eafa0869a8317b002e5b066de0172e7Brianflat_stage(struct draw_stage *stage)
61cd3643698eafa0869a8317b002e5b066de0172e7Brian{
62cd3643698eafa0869a8317b002e5b066de0172e7Brian   return (struct flat_stage *) stage;
63cd3643698eafa0869a8317b002e5b066de0172e7Brian}
64cd3643698eafa0869a8317b002e5b066de0172e7Brian
658e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell
66cd3643698eafa0869a8317b002e5b066de0172e7Brian/** Copy all the color attributes from 'src' vertex to 'dst' vertex */
67a148cc51fbe56266199057cfde2abb2b59eb8713Brianstatic INLINE void copy_colors( struct draw_stage *stage,
68a148cc51fbe56266199057cfde2abb2b59eb8713Brian                                struct vertex_header *dst,
69279ffe3f163fd6a5e7bfa108db14c81acbb06eceBrian                                const struct vertex_header *src )
708e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell{
71cd3643698eafa0869a8317b002e5b066de0172e7Brian   const struct flat_stage *flat = flat_stage(stage);
72942b9bc5bc13d959baa86779a7c669cf96659b9aBrian   uint i;
73807f8f177b3a2833806d84a70e71019f8849239fKeith Whitwell
74a148cc51fbe56266199057cfde2abb2b59eb8713Brian   for (i = 0; i < flat->num_color_attribs; i++) {
75a148cc51fbe56266199057cfde2abb2b59eb8713Brian      const uint attr = flat->color_attribs[i];
76a148cc51fbe56266199057cfde2abb2b59eb8713Brian      COPY_4FV(dst->data[attr], src->data[attr]);
77a148cc51fbe56266199057cfde2abb2b59eb8713Brian   }
78807f8f177b3a2833806d84a70e71019f8849239fKeith Whitwell
79807f8f177b3a2833806d84a70e71019f8849239fKeith Whitwell   for (i = 0; i < flat->num_spec_attribs; i++) {
80807f8f177b3a2833806d84a70e71019f8849239fKeith Whitwell      const uint attr = flat->spec_attribs[i];
81807f8f177b3a2833806d84a70e71019f8849239fKeith Whitwell      COPY_3FV(dst->data[attr], src->data[attr]);
82807f8f177b3a2833806d84a70e71019f8849239fKeith Whitwell   }
83a148cc51fbe56266199057cfde2abb2b59eb8713Brian}
84942b9bc5bc13d959baa86779a7c669cf96659b9aBrian
85a148cc51fbe56266199057cfde2abb2b59eb8713Brian
86a148cc51fbe56266199057cfde2abb2b59eb8713Brian/** Copy all the color attributes from src vertex to dst0 & dst1 vertices */
87a148cc51fbe56266199057cfde2abb2b59eb8713Brianstatic INLINE void copy_colors2( struct draw_stage *stage,
88a148cc51fbe56266199057cfde2abb2b59eb8713Brian                                 struct vertex_header *dst0,
89a148cc51fbe56266199057cfde2abb2b59eb8713Brian                                 struct vertex_header *dst1,
90a148cc51fbe56266199057cfde2abb2b59eb8713Brian                                 const struct vertex_header *src )
91a148cc51fbe56266199057cfde2abb2b59eb8713Brian{
92a148cc51fbe56266199057cfde2abb2b59eb8713Brian   const struct flat_stage *flat = flat_stage(stage);
93a148cc51fbe56266199057cfde2abb2b59eb8713Brian   uint i;
94cd3643698eafa0869a8317b002e5b066de0172e7Brian   for (i = 0; i < flat->num_color_attribs; i++) {
95cd3643698eafa0869a8317b002e5b066de0172e7Brian      const uint attr = flat->color_attribs[i];
96a148cc51fbe56266199057cfde2abb2b59eb8713Brian      COPY_4FV(dst0->data[attr], src->data[attr]);
97a148cc51fbe56266199057cfde2abb2b59eb8713Brian      COPY_4FV(dst1->data[attr], src->data[attr]);
98942b9bc5bc13d959baa86779a7c669cf96659b9aBrian   }
99807f8f177b3a2833806d84a70e71019f8849239fKeith Whitwell
100807f8f177b3a2833806d84a70e71019f8849239fKeith Whitwell   for (i = 0; i < flat->num_spec_attribs; i++) {
101807f8f177b3a2833806d84a70e71019f8849239fKeith Whitwell      const uint attr = flat->spec_attribs[i];
102807f8f177b3a2833806d84a70e71019f8849239fKeith Whitwell      COPY_3FV(dst0->data[attr], src->data[attr]);
103807f8f177b3a2833806d84a70e71019f8849239fKeith Whitwell      COPY_3FV(dst1->data[attr], src->data[attr]);
104807f8f177b3a2833806d84a70e71019f8849239fKeith Whitwell   }
1058e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell}
1068e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell
1078e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell
108279ffe3f163fd6a5e7bfa108db14c81acbb06eceBrian/**
109279ffe3f163fd6a5e7bfa108db14c81acbb06eceBrian * Flatshade tri.  Required for clipping and when unfilled tris are
1108e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell * active, otherwise handled by hardware.
1118e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell */
112caa44763f7f7aa26ed0b0d1e5af0c410fba6bfe6Keith Whitwellstatic void flatshade_tri_0( struct draw_stage *stage,
113caa44763f7f7aa26ed0b0d1e5af0c410fba6bfe6Keith Whitwell                             struct prim_header *header )
114caa44763f7f7aa26ed0b0d1e5af0c410fba6bfe6Keith Whitwell{
115caa44763f7f7aa26ed0b0d1e5af0c410fba6bfe6Keith Whitwell   struct prim_header tmp;
116caa44763f7f7aa26ed0b0d1e5af0c410fba6bfe6Keith Whitwell
117caa44763f7f7aa26ed0b0d1e5af0c410fba6bfe6Keith Whitwell   tmp.det = header->det;
118f93332da5655a31b6c44a1079629a15360ff999bKeith Whitwell   tmp.flags = header->flags;
119f93332da5655a31b6c44a1079629a15360ff999bKeith Whitwell   tmp.pad = header->pad;
120caa44763f7f7aa26ed0b0d1e5af0c410fba6bfe6Keith Whitwell   tmp.v[0] = header->v[0];
121caa44763f7f7aa26ed0b0d1e5af0c410fba6bfe6Keith Whitwell   tmp.v[1] = dup_vert(stage, header->v[1], 0);
122caa44763f7f7aa26ed0b0d1e5af0c410fba6bfe6Keith Whitwell   tmp.v[2] = dup_vert(stage, header->v[2], 1);
123caa44763f7f7aa26ed0b0d1e5af0c410fba6bfe6Keith Whitwell
124caa44763f7f7aa26ed0b0d1e5af0c410fba6bfe6Keith Whitwell   copy_colors2(stage, tmp.v[1], tmp.v[2], tmp.v[0]);
125caa44763f7f7aa26ed0b0d1e5af0c410fba6bfe6Keith Whitwell
126caa44763f7f7aa26ed0b0d1e5af0c410fba6bfe6Keith Whitwell   stage->next->tri( stage->next, &tmp );
127caa44763f7f7aa26ed0b0d1e5af0c410fba6bfe6Keith Whitwell}
128caa44763f7f7aa26ed0b0d1e5af0c410fba6bfe6Keith Whitwell
129caa44763f7f7aa26ed0b0d1e5af0c410fba6bfe6Keith Whitwell
130caa44763f7f7aa26ed0b0d1e5af0c410fba6bfe6Keith Whitwellstatic void flatshade_tri_2( struct draw_stage *stage,
131caa44763f7f7aa26ed0b0d1e5af0c410fba6bfe6Keith Whitwell                             struct prim_header *header )
1328e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell{
1338e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell   struct prim_header tmp;
1348e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell
1358e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell   tmp.det = header->det;
136f93332da5655a31b6c44a1079629a15360ff999bKeith Whitwell   tmp.flags = header->flags;
137f93332da5655a31b6c44a1079629a15360ff999bKeith Whitwell   tmp.pad = header->pad;
1388e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell   tmp.v[0] = dup_vert(stage, header->v[0], 0);
1398e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell   tmp.v[1] = dup_vert(stage, header->v[1], 1);
1408e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell   tmp.v[2] = header->v[2];
1418e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell
142a148cc51fbe56266199057cfde2abb2b59eb8713Brian   copy_colors2(stage, tmp.v[0], tmp.v[1], tmp.v[2]);
1438e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell
1448e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell   stage->next->tri( stage->next, &tmp );
1458e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell}
1468e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell
1478e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell
148caa44763f7f7aa26ed0b0d1e5af0c410fba6bfe6Keith Whitwell
149caa44763f7f7aa26ed0b0d1e5af0c410fba6bfe6Keith Whitwell
150caa44763f7f7aa26ed0b0d1e5af0c410fba6bfe6Keith Whitwell
151279ffe3f163fd6a5e7bfa108db14c81acbb06eceBrian/**
152279ffe3f163fd6a5e7bfa108db14c81acbb06eceBrian * Flatshade line.  Required for clipping.
1538e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell */
154caa44763f7f7aa26ed0b0d1e5af0c410fba6bfe6Keith Whitwellstatic void flatshade_line_0( struct draw_stage *stage,
155caa44763f7f7aa26ed0b0d1e5af0c410fba6bfe6Keith Whitwell                              struct prim_header *header )
156caa44763f7f7aa26ed0b0d1e5af0c410fba6bfe6Keith Whitwell{
157caa44763f7f7aa26ed0b0d1e5af0c410fba6bfe6Keith Whitwell   struct prim_header tmp;
158caa44763f7f7aa26ed0b0d1e5af0c410fba6bfe6Keith Whitwell
159caa44763f7f7aa26ed0b0d1e5af0c410fba6bfe6Keith Whitwell   tmp.v[0] = header->v[0];
160caa44763f7f7aa26ed0b0d1e5af0c410fba6bfe6Keith Whitwell   tmp.v[1] = dup_vert(stage, header->v[1], 0);
161caa44763f7f7aa26ed0b0d1e5af0c410fba6bfe6Keith Whitwell
162caa44763f7f7aa26ed0b0d1e5af0c410fba6bfe6Keith Whitwell   copy_colors(stage, tmp.v[1], tmp.v[0]);
163caa44763f7f7aa26ed0b0d1e5af0c410fba6bfe6Keith Whitwell
164caa44763f7f7aa26ed0b0d1e5af0c410fba6bfe6Keith Whitwell   stage->next->line( stage->next, &tmp );
165caa44763f7f7aa26ed0b0d1e5af0c410fba6bfe6Keith Whitwell}
166caa44763f7f7aa26ed0b0d1e5af0c410fba6bfe6Keith Whitwell
167caa44763f7f7aa26ed0b0d1e5af0c410fba6bfe6Keith Whitwellstatic void flatshade_line_1( struct draw_stage *stage,
168caa44763f7f7aa26ed0b0d1e5af0c410fba6bfe6Keith Whitwell                              struct prim_header *header )
1698e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell{
1708e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell   struct prim_header tmp;
1718e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell
1728e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell   tmp.v[0] = dup_vert(stage, header->v[0], 0);
1738e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell   tmp.v[1] = header->v[1];
1748e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell
1758e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell   copy_colors(stage, tmp.v[0], tmp.v[1]);
1768e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell
1778e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell   stage->next->line( stage->next, &tmp );
1788e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell}
1798e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell
1808e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell
1818e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell
182279ffe3f163fd6a5e7bfa108db14c81acbb06eceBrian
1830bfd085e2866fbbd40209dcee23f0e6240583fe8Brianstatic void flatshade_init_state( struct draw_stage *stage )
1840bfd085e2866fbbd40209dcee23f0e6240583fe8Brian{
1850bfd085e2866fbbd40209dcee23f0e6240583fe8Brian   struct flat_stage *flat = flat_stage(stage);
1862f0d1396e4c1626b3b1ac799bd29e86a9530369eKeith Whitwell   const struct draw_vertex_shader *vs = stage->draw->vs.vertex_shader;
1870bfd085e2866fbbd40209dcee23f0e6240583fe8Brian   uint i;
1880bfd085e2866fbbd40209dcee23f0e6240583fe8Brian
1890bfd085e2866fbbd40209dcee23f0e6240583fe8Brian   /* Find which vertex shader outputs are colors, make a list */
1900bfd085e2866fbbd40209dcee23f0e6240583fe8Brian   flat->num_color_attribs = 0;
191807f8f177b3a2833806d84a70e71019f8849239fKeith Whitwell   flat->num_spec_attribs = 0;
192cddeca51adf0d2b736a223e47b60f6ef3be85bffBrian   for (i = 0; i < vs->info.num_outputs; i++) {
193cddeca51adf0d2b736a223e47b60f6ef3be85bffBrian      if (vs->info.output_semantic_name[i] == TGSI_SEMANTIC_COLOR ||
194cddeca51adf0d2b736a223e47b60f6ef3be85bffBrian          vs->info.output_semantic_name[i] == TGSI_SEMANTIC_BCOLOR) {
195807f8f177b3a2833806d84a70e71019f8849239fKeith Whitwell         if (vs->info.output_semantic_index[i] == 0)
196807f8f177b3a2833806d84a70e71019f8849239fKeith Whitwell            flat->color_attribs[flat->num_color_attribs++] = i;
197807f8f177b3a2833806d84a70e71019f8849239fKeith Whitwell         else
198807f8f177b3a2833806d84a70e71019f8849239fKeith Whitwell            flat->spec_attribs[flat->num_spec_attribs++] = i;
1990bfd085e2866fbbd40209dcee23f0e6240583fe8Brian      }
2000bfd085e2866fbbd40209dcee23f0e6240583fe8Brian   }
2010bfd085e2866fbbd40209dcee23f0e6240583fe8Brian
202caa44763f7f7aa26ed0b0d1e5af0c410fba6bfe6Keith Whitwell   /* Choose flatshade routine according to provoking vertex:
203caa44763f7f7aa26ed0b0d1e5af0c410fba6bfe6Keith Whitwell    */
204caa44763f7f7aa26ed0b0d1e5af0c410fba6bfe6Keith Whitwell   if (stage->draw->rasterizer->flatshade_first) {
205caa44763f7f7aa26ed0b0d1e5af0c410fba6bfe6Keith Whitwell      stage->line = flatshade_line_0;
206caa44763f7f7aa26ed0b0d1e5af0c410fba6bfe6Keith Whitwell      stage->tri = flatshade_tri_0;
207caa44763f7f7aa26ed0b0d1e5af0c410fba6bfe6Keith Whitwell   }
208caa44763f7f7aa26ed0b0d1e5af0c410fba6bfe6Keith Whitwell   else {
209caa44763f7f7aa26ed0b0d1e5af0c410fba6bfe6Keith Whitwell      stage->line = flatshade_line_1;
210caa44763f7f7aa26ed0b0d1e5af0c410fba6bfe6Keith Whitwell      stage->tri = flatshade_tri_2;
211caa44763f7f7aa26ed0b0d1e5af0c410fba6bfe6Keith Whitwell   }
2120bfd085e2866fbbd40209dcee23f0e6240583fe8Brian}
2130bfd085e2866fbbd40209dcee23f0e6240583fe8Brian
2140bfd085e2866fbbd40209dcee23f0e6240583fe8Brianstatic void flatshade_first_tri( struct draw_stage *stage,
2150bfd085e2866fbbd40209dcee23f0e6240583fe8Brian				 struct prim_header *header )
2160bfd085e2866fbbd40209dcee23f0e6240583fe8Brian{
2170bfd085e2866fbbd40209dcee23f0e6240583fe8Brian   flatshade_init_state( stage );
2180bfd085e2866fbbd40209dcee23f0e6240583fe8Brian   stage->tri( stage, header );
2190bfd085e2866fbbd40209dcee23f0e6240583fe8Brian}
2200bfd085e2866fbbd40209dcee23f0e6240583fe8Brian
2210bfd085e2866fbbd40209dcee23f0e6240583fe8Brianstatic void flatshade_first_line( struct draw_stage *stage,
2220bfd085e2866fbbd40209dcee23f0e6240583fe8Brian				  struct prim_header *header )
2230bfd085e2866fbbd40209dcee23f0e6240583fe8Brian{
2240bfd085e2866fbbd40209dcee23f0e6240583fe8Brian   flatshade_init_state( stage );
2250bfd085e2866fbbd40209dcee23f0e6240583fe8Brian   stage->line( stage, header );
2260bfd085e2866fbbd40209dcee23f0e6240583fe8Brian}
2270bfd085e2866fbbd40209dcee23f0e6240583fe8Brian
2280bfd085e2866fbbd40209dcee23f0e6240583fe8Brian
2290bfd085e2866fbbd40209dcee23f0e6240583fe8Brianstatic void flatshade_flush( struct draw_stage *stage,
2300bfd085e2866fbbd40209dcee23f0e6240583fe8Brian			     unsigned flags )
2318e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell{
2320bfd085e2866fbbd40209dcee23f0e6240583fe8Brian   stage->tri = flatshade_first_tri;
2330bfd085e2866fbbd40209dcee23f0e6240583fe8Brian   stage->line = flatshade_first_line;
2340bfd085e2866fbbd40209dcee23f0e6240583fe8Brian   stage->next->flush( stage->next, flags );
2358e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell}
2368e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell
237279ffe3f163fd6a5e7bfa108db14c81acbb06eceBrian
2380360b49afbcd839f99ba0745d01cf9dc5be4d122Brianstatic void flatshade_reset_stipple_counter( struct draw_stage *stage )
2390360b49afbcd839f99ba0745d01cf9dc5be4d122Brian{
2400360b49afbcd839f99ba0745d01cf9dc5be4d122Brian   stage->next->reset_stipple_counter( stage->next );
2410360b49afbcd839f99ba0745d01cf9dc5be4d122Brian}
2420360b49afbcd839f99ba0745d01cf9dc5be4d122Brian
2430360b49afbcd839f99ba0745d01cf9dc5be4d122Brian
244d75454840672f462de933724daae24a839aac48eMichalstatic void flatshade_destroy( struct draw_stage *stage )
245d75454840672f462de933724daae24a839aac48eMichal{
246b08102a8f3ef558743f5f952c726ba2c28b6e82eBrian   draw_free_temp_verts( stage );
247d75454840672f462de933724daae24a839aac48eMichal   FREE( stage );
248d75454840672f462de933724daae24a839aac48eMichal}
249d75454840672f462de933724daae24a839aac48eMichal
250d75454840672f462de933724daae24a839aac48eMichal
251ea470eec86715cd2bc9aa86d36e6ea803d0d4017Brian/**
252ea470eec86715cd2bc9aa86d36e6ea803d0d4017Brian * Create flatshading drawing stage.
253ea470eec86715cd2bc9aa86d36e6ea803d0d4017Brian */
254ea470eec86715cd2bc9aa86d36e6ea803d0d4017Brianstruct draw_stage *draw_flatshade_stage( struct draw_context *draw )
2558e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell{
256cd3643698eafa0869a8317b002e5b066de0172e7Brian   struct flat_stage *flatshade = CALLOC_STRUCT(flat_stage);
2570d4ece4c5a243dc4b684331bad49f220311e5520Keith Whitwell   if (flatshade == NULL)
2580d4ece4c5a243dc4b684331bad49f220311e5520Keith Whitwell      goto fail;
2598e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell
260cd3643698eafa0869a8317b002e5b066de0172e7Brian   flatshade->stage.draw = draw;
261eb979cef8535914f428d2462e78f713da558fc18Keith Whitwell   flatshade->stage.name = "flatshade";
262cd3643698eafa0869a8317b002e5b066de0172e7Brian   flatshade->stage.next = NULL;
263a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell   flatshade->stage.point = draw_pipe_passthrough_point;
2640bfd085e2866fbbd40209dcee23f0e6240583fe8Brian   flatshade->stage.line = flatshade_first_line;
2650bfd085e2866fbbd40209dcee23f0e6240583fe8Brian   flatshade->stage.tri = flatshade_first_tri;
2660bfd085e2866fbbd40209dcee23f0e6240583fe8Brian   flatshade->stage.flush = flatshade_flush;
267cd3643698eafa0869a8317b002e5b066de0172e7Brian   flatshade->stage.reset_stipple_counter = flatshade_reset_stipple_counter;
268cd3643698eafa0869a8317b002e5b066de0172e7Brian   flatshade->stage.destroy = flatshade_destroy;
2698e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell
2701c377cea1094c0b5414c663adf2fd393bf41ddfbAlan Hourihane   if (!draw_alloc_temp_verts( &flatshade->stage, 2 ))
2711c377cea1094c0b5414c663adf2fd393bf41ddfbAlan Hourihane      goto fail;
2721c377cea1094c0b5414c663adf2fd393bf41ddfbAlan Hourihane
273cd3643698eafa0869a8317b002e5b066de0172e7Brian   return &flatshade->stage;
2740d4ece4c5a243dc4b684331bad49f220311e5520Keith Whitwell
2750d4ece4c5a243dc4b684331bad49f220311e5520Keith Whitwell fail:
2760d4ece4c5a243dc4b684331bad49f220311e5520Keith Whitwell   if (flatshade)
2770d4ece4c5a243dc4b684331bad49f220311e5520Keith Whitwell      flatshade->stage.destroy( &flatshade->stage );
2780d4ece4c5a243dc4b684331bad49f220311e5520Keith Whitwell
2790d4ece4c5a243dc4b684331bad49f220311e5520Keith Whitwell   return NULL;
2808e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell}
2818e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell
2828e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell
283