Mesa (lp-binning): llvmpipe: use new lp_setup_get_current_bins() function

Brian Paul brianp at kemper.freedesktop.org
Thu Dec 10 13:56:52 PST 2009


Module: Mesa
Branch: lp-binning
Commit: 22b07b8be4c2939b00e10f17fa91e68682808594
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=22b07b8be4c2939b00e10f17fa91e68682808594

Author: Brian Paul <brianp at vmware.com>
Date:   Wed Dec  9 12:28:54 2009 -0700

llvmpipe: use new lp_setup_get_current_bins() function

This stub function will interface to the queue system...

---

 src/gallium/drivers/llvmpipe/lp_setup.c         |   46 +++++++++++++++-------
 src/gallium/drivers/llvmpipe/lp_setup_context.h |    3 +-
 src/gallium/drivers/llvmpipe/lp_setup_tri.c     |   20 +++++----
 3 files changed, 44 insertions(+), 25 deletions(-)

diff --git a/src/gallium/drivers/llvmpipe/lp_setup.c b/src/gallium/drivers/llvmpipe/lp_setup.c
index 4935d5b..484a609 100644
--- a/src/gallium/drivers/llvmpipe/lp_setup.c
+++ b/src/gallium/drivers/llvmpipe/lp_setup.c
@@ -47,6 +47,13 @@
 static void set_state( struct setup_context *, unsigned );
 
 
+struct lp_bins *
+lp_setup_get_current_bins(struct setup_context *setup)
+{
+   /* XXX eventually get bin from queue */
+   return setup->bins;
+}
+
 
 static void
 first_triangle( struct setup_context *setup,
@@ -88,7 +95,7 @@ static void reset_context( struct setup_context *setup )
    setup->fs.stored = NULL;
    setup->dirty = ~0;
 
-   lp_reset_bins( &setup->bins );
+   lp_reset_bins( setup->bins );
 
    /* Reset some state:
     */
@@ -108,8 +115,10 @@ static void
 rasterize_bins( struct setup_context *setup,
                 boolean write_depth )
 {
+   struct lp_bins *bins = lp_setup_get_current_bins(setup);
+
    lp_rasterize_bins(setup->rast,
-                     &setup->bins,
+                     bins,
                      setup->fb,
                      write_depth);
 
@@ -123,26 +132,28 @@ rasterize_bins( struct setup_context *setup,
 static void
 begin_binning( struct setup_context *setup )
 {
+   struct lp_bins *bins = lp_setup_get_current_bins(setup);
+
    LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__);
 
    if (setup->fb->cbufs[0]) {
       if (setup->clear.flags & PIPE_CLEAR_COLOR)
-         lp_bin_everywhere( &setup->bins, 
+         lp_bin_everywhere( bins, 
                             lp_rast_clear_color, 
                             setup->clear.color );
       else
-         lp_bin_everywhere( &setup->bins,
+         lp_bin_everywhere( bins,
                             lp_rast_load_color,
                             lp_rast_arg_null() );
    }
 
    if (setup->fb->zsbuf) {
       if (setup->clear.flags & PIPE_CLEAR_DEPTHSTENCIL)
-         lp_bin_everywhere( &setup->bins, 
+         lp_bin_everywhere( bins, 
                             lp_rast_clear_zstencil, 
                             setup->clear.zstencil );
       else
-         lp_bin_everywhere( &setup->bins,
+         lp_bin_everywhere( bins,
                             lp_rast_load_zstencil,
                             lp_rast_arg_null() );
    }
@@ -215,6 +226,7 @@ void
 lp_setup_bind_framebuffer( struct setup_context *setup,
                            const struct pipe_framebuffer_state *fb )
 {
+   struct lp_bins *bins = lp_setup_get_current_bins(setup);
    unsigned tiles_x, tiles_y;
 
    LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__);
@@ -226,7 +238,7 @@ lp_setup_bind_framebuffer( struct setup_context *setup,
    tiles_x = align(setup->fb->width, TILE_SIZE) / TILE_SIZE;
    tiles_y = align(setup->fb->height, TILE_SIZE) / TILE_SIZE;
 
-   lp_bin_set_num_bins(&setup->bins, tiles_x, tiles_y);
+   lp_bin_set_num_bins(bins, tiles_x, tiles_y);
 }
 
 
@@ -237,6 +249,7 @@ lp_setup_clear( struct setup_context *setup,
                 unsigned stencil,
                 unsigned flags )
 {
+   struct lp_bins *bins = lp_setup_get_current_bins(setup);
    unsigned i;
 
    LP_DBG(DEBUG_SETUP, "%s state %d\n", __FUNCTION__, setup->state);
@@ -261,12 +274,12 @@ lp_setup_clear( struct setup_context *setup,
        * don't see that as being a common usage.
        */
       if (flags & PIPE_CLEAR_COLOR)
-         lp_bin_everywhere( &setup->bins, 
+         lp_bin_everywhere( bins, 
                             lp_rast_clear_color, 
                             setup->clear.color );
 
       if (setup->clear.flags & PIPE_CLEAR_DEPTHSTENCIL)
-         lp_bin_everywhere( &setup->bins, 
+         lp_bin_everywhere( bins, 
                             lp_rast_clear_zstencil, 
                             setup->clear.zstencil );
    }
@@ -407,6 +420,8 @@ lp_setup_is_texture_referenced( struct setup_context *setup,
 static INLINE void
 lp_setup_update_shader_state( struct setup_context *setup )
 {
+   struct lp_bins *bins = lp_setup_get_current_bins(setup);
+
    LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__);
 
    assert(setup->fs.current.jit_function);
@@ -415,7 +430,7 @@ lp_setup_update_shader_state( struct setup_context *setup )
       uint8_t *stored;
       unsigned i, j;
 
-      stored = lp_bin_alloc_aligned(&setup->bins, 4 * 16, 16);
+      stored = lp_bin_alloc_aligned(bins, 4 * 16, 16);
 
       /* smear each blend color component across 16 ubyte elements */
       for (i = 0; i < 4; ++i) {
@@ -447,7 +462,7 @@ lp_setup_update_shader_state( struct setup_context *setup )
                    current_size) != 0) {
             void *stored;
 
-            stored = lp_bin_alloc(&setup->bins, current_size);
+            stored = lp_bin_alloc(bins, current_size);
             if(stored) {
                memcpy(stored,
                       current_data,
@@ -477,7 +492,7 @@ lp_setup_update_shader_state( struct setup_context *setup )
           * and append it to the bin's setup data buffer.
           */
          struct lp_rast_state *stored =
-            (struct lp_rast_state *) lp_bin_alloc(&setup->bins, sizeof *stored);
+            (struct lp_rast_state *) lp_bin_alloc(bins, sizeof *stored);
          if(stored) {
             memcpy(stored,
                    &setup->fs.current,
@@ -485,7 +500,7 @@ lp_setup_update_shader_state( struct setup_context *setup )
             setup->fs.stored = stored;
 
             /* put the state-set command into all bins */
-            lp_bin_state_command( &setup->bins,
+            lp_bin_state_command( bins,
                                   lp_rast_set_state, 
                                   lp_rast_arg_state(setup->fs.stored) );
          }
@@ -537,9 +552,10 @@ lp_setup_destroy( struct setup_context *setup )
 
    pipe_buffer_reference(&setup->constants.current, NULL);
 
-   lp_free_bin_data(&setup->bins);
+   lp_bins_destroy(setup->bins);
 
    lp_rast_destroy( setup->rast );
+
    FREE( setup );
 }
 
@@ -557,7 +573,7 @@ lp_setup_create( struct pipe_screen *screen )
    if (!setup->rast) 
       goto fail;
 
-   lp_init_bins(&setup->bins);
+   setup->bins = lp_bins_create();
 
    setup->triangle = first_triangle;
    setup->line     = first_line;
diff --git a/src/gallium/drivers/llvmpipe/lp_setup_context.h b/src/gallium/drivers/llvmpipe/lp_setup_context.h
index 9b47b59..782c051 100644
--- a/src/gallium/drivers/llvmpipe/lp_setup_context.h
+++ b/src/gallium/drivers/llvmpipe/lp_setup_context.h
@@ -55,7 +55,7 @@ struct setup_context {
 
    struct lp_rasterizer *rast;
 
-   struct lp_bins bins;
+   struct lp_bins *bins;
 
    boolean ccw_is_frontface;
    unsigned cullmode;
@@ -113,5 +113,6 @@ void lp_setup_choose_triangle( struct setup_context *setup );
 void lp_setup_choose_line( struct setup_context *setup );
 void lp_setup_choose_point( struct setup_context *setup );
 
+struct lp_bins *lp_setup_get_current_bins(struct setup_context *setup);
 
 #endif
diff --git a/src/gallium/drivers/llvmpipe/lp_setup_tri.c b/src/gallium/drivers/llvmpipe/lp_setup_tri.c
index b8f7984..8061712 100644
--- a/src/gallium/drivers/llvmpipe/lp_setup_tri.c
+++ b/src/gallium/drivers/llvmpipe/lp_setup_tri.c
@@ -178,6 +178,7 @@ static void setup_tri_coefficients( struct setup_context *setup,
 				    const float (*v3)[4],
 				    boolean frontface)
 {
+   struct lp_bins *bins = lp_setup_get_current_bins(setup);
    unsigned slot;
 
    /* Allocate space for the a0, dadx and dady arrays
@@ -185,9 +186,9 @@ static void setup_tri_coefficients( struct setup_context *setup,
    {
       unsigned bytes;
       bytes = (setup->fs.nr_inputs + 1) * 4 * sizeof(float);
-      tri->inputs.a0   = lp_bin_alloc_aligned( &setup->bins, bytes, 16 );
-      tri->inputs.dadx = lp_bin_alloc_aligned( &setup->bins, bytes, 16 );
-      tri->inputs.dady = lp_bin_alloc_aligned( &setup->bins, bytes, 16 );
+      tri->inputs.a0   = lp_bin_alloc_aligned( bins, bytes, 16 );
+      tri->inputs.dadx = lp_bin_alloc_aligned( bins, bytes, 16 );
+      tri->inputs.dady = lp_bin_alloc_aligned( bins, bytes, 16 );
    }
 
    /* The internal position input is in slot zero:
@@ -263,7 +264,8 @@ do_triangle_ccw(struct setup_context *setup,
    const int y2 = subpixel_snap(v2[0][1]);
    const int y3 = subpixel_snap(v3[0][1]);
 
-   struct lp_rast_triangle *tri = lp_bin_alloc( &setup->bins, sizeof *tri );
+   struct lp_bins *bins = lp_setup_get_current_bins(setup);
+   struct lp_rast_triangle *tri = lp_bin_alloc( bins, sizeof *tri );
    float area, oneoverarea;
    int minx, maxx, miny, maxy;
 
@@ -283,7 +285,7 @@ do_triangle_ccw(struct setup_context *setup,
     * XXX: subject to overflow??
     */
    if (area <= 0) {
-      lp_bin_putback_data( &setup->bins, sizeof *tri );
+      lp_bin_putback_data( bins, sizeof *tri );
       return;
    }
 
@@ -295,7 +297,7 @@ do_triangle_ccw(struct setup_context *setup,
    
    if (tri->miny == tri->maxy || 
        tri->minx == tri->maxx) {
-      lp_bin_putback_data( &setup->bins, sizeof *tri );
+      lp_bin_putback_data( bins, sizeof *tri );
       return;
    }
 
@@ -405,7 +407,7 @@ do_triangle_ccw(struct setup_context *setup,
    {
       /* Triangle is contained in a single tile:
        */
-      lp_bin_command( &setup->bins, minx, miny, lp_rast_triangle, 
+      lp_bin_command( bins, minx, miny, lp_rast_triangle, 
                    lp_rast_arg_triangle(tri) );
    }
    else 
@@ -464,7 +466,7 @@ do_triangle_ccw(struct setup_context *setup,
 	    {
 	       in = 1;
                /* triangle covers the whole tile- shade whole tile */
-               lp_bin_command( &setup->bins, x, y,
+               lp_bin_command( bins, x, y,
                                lp_rast_shade_tile,
                                lp_rast_arg_inputs(&tri->inputs) );
 	    }
@@ -472,7 +474,7 @@ do_triangle_ccw(struct setup_context *setup,
 	    { 
 	       in = 1;
                /* shade partial tile */
-               lp_bin_command( &setup->bins, x, y,
+               lp_bin_command( bins, x, y,
                                lp_rast_triangle, 
                                lp_rast_arg_triangle(tri) );
 	    }



More information about the mesa-commit mailing list