llvmpipe: keep copy of framebuffer state in setup context
authorKeith Whitwell <keithw@vmware.com>
Thu, 17 Dec 2009 11:29:37 +0000 (11:29 +0000)
committerKeith Whitwell <keithw@vmware.com>
Thu, 17 Dec 2009 11:29:37 +0000 (11:29 +0000)
Avoids crashes when first frame is rendered before window is mapped.
Avoids potential issue where fb state is changed before setup context is
flushed.

src/gallium/drivers/llvmpipe/lp_setup.c
src/gallium/drivers/llvmpipe/lp_setup_context.h
src/gallium/drivers/llvmpipe/lp_state_surface.c

index 76e09552377f60969b0966b0c9113b97483742b6..e361e5df63aee08bb56966613f595a2edb618a4d 100644 (file)
@@ -36,6 +36,7 @@
 #include "pipe/p_inlines.h"
 #include "util/u_memory.h"
 #include "util/u_pack_color.h"
+#include "util/u_surface.h"
 #include "lp_scene.h"
 #include "lp_scene_queue.h"
 #include "lp_debug.h"
@@ -61,10 +62,9 @@ lp_setup_get_current_scene(struct setup_context *setup)
       setup->scene = lp_scene_dequeue(setup->empty_scenes);
       if(0)lp_scene_reset( setup->scene ); /* XXX temporary? */
 
-      if (setup->fb) {
-         lp_scene_set_framebuffer_size(setup->scene,
-                                     setup->fb->width, setup->fb->height);
-      }
+      lp_scene_set_framebuffer_size(setup->scene,
+                                    setup->fb.width, 
+                                    setup->fb.height);
    }
    return setup->scene;
 }
@@ -134,9 +134,9 @@ lp_setup_rasterize_scene( struct setup_context *setup,
    struct lp_scene *scene = lp_setup_get_current_scene(setup);
 
    lp_rasterize_scene(setup->rast,
-                     scene,
-                     setup->fb,
-                     write_depth);
+                      scene,
+                      &setup->fb,
+                      write_depth);
 
    reset_context( setup );
 
@@ -152,7 +152,7 @@ begin_binning( struct setup_context *setup )
 
    LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__);
 
-   if (setup->fb->cbufs[0]) {
+   if (setup->fb.cbufs[0]) {
       if (setup->clear.flags & PIPE_CLEAR_COLOR)
          lp_scene_bin_everywhere( scene, 
                             lp_rast_clear_color, 
@@ -163,7 +163,7 @@ begin_binning( struct setup_context *setup )
                             lp_rast_arg_null() );
    }
 
-   if (setup->fb->zsbuf) {
+   if (setup->fb.zsbuf) {
       if (setup->clear.flags & PIPE_CLEAR_DEPTHSTENCIL)
          lp_scene_bin_everywhere( scene, 
                             lp_rast_clear_zstencil, 
@@ -248,9 +248,9 @@ lp_setup_bind_framebuffer( struct setup_context *setup,
 
    set_state( setup, SETUP_FLUSHED );
 
-   setup->fb = fb;
+   util_copy_framebuffer_state(&setup->fb, fb);
 
-   lp_scene_set_framebuffer_size(scene, setup->fb->width, setup->fb->height);
+   lp_scene_set_framebuffer_size(scene, setup->fb.width, setup->fb.height);
 }
 
 
@@ -274,7 +274,7 @@ lp_setup_clear( struct setup_context *setup,
 
    if (flags & PIPE_CLEAR_DEPTHSTENCIL) {
       setup->clear.zstencil.clear_zstencil = 
-         util_pack_z_stencil(setup->fb->zsbuf->format, 
+         util_pack_z_stencil(setup->fb.zsbuf->format, 
                              depth,
                              stencil);
    }
index 180d9eca84bdb7f64cb7a050840a9cba8299c79a..f6604a8034aa2896ef4d9aaf398925b980f3782f 100644 (file)
@@ -65,7 +65,7 @@ struct setup_context {
    boolean ccw_is_frontface;
    unsigned cullmode;
 
-   const struct pipe_framebuffer_state *fb;
+   struct pipe_framebuffer_state fb;
 
    struct {
       unsigned flags;
index 21565436eb6ebbd371e2af61c33eaf627fef0a4a..957e947fe029c92e1915a08f9d68cc37a98b85be 100644 (file)
@@ -68,7 +68,7 @@ llvmpipe_set_framebuffer_state(struct pipe_context *pipe,
          draw_set_mrd(lp->draw, mrd);
       }
 
-      lp_setup_bind_framebuffer( lp->setup, fb );
+      lp_setup_bind_framebuffer( lp->setup, &lp->framebuffer );
 
       lp->dirty |= LP_NEW_FRAMEBUFFER;
    }