llvmpipe: add some null pointer checks
authorBrian Paul <brianp@vmware.com>
Fri, 9 Sep 2011 19:59:20 +0000 (13:59 -0600)
committerBrian Paul <brianp@vmware.com>
Fri, 9 Sep 2011 20:00:55 +0000 (14:00 -0600)
It's not clear if these are acceptable cases so issue a one-time warning
in debug builds when we hit them.

Fixes segfault in piglit fbo-mipmap-copypix test.

Reviewed-by: José Fonseca <jfonseca@vmware.com>
src/gallium/drivers/llvmpipe/lp_rast.c
src/gallium/drivers/llvmpipe/lp_rast_debug.c

index dafadc1ea9bce176c3a48fa880a0cbb168d9e632..2bb61fcc7c43abe4fae17f1e56412ee9608f3799 100644 (file)
@@ -339,6 +339,15 @@ lp_rast_shade_tile(struct lp_rasterizer_task *task,
    const unsigned tile_x = task->x, tile_y = task->y;
    unsigned x, y;
 
+   if (!variant) {
+      static boolean warned = FALSE;
+      if (!warned) {
+         debug_warning("null variant pointer");
+         warned = TRUE;
+      }
+      return;
+   }
+
    if (inputs->disable) {
       /* This command was partially binned and has been disabled */
       return;
@@ -391,6 +400,19 @@ lp_rast_shade_tile_opaque(struct lp_rasterizer_task *task,
    const struct lp_scene *scene = task->scene;
    unsigned i;
 
+   if (!task->state) {
+      /* This indicates that some sort of rendering command was queued
+       * before we set up the rasterization state.  Just returning here
+       * allows the piglit fbo-mipmap-copypix test to run/pass.
+       */
+      static boolean warned = FALSE;
+      if (!warned) {
+         debug_warning("null state pointer");
+         warned = TRUE;
+      }
+      return;
+   }
+
    LP_DBG(DEBUG_RAST, "%s\n", __FUNCTION__);
 
    /* this will prevent converting the layout from tiled to linear */
@@ -785,6 +807,10 @@ static PIPE_THREAD_ROUTINE( thread_func, init_data )
    boolean debug = false;
 
    while (1) {
+      /* make sure these pointers aren't pointing to old data */
+      task->scene = NULL;
+      task->state = NULL;
+
       /* wait for work */
       if (debug)
          debug_printf("thread %d waiting for work\n", task->thread_index);
index 03e67dc81777ab7721c4a0b98821c180c5d31b37..b7568ec99c04731b751b445685c2685c8dcb5440 100644 (file)
@@ -62,6 +62,9 @@ get_variant( const struct lp_rast_state *state,
              const struct cmd_block *block,
              int k )
 {
+   if (!state)
+      return NULL;
+
    if (block->cmd[k] == LP_RAST_OP_SHADE_TILE ||
        block->cmd[k] == LP_RAST_OP_SHADE_TILE_OPAQUE ||
        block->cmd[k] == LP_RAST_OP_TRIANGLE_1 ||
@@ -140,9 +143,14 @@ debug_shade_tile(int x, int y,
                  char val)
 {
    const struct lp_rast_shader_inputs *inputs = arg.shade_tile;
-   boolean blend = tile->state->variant->key.blend.rt[0].blend_enable;
+   boolean blend;
    unsigned i,j;
 
+   if (!tile->state)
+      return 0;
+
+   blend = tile->state->variant->key.blend.rt[0].blend_enable;
+
    if (inputs->disable)
       return 0;