llvmpipe: use new lp_setup_get_current_bins() function

This stub function will interface to the queue system...
This commit is contained in:
Brian Paul 2009-12-09 12:28:54 -07:00
parent 88e62b33dc
commit 22b07b8be4
3 changed files with 44 additions and 25 deletions

View File

@ -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;

View File

@ -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

View File

@ -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) );
}