draw_pipe_flatshade.c revision eb979cef8535914f428d2462e78f713da558fc18
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 2600d4ece4c5a243dc4b684331bad49f220311e5520Keith Whitwell if (!draw_alloc_temp_verts( &flatshade->stage, 2 )) 2610d4ece4c5a243dc4b684331bad49f220311e5520Keith Whitwell goto fail; 2628e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell 263cd3643698eafa0869a8317b002e5b066de0172e7Brian flatshade->stage.draw = draw; 264eb979cef8535914f428d2462e78f713da558fc18Keith Whitwell flatshade->stage.name = "flatshade"; 265cd3643698eafa0869a8317b002e5b066de0172e7Brian flatshade->stage.next = NULL; 266a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell flatshade->stage.point = draw_pipe_passthrough_point; 2670bfd085e2866fbbd40209dcee23f0e6240583fe8Brian flatshade->stage.line = flatshade_first_line; 2680bfd085e2866fbbd40209dcee23f0e6240583fe8Brian flatshade->stage.tri = flatshade_first_tri; 2690bfd085e2866fbbd40209dcee23f0e6240583fe8Brian flatshade->stage.flush = flatshade_flush; 270cd3643698eafa0869a8317b002e5b066de0172e7Brian flatshade->stage.reset_stipple_counter = flatshade_reset_stipple_counter; 271cd3643698eafa0869a8317b002e5b066de0172e7Brian flatshade->stage.destroy = flatshade_destroy; 2728e4a95a93d15a6707a29454cd47e10b08314cda2Keith Whitwell 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