aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/gallium/drivers/llvmpipe/lp_setup.c11
-rw-r--r--src/gallium/drivers/llvmpipe/lp_setup_context.h19
2 files changed, 21 insertions, 9 deletions
diff --git a/src/gallium/drivers/llvmpipe/lp_setup.c b/src/gallium/drivers/llvmpipe/lp_setup.c
index 1f303d7705e..fc7f4f6778e 100644
--- a/src/gallium/drivers/llvmpipe/lp_setup.c
+++ b/src/gallium/drivers/llvmpipe/lp_setup.c
@@ -111,7 +111,7 @@ static void reset_context( struct setup_context *setup )
*/
for (i = 0; i < setup->tiles_x; i++) {
for (j = 0; j < setup->tiles_y; j++) {
- struct cmd_block_list *list = &setup->tile[i][j];
+ struct cmd_block_list *list = &setup->tile[i][j].commands;
struct cmd_block *block;
struct cmd_block *tmp;
@@ -173,9 +173,10 @@ static void bin_everywhere( struct setup_context *setup,
/** Rasterize commands for a single bin */
static void
rasterize_bin( struct lp_rasterizer *rast,
- struct cmd_block_list *commands,
+ const struct cmd_bin *bin,
int x, int y)
{
+ const struct cmd_block_list *commands = &bin->commands;
struct cmd_block *block;
unsigned k;
@@ -666,7 +667,7 @@ lp_setup_destroy( struct setup_context *setup )
for (i = 0; i < TILES_X; i++)
for (j = 0; j < TILES_Y; j++)
- FREE(setup->tile[i][j].head);
+ FREE(setup->tile[i][j].commands.head);
FREE(setup->data.head);
@@ -691,8 +692,8 @@ lp_setup_create( struct pipe_screen *screen )
for (i = 0; i < TILES_X; i++)
for (j = 0; j < TILES_Y; j++)
- setup->tile[i][j].head =
- setup->tile[i][j].tail = CALLOC_STRUCT(cmd_block);
+ setup->tile[i][j].commands.head =
+ setup->tile[i][j].commands.tail = CALLOC_STRUCT(cmd_block);
setup->data.head =
setup->data.tail = CALLOC_STRUCT(data_block);
diff --git a/src/gallium/drivers/llvmpipe/lp_setup_context.h b/src/gallium/drivers/llvmpipe/lp_setup_context.h
index b502f00eea4..1715048f760 100644
--- a/src/gallium/drivers/llvmpipe/lp_setup_context.h
+++ b/src/gallium/drivers/llvmpipe/lp_setup_context.h
@@ -71,11 +71,20 @@ struct cmd_block_list {
struct cmd_block *tail;
};
+/**
+ * For each screen tile we have one of these bins.
+ */
+struct cmd_bin {
+ struct cmd_block_list commands;
+ struct lp_rast_state *curr_state;
+};
+
+
struct data_block_list {
struct data_block *head;
struct data_block *tail;
};
-
+
/**
* Point/line/triangle setup context.
@@ -87,12 +96,12 @@ struct setup_context {
struct lp_rasterizer *rast;
/**
- * Per-bin data goes into the 'tile' cmd_block_lists.
+ * Per-bin data goes into the 'tile' bins.
* Shared bin data goes into the 'data' buffer.
* When there are multiple threads, will want to double-buffer the
* bin arrays:
*/
- struct cmd_block_list tile[TILES_X][TILES_Y];
+ struct cmd_bin tile[TILES_X][TILES_Y];
struct data_block_list data;
/* size of framebuffer, in tiles */
@@ -212,10 +221,12 @@ static INLINE void *get_data_aligned( struct data_block_list *list,
/* Add a command to a given bin.
*/
-static INLINE void bin_command( struct cmd_block_list *list,
+static INLINE void bin_command( struct cmd_bin *bin,
lp_rast_cmd cmd,
union lp_rast_cmd_arg arg )
{
+ struct cmd_block_list *list = &bin->commands;
+
if (list->tail->count == CMD_BLOCK_MAX) {
lp_setup_new_cmd_block( list );
}