llvmpipe: reintroduce SET_STATE binner command

But bin lazily only into bins which are receiving geometry.
This commit is contained in:
Keith Whitwell
2010-10-14 23:28:10 +01:00
parent e2c1fe3eb0
commit 4195febeec
9 changed files with 100 additions and 46 deletions
+11 -2
View File
@@ -334,7 +334,7 @@ lp_rast_shade_tile(struct lp_rasterizer_task *task,
{
const struct lp_scene *scene = task->scene;
const struct lp_rast_shader_inputs *inputs = arg.shade_tile;
const struct lp_rast_state *state = inputs->state;
const struct lp_rast_state *state = task->state;
struct lp_fragment_shader_variant *variant = state->variant;
const unsigned tile_x = task->x, tile_y = task->y;
unsigned x, y;
@@ -414,7 +414,7 @@ lp_rast_shade_quads_mask(struct lp_rasterizer_task *task,
unsigned x, unsigned y,
unsigned mask)
{
const struct lp_rast_state *state = inputs->state;
const struct lp_rast_state *state = task->state;
struct lp_fragment_shader_variant *variant = state->variant;
const struct lp_scene *scene = task->scene;
uint8_t *color[PIPE_MAX_COLOR_BUFS];
@@ -490,6 +490,14 @@ lp_rast_end_query(struct lp_rasterizer_task *task,
}
void
lp_rast_set_state(struct lp_rasterizer_task *task,
const union lp_rast_cmd_arg arg)
{
task->state = arg.state;
}
/**
* Set top row and left column of the tile's pixels to white. For debugging.
@@ -602,6 +610,7 @@ static lp_rast_cmd_func dispatch[LP_RAST_OP_MAX] =
lp_rast_shade_tile_opaque,
lp_rast_begin_query,
lp_rast_end_query,
lp_rast_set_state,
};
+3 -3
View File
@@ -85,8 +85,6 @@ struct lp_rast_shader_inputs {
float (*a0)[4];
float (*dadx)[4];
float (*dady)[4];
const struct lp_rast_state *state;
};
/* Note: the order of these values is important as they are loaded by
@@ -154,6 +152,7 @@ union lp_rast_cmd_arg {
uint32_t value;
uint32_t mask;
} clear_zstencil;
const struct lp_rast_state *state;
struct lp_fence *fence;
struct llvmpipe_query *query_obj;
};
@@ -245,8 +244,9 @@ lp_rast_arg_null( void )
#define LP_RAST_OP_SHADE_TILE_OPAQUE 0xe
#define LP_RAST_OP_BEGIN_QUERY 0xf
#define LP_RAST_OP_END_QUERY 0x10
#define LP_RAST_OP_SET_STATE 0x11
#define LP_RAST_OP_MAX 0x11
#define LP_RAST_OP_MAX 0x12
#define LP_RAST_OP_MASK 0xff
void
+22 -13
View File
@@ -12,6 +12,7 @@ static INLINE int u_bit_scan(unsigned *mask)
struct tile {
int coverage;
int overdraw;
const struct lp_rast_state *state;
char data[TILE_SIZE][TILE_SIZE];
};
@@ -47,6 +48,7 @@ static const char *cmd_names[LP_RAST_OP_MAX] =
"shade_tile_opaque",
"begin_query",
"end_query",
"set_state",
};
static const char *cmd_name(unsigned cmd)
@@ -56,31 +58,31 @@ static const char *cmd_name(unsigned cmd)
}
static const struct lp_fragment_shader_variant *
get_variant( const struct cmd_block *block,
int k )
get_variant( const struct lp_rast_state *state,
const struct cmd_block *block,
int k )
{
if (block->cmd[k] == LP_RAST_OP_SHADE_TILE ||
block->cmd[k] == LP_RAST_OP_SHADE_TILE_OPAQUE)
return block->arg[k].shade_tile->state->variant;
if (block->cmd[k] == LP_RAST_OP_TRIANGLE_1 ||
block->cmd[k] == LP_RAST_OP_SHADE_TILE_OPAQUE ||
block->cmd[k] == LP_RAST_OP_TRIANGLE_1 ||
block->cmd[k] == LP_RAST_OP_TRIANGLE_2 ||
block->cmd[k] == LP_RAST_OP_TRIANGLE_3 ||
block->cmd[k] == LP_RAST_OP_TRIANGLE_4 ||
block->cmd[k] == LP_RAST_OP_TRIANGLE_5 ||
block->cmd[k] == LP_RAST_OP_TRIANGLE_6 ||
block->cmd[k] == LP_RAST_OP_TRIANGLE_7)
return block->arg[k].triangle.tri->inputs.state->variant;
return state->variant;
return NULL;
}
static boolean
is_blend( const struct cmd_block *block,
is_blend( const struct lp_rast_state *state,
const struct cmd_block *block,
int k )
{
const struct lp_fragment_shader_variant *variant = get_variant(block, k);
const struct lp_fragment_shader_variant *variant = get_variant(state, block, k);
if (variant)
return variant->key.blend.rt[0].blend_enable;
@@ -93,6 +95,7 @@ is_blend( const struct cmd_block *block,
static void
debug_bin( const struct cmd_bin *bin )
{
const struct lp_rast_state *state;
const struct cmd_block *head = bin->head;
int i, j = 0;
@@ -100,9 +103,12 @@ debug_bin( const struct cmd_bin *bin )
while (head) {
for (i = 0; i < head->count; i++, j++) {
if (head->cmd[i] == LP_RAST_OP_SET_STATE)
state = head->arg[i].state;
debug_printf("%d: %s %s\n", j,
cmd_name(head->cmd[i]),
is_blend(head, i) ? "blended" : "");
is_blend(state, head, i) ? "blended" : "");
}
head = head->next;
}
@@ -134,7 +140,7 @@ debug_shade_tile(int x, int y,
char val)
{
const struct lp_rast_shader_inputs *inputs = arg.shade_tile;
boolean blend = inputs->state->variant->key.blend.rt[0].blend_enable;
boolean blend = tile->state->variant->key.blend.rt[0].blend_enable;
unsigned i,j;
if (inputs->disable)
@@ -176,7 +182,7 @@ debug_triangle(int tilex, int tiley,
int x, y;
int count = 0;
unsigned i, nr_planes = 0;
boolean blend = tri->inputs.state->variant->key.blend.rt[0].blend_enable;
boolean blend = tile->state->variant->key.blend.rt[0].blend_enable;
if (tri->inputs.disable) {
/* This triangle was partially binned and has been disabled */
@@ -236,12 +242,15 @@ do_debug_bin( struct tile *tile,
for (block = bin->head; block; block = block->next) {
for (k = 0; k < block->count; k++, j++) {
boolean blend = is_blend(block, k);
boolean blend = is_blend(tile->state, block, k);
char val = get_label(j);
int count = 0;
if (print_cmds)
debug_printf("%c: %15s", val, cmd_name(block->cmd[k]));
if (block->cmd[k] == LP_RAST_OP_SET_STATE)
tile->state = block->arg[k].state;
if (block->cmd[k] == LP_RAST_OP_CLEAR_COLOR ||
block->cmd[k] == LP_RAST_OP_CLEAR_ZSTENCIL)
+6 -1
View File
@@ -77,6 +77,7 @@ struct cmd_bin;
struct lp_rasterizer_task
{
const struct cmd_bin *bin;
const struct lp_rast_state *state;
struct lp_scene *scene;
unsigned x, y; /**< Pos of this tile in framebuffer, in pixels */
@@ -244,7 +245,7 @@ lp_rast_shade_quads_all( struct lp_rasterizer_task *task,
unsigned x, unsigned y )
{
const struct lp_scene *scene = task->scene;
const struct lp_rast_state *state = inputs->state;
const struct lp_rast_state *state = task->state;
struct lp_fragment_shader_variant *variant = state->variant;
uint8_t *color[PIPE_MAX_COLOR_BUFS];
void *depth;
@@ -297,6 +298,10 @@ void lp_rast_triangle_3_16( struct lp_rasterizer_task *,
void lp_rast_triangle_4_16( struct lp_rasterizer_task *,
const union lp_rast_cmd_arg );
void
lp_rast_set_state(struct lp_rasterizer_task *task,
const union lp_rast_cmd_arg arg);
void
lp_debug_bin( const struct cmd_bin *bin );
+3 -1
View File
@@ -203,7 +203,9 @@ lp_scene_end_rasterization(struct lp_scene *scene )
for (i = 0; i < scene->tiles_x; i++) {
for (j = 0; j < scene->tiles_y; j++) {
struct cmd_bin *bin = lp_scene_get_bin(scene, i, j);
bin->head = bin->tail = NULL;
bin->head = NULL;
bin->tail = NULL;
bin->last_state = NULL;
}
}
+27 -1
View File
@@ -41,6 +41,7 @@
#include "lp_debug.h"
struct lp_scene_queue;
struct lp_rast_state;
/* We're limited to 2K by 2K for 32bit fixed point rasterization.
* Will need a 64-bit version for larger framebuffers.
@@ -94,6 +95,7 @@ struct data_block {
struct cmd_bin {
ushort x;
ushort y;
const struct lp_rast_state *last_state; /* most recent state set in bin */
struct cmd_block *head;
struct cmd_block *tail;
};
@@ -297,7 +299,7 @@ lp_scene_bin_command( struct lp_scene *scene,
assert(x < scene->tiles_x);
assert(y < scene->tiles_y);
assert(cmd <= LP_RAST_OP_END_QUERY);
assert(cmd < LP_RAST_OP_MAX);
if (tail == NULL || tail->count == CMD_BLOCK_MAX) {
tail = lp_scene_new_cmd_block( scene, bin );
@@ -318,6 +320,30 @@ lp_scene_bin_command( struct lp_scene *scene,
}
static INLINE boolean
lp_scene_bin_cmd_with_state( struct lp_scene *scene,
unsigned x, unsigned y,
const struct lp_rast_state *state,
unsigned cmd,
union lp_rast_cmd_arg arg )
{
struct cmd_bin *bin = lp_scene_get_bin(scene, x, y);
if (state != bin->last_state) {
bin->last_state = state;
if (!lp_scene_bin_command(scene, x, y,
LP_RAST_OP_SET_STATE,
lp_rast_arg_state(state)))
return FALSE;
}
if (!lp_scene_bin_command( scene, x, y, cmd, arg ))
return FALSE;
return TRUE;
}
/* Add a command to all active bins.
*/
static INLINE boolean
@@ -597,7 +597,6 @@ try_setup_line( struct lp_setup_context *setup,
setup_line_coefficients( setup, line, &info);
line->inputs.facing = 1.0F;
line->inputs.state = setup->fs.stored;
line->inputs.disable = FALSE;
line->inputs.opaque = FALSE;
@@ -374,7 +374,6 @@ try_setup_point( struct lp_setup_context *setup,
setup_point_coefficients(setup, point, &info);
point->inputs.facing = 1.0F;
point->inputs.state = setup->fs.stored;
point->inputs.disable = FALSE;
point->inputs.opaque = FALSE;
+28 -23
View File
@@ -200,14 +200,16 @@ lp_setup_whole_tile(struct lp_setup_context *setup,
}
LP_COUNT(nr_shade_opaque_64);
return lp_scene_bin_command( scene, tx, ty,
LP_RAST_OP_SHADE_TILE_OPAQUE,
lp_rast_arg_inputs(inputs) );
return lp_scene_bin_cmd_with_state( scene, tx, ty,
setup->fs.stored,
LP_RAST_OP_SHADE_TILE_OPAQUE,
lp_rast_arg_inputs(inputs) );
} else {
LP_COUNT(nr_shade_64);
return lp_scene_bin_command( scene, tx, ty,
LP_RAST_OP_SHADE_TILE,
lp_rast_arg_inputs(inputs) );
return lp_scene_bin_cmd_with_state( scene, tx, ty,
setup->fs.stored,
LP_RAST_OP_SHADE_TILE,
lp_rast_arg_inputs(inputs) );
}
}
@@ -320,7 +322,6 @@ do_triangle_ccw(struct lp_setup_context *setup,
tri->inputs.facing = frontfacing ? 1.0F : -1.0F;
tri->inputs.disable = FALSE;
tri->inputs.opaque = setup->fs.current.variant->opaque;
tri->inputs.state = setup->fs.stored;
for (i = 0; i < 3; i++) {
@@ -491,34 +492,36 @@ lp_setup_bin_triangle( struct lp_setup_context *setup,
{
/* Triangle is contained in a single 4x4 stamp:
*/
return lp_scene_bin_command( scene, ix0, iy0,
LP_RAST_OP_TRIANGLE_3_4,
lp_rast_arg_triangle(tri, mask) );
return lp_scene_bin_cmd_with_state( scene, ix0, iy0,
setup->fs.stored,
LP_RAST_OP_TRIANGLE_3_4,
lp_rast_arg_triangle(tri, mask) );
}
if (sz < 16)
{
/* Triangle is contained in a single 16x16 block:
*/
return lp_scene_bin_command( scene, ix0, iy0,
LP_RAST_OP_TRIANGLE_3_16,
lp_rast_arg_triangle(tri, mask) );
return lp_scene_bin_cmd_with_state( scene, ix0, iy0,
setup->fs.stored,
LP_RAST_OP_TRIANGLE_3_16,
lp_rast_arg_triangle(tri, mask) );
}
}
else if (nr_planes == 4 && sz < 16)
{
return lp_scene_bin_command( scene, ix0, iy0,
LP_RAST_OP_TRIANGLE_4_16,
lp_rast_arg_triangle(tri, mask) );
return lp_scene_bin_cmd_with_state(scene, ix0, iy0,
setup->fs.stored,
LP_RAST_OP_TRIANGLE_4_16,
lp_rast_arg_triangle(tri, mask) );
}
/* Triangle is contained in a single tile:
*/
return lp_scene_bin_command( scene, ix0, iy0,
lp_rast_tri_tab[nr_planes],
lp_rast_arg_triangle(tri, (1<<nr_planes)-1) );
return lp_scene_bin_cmd_with_state( scene, ix0, iy0, setup->fs.stored,
lp_rast_tri_tab[nr_planes],
lp_rast_arg_triangle(tri, (1<<nr_planes)-1) );
}
else
{
@@ -584,9 +587,11 @@ lp_setup_bin_triangle( struct lp_setup_context *setup,
*/
int count = util_bitcount(partial);
in = TRUE;
if (!lp_scene_bin_command( scene, x, y,
lp_rast_tri_tab[count],
lp_rast_arg_triangle(tri, partial) ))
if (!lp_scene_bin_cmd_with_state( scene, x, y,
setup->fs.stored,
lp_rast_tri_tab[count],
lp_rast_arg_triangle(tri, partial) ))
goto fail;
LP_COUNT(nr_partially_covered_64);