Cell: make 'setup' a regular var instead of passing around a pointer everywhere
authorBrian <brian.paul@tungstengraphics.com>
Wed, 30 Jan 2008 19:08:23 +0000 (12:08 -0700)
committerBen Skeggs <skeggsb@gmail.com>
Fri, 15 Feb 2008 02:50:26 +0000 (13:50 +1100)
We'll never have more than one of these objects.
Avoiding pointer deref improves performance a bit.

src/mesa/pipe/cell/spu/spu_tri.c

index 01a47a48519708a3430d386d4e3d09f46bff75ee..5bb2cb12e374ecee1142e28d25e272a11a996181 100644 (file)
@@ -135,6 +135,12 @@ struct setup_stage {
 };
 
 
+
+static struct setup_stage setup;
+
+
+
+
 #if 0
 /**
  * Basically a cast wrapper.
@@ -147,33 +153,33 @@ static INLINE struct setup_stage *setup_stage( struct draw_stage *stage )
 
 #if 0
 /**
- * Clip setup->quad against the scissor/surface bounds.
+ * Clip setup.quad against the scissor/surface bounds.
  */
 static INLINE void
 quad_clip(struct setup_stage *setup)
 {
-   const struct pipe_scissor_state *cliprect = &setup->softpipe->cliprect;
+   const struct pipe_scissor_state *cliprect = &setup.softpipe->cliprect;
    const int minx = (int) cliprect->minx;
    const int maxx = (int) cliprect->maxx;
    const int miny = (int) cliprect->miny;
    const int maxy = (int) cliprect->maxy;
 
-   if (setup->quad.x0 >= maxx ||
-       setup->quad.y0 >= maxy ||
-       setup->quad.x0 + 1 < minx ||
-       setup->quad.y0 + 1 < miny) {
+   if (setup.quad.x0 >= maxx ||
+       setup.quad.y0 >= maxy ||
+       setup.quad.x0 + 1 < minx ||
+       setup.quad.y0 + 1 < miny) {
       /* totally clipped */
-      setup->quad.mask = 0x0;
+      setup.quad.mask = 0x0;
       return;
    }
-   if (setup->quad.x0 < minx)
-      setup->quad.mask &= (MASK_BOTTOM_RIGHT | MASK_TOP_RIGHT);
-   if (setup->quad.y0 < miny)
-      setup->quad.mask &= (MASK_BOTTOM_LEFT | MASK_BOTTOM_RIGHT);
-   if (setup->quad.x0 == maxx - 1)
-      setup->quad.mask &= (MASK_BOTTOM_LEFT | MASK_TOP_LEFT);
-   if (setup->quad.y0 == maxy - 1)
-      setup->quad.mask &= (MASK_TOP_LEFT | MASK_TOP_RIGHT);
+   if (setup.quad.x0 < minx)
+      setup.quad.mask &= (MASK_BOTTOM_RIGHT | MASK_TOP_RIGHT);
+   if (setup.quad.y0 < miny)
+      setup.quad.mask &= (MASK_BOTTOM_LEFT | MASK_BOTTOM_RIGHT);
+   if (setup.quad.x0 == maxx - 1)
+      setup.quad.mask &= (MASK_BOTTOM_LEFT | MASK_TOP_LEFT);
+   if (setup.quad.y0 == maxy - 1)
+      setup.quad.mask &= (MASK_TOP_LEFT | MASK_TOP_RIGHT);
 }
 #endif
 
@@ -185,9 +191,9 @@ static INLINE void
 clip_emit_quad(struct setup_stage *setup)
 {
    quad_clip(setup);
-   if (setup->quad.mask) {
-      struct softpipe_context *sp = setup->softpipe;
-      sp->quad.first->run(sp->quad.first, &setup->quad);
+   if (setup.quad.mask) {
+      struct softpipe_context *sp = setup.softpipe;
+      sp->quad.first->run(sp->quad.first, &setup.quad);
    }
 }
 #endif
@@ -198,8 +204,7 @@ clip_emit_quad(struct setup_stage *setup)
  * Eg: four colors will be compute.
  */
 static INLINE void
-eval_coeff( struct setup_stage *setup, uint slot,
-            float x, float y, float result[4][4])
+eval_coeff(uint slot, float x, float y, float result[4][4])
 {
    switch (spu.vertex_info.interp_mode[slot]) {
    case INTERP_CONSTANT:
@@ -209,7 +214,7 @@ eval_coeff( struct setup_stage *setup, uint slot,
             result[QUAD_TOP_LEFT][i] =
             result[QUAD_TOP_RIGHT][i] =
             result[QUAD_BOTTOM_LEFT][i] =
-            result[QUAD_BOTTOM_RIGHT][i] = setup->coef[slot].a0[i];
+            result[QUAD_BOTTOM_RIGHT][i] = setup.coef[slot].a0[i];
          }
       }
       break;
@@ -219,12 +224,12 @@ eval_coeff( struct setup_stage *setup, uint slot,
    default:
       {
          uint i;
-         const float *dadx = setup->coef[slot].dadx;
-         const float *dady = setup->coef[slot].dady;
+         const float *dadx = setup.coef[slot].dadx;
+         const float *dady = setup.coef[slot].dady;
 
          /* loop over XYZW comps */
          for (i = 0; i < 4; i++) {
-            result[QUAD_TOP_LEFT][i] = setup->coef[slot].a0[i] + x * dadx[i] + y * dady[i];
+            result[QUAD_TOP_LEFT][i] = setup.coef[slot].a0[i] + x * dadx[i] + y * dady[i];
             result[QUAD_TOP_RIGHT][i] = result[0][i] + dadx[i];
             result[QUAD_BOTTOM_LEFT][i] = result[0][i] + dady[i];
             result[QUAD_BOTTOM_RIGHT][i] = result[0][i] + dadx[i] + dady[i];
@@ -235,15 +240,14 @@ eval_coeff( struct setup_stage *setup, uint slot,
 
 
 static INLINE void
-eval_z( struct setup_stage *setup,
-        float x, float y, float result[4])
+eval_z(float x, float y, float result[4])
 {
    const uint slot = 0;
    const uint i = 2;
-   const float *dadx = setup->coef[slot].dadx;
-   const float *dady = setup->coef[slot].dady;
+   const float *dadx = setup.coef[slot].dadx;
+   const float *dady = setup.coef[slot].dady;
 
-   result[QUAD_TOP_LEFT] = setup->coef[slot].a0[i] + x * dadx[i] + y * dady[i];
+   result[QUAD_TOP_LEFT] = setup.coef[slot].a0[i] + x * dadx[i] + y * dady[i];
    result[QUAD_TOP_RIGHT] = result[0] + dadx[i];
    result[QUAD_BOTTOM_LEFT] = result[0] + dady[i];
    result[QUAD_BOTTOM_RIGHT] = result[0] + dadx[i] + dady[i];
@@ -266,23 +270,23 @@ pack_color(const float color[4])
 
 
 static uint
-do_depth_test(struct setup_stage *setup, int x, int y, unsigned mask)
+do_depth_test(int x, int y, unsigned mask)
 {
-   int ix = x - setup->cliprect_minx;
-   int iy = y - setup->cliprect_miny;
+   int ix = x - setup.cliprect_minx;
+   int iy = y - setup.cliprect_miny;
    float zvals[4];
 
-   eval_z(setup, (float) x, (float) y, zvals);
+   eval_z((float) x, (float) y, zvals);
 
-   if (tile_status_z[setup->ty][setup->tx] == TILE_STATUS_CLEAR) {
+   if (tile_status_z[setup.ty][setup.tx] == TILE_STATUS_CLEAR) {
       /* now, _really_ clear the tile */
       clear_z_tile(&ztile);
    }
-   else if (tile_status_z[setup->ty][setup->tx] != TILE_STATUS_DIRTY) {
+   else if (tile_status_z[setup.ty][setup.tx] != TILE_STATUS_DIRTY) {
       /* make sure we've got the tile from main mem */
       wait_on_mask(1 << TAG_READ_TILE_Z);
    }
-   tile_status_z[setup->ty][setup->tx] = TILE_STATUS_DIRTY;
+   tile_status_z[setup.ty][setup.tx] = TILE_STATUS_DIRTY;
 
 
    if (spu.fb.depth_format == PIPE_FORMAT_Z16_UNORM) {
@@ -363,31 +367,31 @@ do_depth_test(struct setup_stage *setup, int x, int y, unsigned mask)
  * Emit a quad (pass to next stage).  No clipping is done.
  */
 static INLINE void
-emit_quad( struct setup_stage *setup, int x, int y, unsigned mask )
+emit_quad( int x, int y, unsigned mask )
 {
 #if 0
-   struct softpipe_context *sp = setup->softpipe;
-   setup->quad.x0 = x;
-   setup->quad.y0 = y;
-   setup->quad.mask = mask;
-   sp->quad.first->run(sp->quad.first, &setup->quad);
+   struct softpipe_context *sp = setup.softpipe;
+   setup.quad.x0 = x;
+   setup.quad.y0 = y;
+   setup.quad.mask = mask;
+   sp->quad.first->run(sp->quad.first, &setup.quad);
 #else
    /* Cell: "write" quad fragments to the tile by setting prim color */
-   const int ix = x - setup->cliprect_minx;
-   const int iy = y - setup->cliprect_miny;
+   const int ix = x - setup.cliprect_minx;
+   const int iy = y - setup.cliprect_miny;
    uint colors[4];  /* indexed by QUAD_x */
 
    if (spu.texture.start) {
       float texcoords[4][4];
       uint i;
-      eval_coeff(setup, 2, (float) x, (float) y, texcoords);
+      eval_coeff(2, (float) x, (float) y, texcoords);
       for (i = 0; i < 4; i++) {
          colors[i] = sample_texture(texcoords[i]);
       }
    }
    else {
       float fcolors[4][4];
-      eval_coeff(setup, 1, (float) x, (float) y, fcolors);
+      eval_coeff(1, (float) x, (float) y, fcolors);
       colors[QUAD_TOP_LEFT] = pack_color(fcolors[QUAD_TOP_LEFT]);
       colors[QUAD_TOP_RIGHT] = pack_color(fcolors[QUAD_TOP_RIGHT]);
       colors[QUAD_BOTTOM_LEFT] = pack_color(fcolors[QUAD_BOTTOM_LEFT]);
@@ -395,19 +399,19 @@ emit_quad( struct setup_stage *setup, int x, int y, unsigned mask )
    }
 
    if (spu.depth_stencil.depth.enabled) {
-      mask &= do_depth_test(setup, x, y, mask);
+      mask &= do_depth_test(x, y, mask);
    }
 
    if (mask) {
-      if (tile_status[setup->ty][setup->tx] == TILE_STATUS_CLEAR) {
+      if (tile_status[setup.ty][setup.tx] == TILE_STATUS_CLEAR) {
          /* now, _really_ clear the tile */
          clear_c_tile(&ctile);
       }
-      else if (tile_status[setup->ty][setup->tx] != TILE_STATUS_DIRTY) {
+      else if (tile_status[setup.ty][setup.tx] != TILE_STATUS_DIRTY) {
          /* make sure we've got the tile from main mem */
          wait_on_mask(1 << TAG_READ_TILE_COLOR);
       }
-      tile_status[setup->ty][setup->tx] = TILE_STATUS_DIRTY;
+      tile_status[setup.ty][setup.tx] = TILE_STATUS_DIRTY;
 
       if (mask & MASK_TOP_LEFT)
          ctile.t32[iy][ix] = colors[QUAD_TOP_LEFT];
@@ -439,20 +443,20 @@ static INLINE int block( int x )
  * this is pretty nasty...  may need to rework flush_spans again to
  * fix it, if possible.
  */
-static unsigned calculate_mask( struct setup_stage *setup, int x )
+static unsigned calculate_mask( int x )
 {
    unsigned mask = 0x0;
 
-   if (x >= setup->span.left[0] && x < setup->span.right[0]) 
+   if (x >= setup.span.left[0] && x < setup.span.right[0]) 
       mask |= MASK_TOP_LEFT;
 
-   if (x >= setup->span.left[1] && x < setup->span.right[1]) 
+   if (x >= setup.span.left[1] && x < setup.span.right[1]) 
       mask |= MASK_BOTTOM_LEFT;
       
-   if (x+1 >= setup->span.left[0] && x+1 < setup->span.right[0]) 
+   if (x+1 >= setup.span.left[0] && x+1 < setup.span.right[0]) 
       mask |= MASK_TOP_RIGHT;
 
-   if (x+1 >= setup->span.left[1] && x+1 < setup->span.right[1]) 
+   if (x+1 >= setup.span.left[1] && x+1 < setup.span.right[1]) 
       mask |= MASK_BOTTOM_RIGHT;
 
    return mask;
@@ -462,28 +466,28 @@ static unsigned calculate_mask( struct setup_stage *setup, int x )
 /**
  * Render a horizontal span of quads
  */
-static void flush_spans( struct setup_stage *setup )
+static void flush_spans( void )
 {
    int minleft, maxright;
    int x;
 
-   switch (setup->span.y_flags) {
+   switch (setup.span.y_flags) {
    case 0x3:
       /* both odd and even lines written (both quad rows) */
-      minleft = MIN2(setup->span.left[0], setup->span.left[1]);
-      maxright = MAX2(setup->span.right[0], setup->span.right[1]);
+      minleft = MIN2(setup.span.left[0], setup.span.left[1]);
+      maxright = MAX2(setup.span.right[0], setup.span.right[1]);
       break;
 
    case 0x1:
       /* only even line written (quad top row) */
-      minleft = setup->span.left[0];
-      maxright = setup->span.right[0];
+      minleft = setup.span.left[0];
+      maxright = setup.span.right[0];
       break;
 
    case 0x2:
       /* only odd line written (quad bottom row) */
-      minleft = setup->span.left[1];
-      maxright = setup->span.right[1];
+      minleft = setup.span.left[1];
+      maxright = setup.span.right[1];
       break;
 
    default:
@@ -494,31 +498,29 @@ static void flush_spans( struct setup_stage *setup )
     * calculate_mask() could be simplified a bit...
     */
    for (x = block(minleft); x <= block(maxright); x += 2) {
-      emit_quad( setup, x, setup->span.y, 
-                 calculate_mask( setup, x ) );
+      emit_quad( x, setup.span.y, 
+                 calculate_mask( x ) );
    }
 
-   setup->span.y = 0;
-   setup->span.y_flags = 0;
-   setup->span.right[0] = 0;
-   setup->span.right[1] = 0;
+   setup.span.y = 0;
+   setup.span.y_flags = 0;
+   setup.span.right[0] = 0;
+   setup.span.right[1] = 0;
 }
 
 #if DEBUG_VERTS
-static void print_vertex(const struct setup_stage *setup,
-                         const struct vertex_header *v)
+static void print_vertex(const struct vertex_header *v)
 {
    int i;
    fprintf(stderr, "Vertex: (%p)\n", v);
-   for (i = 0; i < setup->quad.nr_attrs; i++) {
+   for (i = 0; i < setup.quad.nr_attrs; i++) {
       fprintf(stderr, "  %d: %f %f %f %f\n",  i, 
               v->data[i][0], v->data[i][1], v->data[i][2], v->data[i][3]);
    }
 }
 #endif
 
-static boolean setup_sort_vertices( struct setup_stage *setup,
-                                     const struct prim_header *prim )
+static boolean setup_sort_vertices(const struct prim_header *prim )
 {
    const struct vertex_header *v0 = prim->v[0];
    const struct vertex_header *v1 = prim->v[1];
@@ -526,12 +528,12 @@ static boolean setup_sort_vertices( struct setup_stage *setup,
 
 #if DEBUG_VERTS
    fprintf(stderr, "Triangle:\n");
-   print_vertex(setup, v0);
-   print_vertex(setup, v1);
-   print_vertex(setup, v2);
+   print_vertex(v0);
+   print_vertex(v1);
+   print_vertex(v2);
 #endif
 
-   setup->vprovoke = v2;
+   setup.vprovoke = v2;
 
    /* determine bottom to top order of vertices */
    {
@@ -541,65 +543,65 @@ static boolean setup_sort_vertices( struct setup_stage *setup,
       if (y0 <= y1) {
         if (y1 <= y2) {
            /* y0<=y1<=y2 */
-           setup->vmin = v0;   
-           setup->vmid = v1;   
-           setup->vmax = v2;
+           setup.vmin = v0;   
+           setup.vmid = v1;   
+           setup.vmax = v2;
         }
         else if (y2 <= y0) {
            /* y2<=y0<=y1 */
-           setup->vmin = v2;   
-           setup->vmid = v0;   
-           setup->vmax = v1;   
+           setup.vmin = v2;   
+           setup.vmid = v0;   
+           setup.vmax = v1;   
         }
         else {
            /* y0<=y2<=y1 */
-           setup->vmin = v0;   
-           setup->vmid = v2;   
-           setup->vmax = v1;  
+           setup.vmin = v0;   
+           setup.vmid = v2;   
+           setup.vmax = v1;  
         }
       }
       else {
         if (y0 <= y2) {
            /* y1<=y0<=y2 */
-           setup->vmin = v1;   
-           setup->vmid = v0;   
-           setup->vmax = v2;  
+           setup.vmin = v1;   
+           setup.vmid = v0;   
+           setup.vmax = v2;  
         }
         else if (y2 <= y1) {
            /* y2<=y1<=y0 */
-           setup->vmin = v2;   
-           setup->vmid = v1;   
-           setup->vmax = v0;  
+           setup.vmin = v2;   
+           setup.vmid = v1;   
+           setup.vmax = v0;  
         }
         else {
            /* y1<=y2<=y0 */
-           setup->vmin = v1;   
-           setup->vmid = v2;   
-           setup->vmax = v0;
+           setup.vmin = v1;   
+           setup.vmid = v2;   
+           setup.vmax = v0;
         }
       }
    }
 
    /* Check if triangle is completely outside the tile bounds */
-   if (setup->vmin->data[0][1] > setup->cliprect_maxy)
+   if (setup.vmin->data[0][1] > setup.cliprect_maxy)
       return FALSE;
-   if (setup->vmax->data[0][1] < setup->cliprect_miny)
+   if (setup.vmax->data[0][1] < setup.cliprect_miny)
       return FALSE;
-   if (setup->vmin->data[0][0] < setup->cliprect_minx &&
-       setup->vmid->data[0][0] < setup->cliprect_minx &&
-       setup->vmax->data[0][0] < setup->cliprect_minx)
+   if (setup.vmin->data[0][0] < setup.cliprect_minx &&
+       setup.vmid->data[0][0] < setup.cliprect_minx &&
+       setup.vmax->data[0][0] < setup.cliprect_minx)
       return FALSE;
-   if (setup->vmin->data[0][0] > setup->cliprect_maxx &&
-       setup->vmid->data[0][0] > setup->cliprect_maxx &&
-       setup->vmax->data[0][0] > setup->cliprect_maxx)
+   if (setup.vmin->data[0][0] > setup.cliprect_maxx &&
+       setup.vmid->data[0][0] > setup.cliprect_maxx &&
+       setup.vmax->data[0][0] > setup.cliprect_maxx)
       return FALSE;
 
-   setup->ebot.dx = setup->vmid->data[0][0] - setup->vmin->data[0][0];
-   setup->ebot.dy = setup->vmid->data[0][1] - setup->vmin->data[0][1];
-   setup->emaj.dx = setup->vmax->data[0][0] - setup->vmin->data[0][0];
-   setup->emaj.dy = setup->vmax->data[0][1] - setup->vmin->data[0][1];
-   setup->etop.dx = setup->vmax->data[0][0] - setup->vmid->data[0][0];
-   setup->etop.dy = setup->vmax->data[0][1] - setup->vmid->data[0][1];
+   setup.ebot.dx = setup.vmid->data[0][0] - setup.vmin->data[0][0];
+   setup.ebot.dy = setup.vmid->data[0][1] - setup.vmin->data[0][1];
+   setup.emaj.dx = setup.vmax->data[0][0] - setup.vmin->data[0][0];
+   setup.emaj.dy = setup.vmax->data[0][1] - setup.vmin->data[0][1];
+   setup.etop.dx = setup.vmax->data[0][0] - setup.vmid->data[0][0];
+   setup.etop.dy = setup.vmax->data[0][1] - setup.vmid->data[0][1];
 
    /*
     * Compute triangle's area.  Use 1/area to compute partial
@@ -612,13 +614,13 @@ static boolean setup_sort_vertices( struct setup_stage *setup,
     * use the prim->det value because its sign is correct.
     */
    {
-      const float area = (setup->emaj.dx * setup->ebot.dy - 
-                           setup->ebot.dx * setup->emaj.dy);
+      const float area = (setup.emaj.dx * setup.ebot.dy - 
+                           setup.ebot.dx * setup.emaj.dy);
 
-      setup->oneoverarea = 1.0f / area;
+      setup.oneoverarea = 1.0f / area;
       /*
       _mesa_printf("%s one-over-area %f  area %f  det %f\n",
-                   __FUNCTION__, setup->oneoverarea, area, prim->det );
+                   __FUNCTION__, setup.oneoverarea, area, prim->det );
       */
    }
 
@@ -627,7 +629,7 @@ static boolean setup_sort_vertices( struct setup_stage *setup,
     *  - the GLSL gl_FrontFacing fragment attribute (bool)
     *  - two-sided stencil test
     */
-   setup->quad.facing = (prim->det > 0.0) ^ (setup->softpipe->rasterizer->front_winding == PIPE_WINDING_CW);
+   setup.quad.facing = (prim->det > 0.0) ^ (setup.softpipe->rasterizer->front_winding == PIPE_WINDING_CW);
 #endif
 
    return TRUE;
@@ -637,22 +639,22 @@ static boolean setup_sort_vertices( struct setup_stage *setup,
 /**
  * Compute a0 for a constant-valued coefficient (GL_FLAT shading).
  * The value value comes from vertex->data[slot][i].
- * The result will be put into setup->coef[slot].a0[i].
+ * The result will be put into setup.coef[slot].a0[i].
  * \param slot  which attribute slot 
  * \param i  which component of the slot (0..3)
  */
-static void const_coeff(struct setup_stage *setup, uint slot)
+static void const_coeff(uint slot)
 {
    uint i;
    ASSERT(slot < PIPE_MAX_SHADER_INPUTS);
 
    for (i = 0; i < 4; i++) {
-      setup->coef[slot].dadx[i] = 0;
-      setup->coef[slot].dady[i] = 0;
+      setup.coef[slot].dadx[i] = 0;
+      setup.coef[slot].dady[i] = 0;
 
       /* need provoking vertex info!
        */
-      setup->coef[slot].a0[i] = setup->vprovoke->data[slot][i];
+      setup.coef[slot].a0[i] = setup.vprovoke->data[slot][i];
    }
 }
 
@@ -661,20 +663,19 @@ static void const_coeff(struct setup_stage *setup, uint slot)
  * Compute a0, dadx and dady for a linearly interpolated coefficient,
  * for a triangle.
  */
-static void tri_linear_coeff( struct setup_stage *setup,
-                              uint slot, uint firstComp, uint lastComp )
+static void tri_linear_coeff( uint slot, uint firstComp, uint lastComp )
 {
    uint i;
    for (i = firstComp; i < lastComp; i++) {
-      float botda = setup->vmid->data[slot][i] - setup->vmin->data[slot][i];
-      float majda = setup->vmax->data[slot][i] - setup->vmin->data[slot][i];
-      float a = setup->ebot.dy * majda - botda * setup->emaj.dy;
-      float b = setup->emaj.dx * botda - majda * setup->ebot.dx;
+      float botda = setup.vmid->data[slot][i] - setup.vmin->data[slot][i];
+      float majda = setup.vmax->data[slot][i] - setup.vmin->data[slot][i];
+      float a = setup.ebot.dy * majda - botda * setup.emaj.dy;
+      float b = setup.emaj.dx * botda - majda * setup.ebot.dx;
    
       ASSERT(slot < PIPE_MAX_SHADER_INPUTS);
 
-      setup->coef[slot].dadx[i] = a * setup->oneoverarea;
-      setup->coef[slot].dady[i] = b * setup->oneoverarea;
+      setup.coef[slot].dadx[i] = a * setup.oneoverarea;
+      setup.coef[slot].dady[i] = b * setup.oneoverarea;
 
       /* calculate a0 as the value which would be sampled for the
        * fragment at (0,0), taking into account that we want to sample at
@@ -688,17 +689,17 @@ static void tri_linear_coeff( struct setup_stage *setup,
        * to define a0 as the sample at a pixel center somewhere near vmin
        * instead - i'll switch to this later.
        */
-      setup->coef[slot].a0[i] = (setup->vmin->data[slot][i] - 
-                                 (setup->coef[slot].dadx[i] * (setup->vmin->data[0][0] - 0.5f) + 
-                                  setup->coef[slot].dady[i] * (setup->vmin->data[0][1] - 0.5f)));
+      setup.coef[slot].a0[i] = (setup.vmin->data[slot][i] - 
+                                 (setup.coef[slot].dadx[i] * (setup.vmin->data[0][0] - 0.5f) + 
+                                  setup.coef[slot].dady[i] * (setup.vmin->data[0][1] - 0.5f)));
    }
 
    /*
    _mesa_printf("attr[%d].%c: %f dx:%f dy:%f\n",
                slot, "xyzw"[i], 
-               setup->coef[slot].a0[i],
-               setup->coef[slot].dadx[i],
-               setup->coef[slot].dady[i]);
+               setup.coef[slot].a0[i],
+               setup.coef[slot].dadx[i],
+               setup.coef[slot].dady[i]);
    */
 }
 
@@ -712,46 +713,45 @@ static void tri_linear_coeff( struct setup_stage *setup,
  * Later, when we compute the value at a particular fragment position we'll
  * divide the interpolated value by the interpolated W at that fragment.
  */
-static void tri_persp_coeff( struct setup_stage *setup,
-                             unsigned slot,
+static void tri_persp_coeff( unsigned slot,
                              unsigned i )
 {
    /* premultiply by 1/w:
     */
-   float mina = setup->vmin->data[slot][i] * setup->vmin->data[0][3];
-   float mida = setup->vmid->data[slot][i] * setup->vmid->data[0][3];
-   float maxa = setup->vmax->data[slot][i] * setup->vmax->data[0][3];
+   float mina = setup.vmin->data[slot][i] * setup.vmin->data[0][3];
+   float mida = setup.vmid->data[slot][i] * setup.vmid->data[0][3];
+   float maxa = setup.vmax->data[slot][i] * setup.vmax->data[0][3];
 
    float botda = mida - mina;
    float majda = maxa - mina;
-   float a = setup->ebot.dy * majda - botda * setup->emaj.dy;
-   float b = setup->emaj.dx * botda - majda * setup->ebot.dx;
+   float a = setup.ebot.dy * majda - botda * setup.emaj.dy;
+   float b = setup.emaj.dx * botda - majda * setup.ebot.dx;
       
    /*
    printf("tri persp %d,%d: %f %f %f\n", slot, i,
-          setup->vmin->data[slot][i],
-          setup->vmid->data[slot][i],
-          setup->vmax->data[slot][i]
+          setup.vmin->data[slot][i],
+          setup.vmid->data[slot][i],
+          setup.vmax->data[slot][i]
           );
    */
 
    assert(slot < PIPE_MAX_SHADER_INPUTS);
    assert(i <= 3);
 
-   setup->coef[slot].dadx[i] = a * setup->oneoverarea;
-   setup->coef[slot].dady[i] = b * setup->oneoverarea;
-   setup->coef[slot].a0[i] = (mina - 
-                           (setup->coef[slot].dadx[i] * (setup->vmin->data[0][0] - 0.5f) + 
-                            setup->coef[slot].dady[i] * (setup->vmin->data[0][1] - 0.5f)));
+   setup.coef[slot].dadx[i] = a * setup.oneoverarea;
+   setup.coef[slot].dady[i] = b * setup.oneoverarea;
+   setup.coef[slot].a0[i] = (mina - 
+                           (setup.coef[slot].dadx[i] * (setup.vmin->data[0][0] - 0.5f) + 
+                            setup.coef[slot].dady[i] * (setup.vmin->data[0][1] - 0.5f)));
 }
 #endif
 
 
 /**
- * Compute the setup->coef[] array dadx, dady, a0 values.
- * Must be called after setup->vmin,vmid,vmax,vprovoke are initialized.
+ * Compute the setup.coef[] array dadx, dady, a0 values.
+ * Must be called after setup.vmin,vmid,vmax,vprovoke are initialized.
  */
-static void setup_tri_coefficients( struct setup_stage *setup )
+static void setup_tri_coefficients(void)
 {
 #if 1
    uint i;
@@ -761,17 +761,17 @@ static void setup_tri_coefficients( struct setup_stage *setup )
       case INTERP_NONE:
          break;
       case INTERP_POS:
-         tri_linear_coeff(setup, i, 2, 3);
+         tri_linear_coeff(i, 2, 3);
          /* XXX interp W if PERSPECTIVE... */
          break;
       case INTERP_CONSTANT:
-         const_coeff(setup, i);
+         const_coeff(i);
          break;
       case INTERP_LINEAR:
-         tri_linear_coeff(setup, i, 0, 4);
+         tri_linear_coeff(i, 0, 4);
          break;
       case INTERP_PERSPECTIVE:
-         tri_linear_coeff(setup, i, 0, 4); /* XXX temporary */
+         tri_linear_coeff(i, 0, 4); /* XXX temporary */
          break;
       default:
          ASSERT(0);
@@ -781,35 +781,35 @@ static void setup_tri_coefficients( struct setup_stage *setup )
    ASSERT(spu.vertex_info.interp_mode[0] == INTERP_POS);
    ASSERT(spu.vertex_info.interp_mode[1] == INTERP_LINEAR ||
           spu.vertex_info.interp_mode[1] == INTERP_CONSTANT);
-   tri_linear_coeff(setup, 0, 2, 3);  /* slot 0, z */
-   tri_linear_coeff(setup, 1, 0, 4);  /* slot 1, color */
+   tri_linear_coeff(0, 2, 3);  /* slot 0, z */
+   tri_linear_coeff(1, 0, 4);  /* slot 1, color */
 #endif
 }
 
 
-static void setup_tri_edges( struct setup_stage *setup )
+static void setup_tri_edges(void)
 {
-   float vmin_x = setup->vmin->data[0][0] + 0.5f;
-   float vmid_x = setup->vmid->data[0][0] + 0.5f;
-
-   float vmin_y = setup->vmin->data[0][1] - 0.5f;
-   float vmid_y = setup->vmid->data[0][1] - 0.5f;
-   float vmax_y = setup->vmax->data[0][1] - 0.5f;
-
-   setup->emaj.sy = CEILF(vmin_y);
-   setup->emaj.lines = (int) CEILF(vmax_y - setup->emaj.sy);
-   setup->emaj.dxdy = setup->emaj.dx / setup->emaj.dy;
-   setup->emaj.sx = vmin_x + (setup->emaj.sy - vmin_y) * setup->emaj.dxdy;
-
-   setup->etop.sy = CEILF(vmid_y);
-   setup->etop.lines = (int) CEILF(vmax_y - setup->etop.sy);
-   setup->etop.dxdy = setup->etop.dx / setup->etop.dy;
-   setup->etop.sx = vmid_x + (setup->etop.sy - vmid_y) * setup->etop.dxdy;
-
-   setup->ebot.sy = CEILF(vmin_y);
-   setup->ebot.lines = (int) CEILF(vmid_y - setup->ebot.sy);
-   setup->ebot.dxdy = setup->ebot.dx / setup->ebot.dy;
-   setup->ebot.sx = vmin_x + (setup->ebot.sy - vmin_y) * setup->ebot.dxdy;
+   float vmin_x = setup.vmin->data[0][0] + 0.5f;
+   float vmid_x = setup.vmid->data[0][0] + 0.5f;
+
+   float vmin_y = setup.vmin->data[0][1] - 0.5f;
+   float vmid_y = setup.vmid->data[0][1] - 0.5f;
+   float vmax_y = setup.vmax->data[0][1] - 0.5f;
+
+   setup.emaj.sy = CEILF(vmin_y);
+   setup.emaj.lines = (int) CEILF(vmax_y - setup.emaj.sy);
+   setup.emaj.dxdy = setup.emaj.dx / setup.emaj.dy;
+   setup.emaj.sx = vmin_x + (setup.emaj.sy - vmin_y) * setup.emaj.dxdy;
+
+   setup.etop.sy = CEILF(vmid_y);
+   setup.etop.lines = (int) CEILF(vmax_y - setup.etop.sy);
+   setup.etop.dxdy = setup.etop.dx / setup.etop.dy;
+   setup.etop.sx = vmid_x + (setup.etop.sy - vmid_y) * setup.etop.dxdy;
+
+   setup.ebot.sy = CEILF(vmin_y);
+   setup.ebot.lines = (int) CEILF(vmid_y - setup.ebot.sy);
+   setup.ebot.dxdy = setup.ebot.dx / setup.ebot.dy;
+   setup.ebot.sx = vmin_x + (setup.ebot.sy - vmin_y) * setup.ebot.dxdy;
 }
 
 
@@ -817,15 +817,14 @@ static void setup_tri_edges( struct setup_stage *setup )
  * Render the upper or lower half of a triangle.
  * Scissoring/cliprect is applied here too.
  */
-static void subtriangle( struct setup_stage *setup,
-                        struct edge *eleft,
+static void subtriangle( struct edge *eleft,
                         struct edge *eright,
                         unsigned lines )
 {
-   const int minx = setup->cliprect_minx;
-   const int maxx = setup->cliprect_maxx;
-   const int miny = setup->cliprect_miny;
-   const int maxy = setup->cliprect_maxy;
+   const int minx = setup.cliprect_minx;
+   const int maxx = setup.cliprect_maxx;
+   const int miny = setup.cliprect_miny;
+   const int maxy = setup.cliprect_maxy;
    int y, start_y, finish_y;
    int sy = (int)eleft->sy;
 
@@ -867,14 +866,14 @@ static void subtriangle( struct setup_stage *setup,
 
       if (left < right) {
          int _y = sy + y;
-         if (block(_y) != setup->span.y) {
-            flush_spans(setup);
-            setup->span.y = block(_y);
+         if (block(_y) != setup.span.y) {
+            flush_spans();
+            setup.span.y = block(_y);
          }
 
-         setup->span.left[_y&1] = left;
-         setup->span.right[_y&1] = right;
-         setup->span.y_flags |= 1<<(_y&1);
+         setup.span.left[_y&1] = left;
+         setup.span.right[_y&1] = right;
+         setup.span.y_flags |= 1<<(_y&1);
       }
    }
 
@@ -892,41 +891,41 @@ static void subtriangle( struct setup_stage *setup,
  * Do setup for triangle rasterization, then render the triangle.
  */
 static void
-setup_tri(struct setup_stage *setup, struct prim_header *prim)
+setup_tri(struct prim_header *prim)
 {
-   if (!setup_sort_vertices( setup, prim )) {
+   if (!setup_sort_vertices( prim )) {
       return; /* totally clipped */
    }
 
-   setup_tri_coefficients( setup );
-   setup_tri_edges( setup );
+   setup_tri_coefficients();
+   setup_tri_edges();
 
 #if 0
-   setup->quad.prim = PRIM_TRI;
+   setup.quad.prim = PRIM_TRI;
 #endif
 
-   setup->span.y = 0;
-   setup->span.y_flags = 0;
-   setup->span.right[0] = 0;
-   setup->span.right[1] = 0;
-   /*   setup->span.z_mode = tri_z_mode( setup->ctx ); */
+   setup.span.y = 0;
+   setup.span.y_flags = 0;
+   setup.span.right[0] = 0;
+   setup.span.right[1] = 0;
+   /*   setup.span.z_mode = tri_z_mode( setup.ctx ); */
 
    /*   init_constant_attribs( setup ); */
       
-   if (setup->oneoverarea < 0.0) {
+   if (setup.oneoverarea < 0.0) {
       /* emaj on left:
        */
-      subtriangle( setup, &setup->emaj, &setup->ebot, setup->ebot.lines );
-      subtriangle( setup, &setup->emaj, &setup->etop, setup->etop.lines );
+      subtriangle( &setup.emaj, &setup.ebot, setup.ebot.lines );
+      subtriangle( &setup.emaj, &setup.etop, setup.etop.lines );
    }
    else {
       /* emaj on right:
        */
-      subtriangle( setup, &setup->ebot, &setup->emaj, setup->ebot.lines );
-      subtriangle( setup, &setup->etop, &setup->emaj, setup->etop.lines );
+      subtriangle( &setup.ebot, &setup.emaj, setup.ebot.lines );
+      subtriangle( &setup.etop, &setup.emaj, setup.etop.lines );
    }
 
-   flush_spans( setup );
+   flush_spans();
 }
 
 
@@ -939,7 +938,7 @@ void
 tri_draw(const float *v0, const float *v1, const float *v2, uint tx, uint ty)
 {
    struct prim_header tri;
-   struct setup_stage setup;
+   /*struct setup_stage setup;*/
 
    tri.v[0] = (struct vertex_header *) v0;
    tri.v[1] = (struct vertex_header *) v1;
@@ -954,5 +953,5 @@ tri_draw(const float *v0, const float *v1, const float *v2, uint tx, uint ty)
    setup.cliprect_maxx = (tx + 1) * TILE_SIZE;
    setup.cliprect_maxy = (ty + 1) * TILE_SIZE;
 
-   setup_tri(&setup, &tri);
+   setup_tri(&tri);
 }