llvmpipe: Ensure outdated framebuffer state is not reused in lp_setup_bind_framebuffer().
authorJosé Fonseca <jfonseca@vmware.com>
Mon, 28 Jun 2010 15:28:55 +0000 (16:28 +0100)
committerJosé Fonseca <jfonseca@vmware.com>
Mon, 28 Jun 2010 15:33:05 +0000 (16:33 +0100)
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()

src/gallium/drivers/llvmpipe/lp_setup.c
src/gallium/drivers/llvmpipe/lp_setup_vbuf.c

index e8aafee33ff06b296422fabff015bb8747d79bc1..9e319fd9f003469cfcd410eecc945315bbeb71fd 100644 (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);
 }
index f6a424f25a833575480baac47fcecef618fe8d77..e53a62cb7293f9fd0efecbd164e323e2e0d7261c 100644 (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;
 }