llvmpipe: start cleaning up
authorKeith Whitwell <keithw@vmware.com>
Thu, 8 Oct 2009 16:52:35 +0000 (17:52 +0100)
committerKeith Whitwell <keithw@vmware.com>
Thu, 8 Oct 2009 16:53:12 +0000 (17:53 +0100)
src/gallium/drivers/llvmpipe/SConscript
src/gallium/drivers/llvmpipe/lp_rast.h
src/gallium/drivers/llvmpipe/lp_setup.c
src/gallium/drivers/llvmpipe/lp_setup.h
src/gallium/drivers/llvmpipe/lp_setup_context.h

index b39bc76..f694553 100644 (file)
@@ -47,8 +47,6 @@ llvmpipe = env.ConvenienceLibrary(
                'lp_jit.c',
                'lp_prim_vbuf.c',
         'lp_query.c',
-        'lp_rast.c',
-        'lp_rast_tri.c',
                'lp_setup.c',
                'lp_screen.c',
                'lp_state_blend.c',
@@ -61,6 +59,8 @@ llvmpipe = env.ConvenienceLibrary(
                'lp_state_vertex.c',
                'lp_state_vs.c',
                'lp_surface.c',
+        'lp_rast.c',
+        'lp_rast_tri.c',
                'lp_tex_sample_llvm.c',
                'lp_texture.c',
                'lp_tile_soa.c',
index 33a6065..f40208b 100644 (file)
@@ -28,6 +28,8 @@
 #ifndef LP_RAST_H
 #define LP_RAST_H
 
+#include "lp_jit.h"
+
 /* Initially create and program a single rasterizer directly.  Later
  * will want multiple of these, one or two per core.  At that stage
  * will probably pass command buffers into the rasterizers rather than
@@ -35,6 +37,9 @@
  */
 struct lp_rasterizer;
 
+#define TILESIZE 64
+
+
 struct lp_rast_state {
    /* State for the shader:
     */
@@ -55,10 +60,11 @@ struct lp_rast_shader_inputs {
     */
    const struct lp_rast_state *state;
 
-   /* Attribute interpolation:
+   /* Attribute interpolation:  FIXME: reduce memory waste!
     */
-   struct tgsi_interp_coef position_coef;
-   struct tgsi_interp_coef *coef;
+   float a0[PIPE_MAX_ATTRIBS][4];
+   float dadx[PIPE_MAX_ATTRIBS][4];
+   float dady[PIPE_MAX_ATTRIBS][4];
 };
 
 
index 514366b..43a4f5f 100644 (file)
@@ -32,7 +32,7 @@
  * lp_setup_flush().
  */
 
-#include "lp_setup.h"
+#include "lp_setup_context.h"
 #include "util/u_math.h"
 #include "util/u_memory.h"
 
@@ -56,31 +56,33 @@ void lp_setup_new_data_block( struct data_block_list *list )
 
 static void reset_context( struct setup_context *setup )
 {
+   unsigned i, j;
+
    for (i = 0; i < setup->tiles_x; i++) {
       for (j = 0; j < setup->tiles_y; j++) {
-         struct cmd_block_list *list = scene->tile[i][j];
+         struct cmd_block_list *list = &setup->tile[i][j];
          struct cmd_block *block;
          struct cmd_block *tmp;
          
-         for (block = list->first; block != list->tail; block = tmp) {
+         for (block = list->head; block != list->tail; block = tmp) {
             tmp = block->next;
             FREE(block);
          }
          
-         list->first = list->tail;
+         list->head = list->tail;
       }
    }
 
    {
-      struct data_block_list *list = &scene->data;
+      struct data_block_list *list = &setup->data;
       struct data_block *block, *tmp;
 
-      for (block = list->first; block != list->tail; block = tmp) {
+      for (block = list->head; block != list->tail; block = tmp) {
          tmp = block->next;
          FREE(block);
       }
          
-      list->first = list->tail;
+      list->head = list->tail;
    }
 }
 
@@ -90,39 +92,42 @@ static void reset_context( struct setup_context *setup )
 /* Add a command to all active bins.
  */
 static void bin_everywhere( struct setup_context *setup,
-                            bin_cmd cmd,
+                            lp_rast_cmd cmd,
                             const union lp_rast_cmd_arg *arg )
 {
    unsigned i, j;
    for (i = 0; i < setup->tiles_x; i++)
       for (j = 0; j < setup->tiles_y; j++)
-         bin_cmd( setup, &setup->tile[i][j], cmd, arg );
+         bin_cmd( &setup->tile[i][j], cmd, arg );
 }
 
 
 static void
 rasterize_bins( struct setup_context *setup,
-                struct lp_rast *rast,
                 boolean write_depth )
 {
+   struct lp_rasterizer *rast = setup->rast;
+   struct cmd_block *block;
+   unsigned i,j,k;
+
    lp_rast_bind_color( rast, 
-                       scene->fb.color, 
+                       setup->fb.color, 
                        TRUE );                    /* WRITE */
                        
    lp_rast_bind_depth( rast,
-                       scene->fb.depth,
+                       setup->fb.zstencil,
                        write_depth );             /* WRITE */
 
-   for (i = 0; i < scene->tiles_x; i++) {
-      for (j = 0; j < scene->tiles_y; j++) {
+   for (i = 0; i < setup->tiles_x; i++) {
+      for (j = 0; j < setup->tiles_y; j++) {
 
          lp_rast_start_tile( rast, 
                              i * TILESIZE,
                              j * TILESIZE );
 
-         for (block = scene->tile[i][j].first; block; block = block->next) {
-            for (k = 0; k < block->nr_cmds; k++) {
-               block->cmd[k].func( rast, block->cmd[k].arg );
+         for (block = setup->tile[i][j].head; block; block = block->next) {
+            for (k = 0; k < block->count; k++) {
+               block->cmd[k]( rast, block->arg[k] );
             }
          }
 
@@ -130,7 +135,7 @@ rasterize_bins( struct setup_context *setup,
       }
    }
 
-   lp_setup_free_data( setup );
+   reset_context( setup );
 }
 
 
index 5151a17..6f560f5 100644 (file)
@@ -37,6 +37,7 @@ enum lp_interp {
    LP_INTERP_FACING
 };
 
+struct pipe_texture;
 struct setup_context;
 
 struct setup_context *
index eeee715..19d163d 100644 (file)
 #ifndef LP_SETUP_CONTEXT_H
 #define LP_SETUP_CONTEXT_H
 
+#include "lp_setup.h"
+#include "lp_rast.h"
 
 #define CMD_BLOCK_MAX 128
 #define DATA_BLOCK_SIZE (16 * 1024 - sizeof(unsigned) - sizeof(void *))
 
 /* switch to a non-pointer value for this:
  */
-typedef void (*lp_rast_cmd)( struct lp_rast *, const union lp_rast_cmd_arg * );
+typedef void (*lp_rast_cmd)( struct lp_rasterizer *, const union lp_rast_cmd_arg * );
 
 struct cmd_block {
-   union lp_rast_arg *arg[CMD_BLOCK_MAX];
    lp_rast_cmd cmd[CMD_BLOCK_MAX];
+   const union lp_rast_cmd_arg *arg[CMD_BLOCK_MAX];
    unsigned count;
    struct cmd_block *next;
 };
 
 struct data_block {
-   ubyte data[DATA_BLOCK_SZ];
+   ubyte data[DATA_BLOCK_SIZE];
    unsigned used;
    struct data_block *next;
 };
@@ -68,10 +70,12 @@ struct data_block_list {
 
 struct setup_context {
 
+   struct lp_rasterizer *rast;
+
    /* When there are multiple threads, will want to double-buffer the
     * bin arrays:
     */
-   struct cmd_block_list bin[MAXHEIGHT / TILESIZE][MAXWIDTH / TILESIZE];
+   struct cmd_block_list tile[MAXHEIGHT / TILESIZE][MAXWIDTH / TILESIZE];
    struct data_block_list data;
 
    unsigned tiles_x;
@@ -110,9 +114,12 @@ struct setup_context {
    void (*triangle)( struct setup_context *,
                      const float (*v0)[4],
                      const float (*v1)[4],
-                     const float (*v1)[4]);
+                     const float (*v2)[4]);
 };
 
+void lp_setup_new_data_block( struct data_block_list *list );
+void lp_setup_new_cmd_block( struct cmd_block_list *list );
+
 static INLINE void *get_data( struct data_block_list *list,
                               unsigned size)
 {
@@ -123,7 +130,7 @@ static INLINE void *get_data( struct data_block_list *list,
 
    {
       struct data_block *tail = list->tail;
-      char *data = tail->data + tail->used;
+      ubyte *data = tail->data + tail->used;
       tail->used += size;
       return data;
    }
@@ -132,11 +139,11 @@ static INLINE void *get_data( struct data_block_list *list,
 /* Add a command to a given bin.
  */
 static INLINE void bin_cmd( struct cmd_block_list *list,
-                            bin_cmd cmd,
+                            lp_rast_cmd cmd,
                             const union lp_rast_cmd_arg *arg )
 {
-   if (list->tail.count == CMD_BLOCK_MAX) {
-      lp_setup_new_cmd_block( list )
+   if (list->tail->count == CMD_BLOCK_MAX) {
+      lp_setup_new_cmd_block( list );
    }
 
    {
@@ -150,3 +157,4 @@ static INLINE void bin_cmd( struct cmd_block_list *list,
 
 
 
+#endif