llvmpipe: Ensure outdated framebuffer state is not reused in lp_setup_bind_framebuffer().

We were starting a scene whenever lp_setup_get_vertex_info() was called by
the draw module. So when when all primitives were culled/clipped, not only
did we create a new scene for nothing, but we end up using the old scene
with the old framebuffer state instead of a new one.

Fix consists in:
- don't call lp_setup_update_state() in lp_setup_get_vertex_info() -- no
  longer necessary
- always setting the scene state before binning a command -- query
  commands were bypassing it
- assert no old scene is reused in lp_setup_bind_framebuffer()
This commit is contained in:
José Fonseca 2010-06-28 16:28:55 +01:00
parent ce7a70b8b4
commit 8be645d53a
2 changed files with 9 additions and 4 deletions

View File

@ -297,6 +297,11 @@ lp_setup_bind_framebuffer( struct lp_setup_context *setup,
*/
set_scene_state( setup, SETUP_FLUSHED );
/*
* Ensure the old scene is not reused.
*/
assert(!setup->scene);
/* Set new state. This will be picked up later when we next need a
* scene.
*/
@ -933,6 +938,8 @@ lp_setup_begin_query(struct lp_setup_context *setup,
memset(pq->count, 0, sizeof(pq->count)); /* reset all counters */
set_scene_state( setup, SETUP_ACTIVE );
cmd_arg.query_obj = pq;
lp_scene_bin_everywhere(scene, lp_rast_begin_query, cmd_arg);
pq->binned = TRUE;
@ -948,6 +955,8 @@ lp_setup_end_query(struct lp_setup_context *setup, struct llvmpipe_query *pq)
struct lp_scene * scene = lp_setup_get_current_scene(setup);
union lp_rast_cmd_arg cmd_arg;
set_scene_state( setup, SETUP_ACTIVE );
cmd_arg.query_obj = pq;
lp_scene_bin_everywhere(scene, lp_rast_end_query, cmd_arg);
}

View File

@ -60,10 +60,6 @@ static const struct vertex_info *
lp_setup_get_vertex_info(struct vbuf_render *vbr)
{
struct lp_setup_context *setup = lp_setup_context(vbr);
/* vertex size/info depends on the latest state */
lp_setup_update_state(setup);
return setup->vertex_info;
}