gallium: optimizations to flatshade, two-side prim stages
authorBrian <brian.paul@tungstengraphics.com>
Fri, 25 Jan 2008 15:15:04 +0000 (08:15 -0700)
committerBrian <brian.paul@tungstengraphics.com>
Fri, 25 Jan 2008 15:15:50 +0000 (08:15 -0700)
src/mesa/pipe/draw/draw_flatshade.c
src/mesa/pipe/draw/draw_twoside.c

index 46b0f7970fda1b045435ae65b8e8ad5f43a8ff13..8444c53310648749542cce2eff69028965505a42 100644 (file)
@@ -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 );
 }
index da8e7bd90dfd10c43a207193154e907c9b2f20e7..75c51ec6a909ef880b70efa5afb854aa6649c784 100644 (file)
@@ -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;