*/
static void
lp_rast_tile_begin(struct lp_rasterizer_task *task,
- const struct cmd_bin *bin)
+ const struct cmd_bin *bin,
+ int x, int y)
{
- LP_DBG(DEBUG_RAST, "%s %d,%d\n", __FUNCTION__, bin->x, bin->y);
+ LP_DBG(DEBUG_RAST, "%s %d,%d\n", __FUNCTION__, x, y);
task->bin = bin;
- task->x = bin->x * TILE_SIZE;
- task->y = bin->y * TILE_SIZE;
+ task->x = x * TILE_SIZE;
+ task->y = y * TILE_SIZE;
/* reset pointers to color and depth tile(s) */
memset(task->color_tiles, 0, sizeof(task->color_tiles));
static void
do_rasterize_bin(struct lp_rasterizer_task *task,
- const struct cmd_bin *bin)
+ const struct cmd_bin *bin,
+ int x, int y)
{
const struct cmd_block *block;
unsigned k;
if (0)
- lp_debug_bin(bin);
+ lp_debug_bin(bin, x, y);
for (block = bin->head; block; block = block->next) {
for (k = 0; k < block->count; k++) {
*/
static void
rasterize_bin(struct lp_rasterizer_task *task,
- const struct cmd_bin *bin )
+ const struct cmd_bin *bin, int x, int y )
{
- lp_rast_tile_begin( task, bin );
+ lp_rast_tile_begin( task, bin, x, y );
- do_rasterize_bin(task, bin);
+ do_rasterize_bin(task, bin, x, y);
lp_rast_tile_end(task);
if (!task->rast->no_rast && !scene->discard) {
/* loop over scene bins, rasterize each */
-#if 0
- {
- unsigned i, j;
- 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);
- rasterize_bin(task, bin, i, j);
- }
- }
- }
-#else
{
struct cmd_bin *bin;
+ int i, j;
assert(scene);
- while ((bin = lp_scene_bin_iter_next(scene))) {
+ while ((bin = lp_scene_bin_iter_next(scene, &i, &j))) {
if (!is_empty_bin( bin ))
- rasterize_bin(task, bin);
+ rasterize_bin(task, bin, i, j);
}
}
-#endif
}
static void
-debug_bin( const struct cmd_bin *bin )
+debug_bin( const struct cmd_bin *bin, int x, int y )
{
const struct lp_rast_state *state = NULL;
const struct cmd_block *head = bin->head;
int i, j = 0;
- debug_printf("bin %d,%d:\n", bin->x, bin->y);
+ debug_printf("bin %d,%d:\n", x, y);
while (head) {
for (i = 0; i < head->count; i++, j++) {
static void
do_debug_bin( struct tile *tile,
const struct cmd_bin *bin,
+ int x, int y,
boolean print_cmds)
{
unsigned k, j = 0;
const struct cmd_block *block;
- int tx = bin->x * TILE_SIZE;
- int ty = bin->y * TILE_SIZE;
+ int tx = x * TILE_SIZE;
+ int ty = y * TILE_SIZE;
memset(tile->data, ' ', sizeof tile->data);
tile->coverage = 0;
}
void
-lp_debug_bin( const struct cmd_bin *bin)
+lp_debug_bin( const struct cmd_bin *bin, int i, int j)
{
struct tile tile;
int x,y;
if (bin->head) {
- do_debug_bin(&tile, bin, TRUE);
+ do_debug_bin(&tile, bin, i, j, TRUE);
debug_printf("------------------------------------------------------------------\n");
for (y = 0; y < TILE_SIZE; y++) {
struct tile tile;
if (bin->head) {
- //lp_debug_bin(bin);
+ //lp_debug_bin(bin, x, y);
- do_debug_bin(&tile, bin, FALSE);
+ do_debug_bin(&tile, bin, x, y, FALSE);
total += tile.coverage;
possible += 64*64;
for (x = 0; x < scene->tiles_x; x++) {
struct cmd_bin *bin = lp_scene_get_bin(scene, x, y);
if (bin->head) {
- debug_bin(bin);
+ debug_bin(bin, x, y);
}
}
}
const union lp_rast_cmd_arg arg);
void
-lp_debug_bin( const struct cmd_bin *bin );
+lp_debug_bin( const struct cmd_bin *bin, int x, int y );
#endif
* of work (a bin) to work on.
*/
struct cmd_bin *
-lp_scene_bin_iter_next( struct lp_scene *scene )
+lp_scene_bin_iter_next( struct lp_scene *scene , int *x, int *y)
{
struct cmd_bin *bin = NULL;
}
bin = lp_scene_get_bin(scene, scene->curr_x, scene->curr_y);
+ *x = scene->curr_x;
+ *y = scene->curr_y;
end:
/*printf("return bin %p at %d, %d\n", (void *) bin, *bin_x, *bin_y);*/
* For each screen tile we have one of these bins.
*/
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;
lp_scene_bin_iter_begin( struct lp_scene *scene );
struct cmd_bin *
-lp_scene_bin_iter_next( struct lp_scene *scene );
+lp_scene_bin_iter_next( struct lp_scene *scene, int *x, int *y );
struct lp_scene *scene = setup->scene;
boolean need_zsload = FALSE;
boolean ok;
- unsigned i, j;
+ unsigned i;
assert(scene);
assert(scene->fence == NULL);
if (!scene->fence)
return FALSE;
- /* Initialize the bin flags and x/y coords:
- */
- for (i = 0; i < scene->tiles_x; i++) {
- for (j = 0; j < scene->tiles_y; j++) {
- scene->tile[i][j].x = i;
- scene->tile[i][j].y = j;
- }
- }
-
ok = try_update_scene_state(setup);
if (!ok)
return FALSE;