From a148cc51fbe56266199057cfde2abb2b59eb8713 Mon Sep 17 00:00:00 2001 From: Brian Date: Fri, 25 Jan 2008 08:15:04 -0700 Subject: gallium: optimizations to flatshade, two-side prim stages --- src/mesa/pipe/draw/draw_flatshade.c | 26 +++++++++++++++++++------- src/mesa/pipe/draw/draw_twoside.c | 31 ++++++++++++++++--------------- 2 files changed, 35 insertions(+), 22 deletions(-) (limited to 'src') diff --git a/src/mesa/pipe/draw/draw_flatshade.c b/src/mesa/pipe/draw/draw_flatshade.c index 46b0f7970f..8444c53310 100644 --- a/src/mesa/pipe/draw/draw_flatshade.c +++ b/src/mesa/pipe/draw/draw_flatshade.c @@ -70,18 +70,31 @@ static void flatshade_begin( struct draw_stage *stage ) /** Copy all the color attributes from 'src' vertex to 'dst' vertex */ -static INLINE void copy_colors( struct draw_stage *stage, - struct vertex_header *dst, +static INLINE void copy_colors( struct draw_stage *stage, + struct vertex_header *dst, const struct vertex_header *src ) { const struct flat_stage *flat = flat_stage(stage); uint i; + for (i = 0; i < flat->num_color_attribs; i++) { + const uint attr = flat->color_attribs[i]; + COPY_4FV(dst->data[attr], src->data[attr]); + } +} - /* Look for constant/flat attribs and duplicate from src to dst vertex */ - /* skip attrib[0] which is vert pos */ + +/** Copy all the color attributes from src vertex to dst0 & dst1 vertices */ +static INLINE void copy_colors2( struct draw_stage *stage, + struct vertex_header *dst0, + struct vertex_header *dst1, + const struct vertex_header *src ) +{ + const struct flat_stage *flat = flat_stage(stage); + uint i; for (i = 0; i < flat->num_color_attribs; i++) { const uint attr = flat->color_attribs[i]; - memcpy(dst->data[attr], src->data[attr], sizeof(src->data[0])); + COPY_4FV(dst0->data[attr], src->data[attr]); + COPY_4FV(dst1->data[attr], src->data[attr]); } } @@ -101,8 +114,7 @@ static void flatshade_tri( struct draw_stage *stage, tmp.v[1] = dup_vert(stage, header->v[1], 1); tmp.v[2] = header->v[2]; - copy_colors(stage, tmp.v[0], tmp.v[2]); - copy_colors(stage, tmp.v[1], tmp.v[2]); + copy_colors2(stage, tmp.v[0], tmp.v[1], tmp.v[2]); stage->next->tri( stage->next, &tmp ); } diff --git a/src/mesa/pipe/draw/draw_twoside.c b/src/mesa/pipe/draw/draw_twoside.c index da8e7bd90d..75c51ec6a9 100644 --- a/src/mesa/pipe/draw/draw_twoside.c +++ b/src/mesa/pipe/draw/draw_twoside.c @@ -75,6 +75,12 @@ static void twoside_begin( struct draw_stage *stage ) } } + if (!twoside->attrib_back0) + twoside->attrib_front0 = 0; + + if (!twoside->attrib_back1) + twoside->attrib_front1 = 0; + /* * We'll multiply the primitive's determinant by this sign to determine * if the triangle is back-facing (negative). @@ -86,28 +92,23 @@ static void twoside_begin( struct draw_stage *stage ) } -static INLINE void copy_attrib( unsigned attr_dst, - unsigned attr_src, - struct vertex_header *v ) -{ - COPY_4FV(v->data[attr_dst], v->data[attr_src]); -} - - /** * Copy back color(s) to front color(s). */ -static struct vertex_header *copy_bfc( struct twoside_stage *twoside, - const struct vertex_header *v, - unsigned idx ) +static INLINE struct vertex_header * +copy_bfc( struct twoside_stage *twoside, + const struct vertex_header *v, + unsigned idx ) { struct vertex_header *tmp = dup_vert( &twoside->stage, v, idx ); - if (twoside->attrib_front0 && twoside->attrib_back0) { - copy_attrib(twoside->attrib_front0, twoside->attrib_back0, tmp); + if (twoside->attrib_back0) { + COPY_4FV(tmp->data[twoside->attrib_front0], + tmp->data[twoside->attrib_back0]); } - if (twoside->attrib_front1 && twoside->attrib_back1) { - copy_attrib(twoside->attrib_front1, twoside->attrib_back1, tmp); + if (twoside->attrib_back1) { + COPY_4FV(tmp->data[twoside->attrib_front1], + tmp->data[twoside->attrib_back1]); } return tmp; -- cgit v1.2.3