llvmpipe: reintroduce SET_STATE binner command
But bin lazily only into bins which are receiving geometry.
This commit is contained in:
@@ -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,
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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 );
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user