draw: fix out of memory handling in polygon stipple stage
authorBrian Paul <brianp@vmware.com>
Wed, 30 Jun 2010 17:46:17 +0000 (11:46 -0600)
committerBrian Paul <brianp@vmware.com>
Wed, 30 Jun 2010 17:46:17 +0000 (11:46 -0600)
src/gallium/auxiliary/draw/draw_pipe_pstipple.c

index fff960c7eb5ea726c0be84b3e60fe43c58098971..ed9a53e154dbe4bcf4aaff82dd98cf2c9afb7055 100644 (file)
@@ -363,8 +363,12 @@ generate_pstip_fs(struct pstip_stage *pstip)
    assert(pstip->fs->sampler_unit < PIPE_MAX_SAMPLERS);
 
    pstip->fs->pstip_fs = pstip->driver_create_fs_state(pstip->pipe, &pstip_fs);
-
+   
    FREE((void *)pstip_fs.tokens);
+
+   if (!pstip->fs->pstip_fs)
+      return FALSE;
+
    return TRUE;
 }
 
@@ -603,13 +607,16 @@ pstip_destroy(struct draw_stage *stage)
 }
 
 
+/** Create a new polygon stipple drawing stage object */
 static struct pstip_stage *
-draw_pstip_stage(struct draw_context *draw)
+draw_pstip_stage(struct draw_context *draw, struct pipe_context *pipe)
 {
    struct pstip_stage *pstip = CALLOC_STRUCT(pstip_stage);
    if (pstip == NULL)
       goto fail;
 
+   pstip->pipe = pipe;
+
    pstip->stage.draw = draw;
    pstip->stage.name = "pstip";
    pstip->stage.next = NULL;
@@ -765,14 +772,12 @@ draw_install_pstipple_stage(struct draw_context *draw,
    /*
     * Create / install pgon stipple drawing / prim stage
     */
-   pstip = draw_pstip_stage( draw );
+   pstip = draw_pstip_stage( draw, pipe );
    if (pstip == NULL)
       goto fail;
 
    draw->pipeline.pstipple = &pstip->stage;
 
-   pstip->pipe = pipe;
-
    /* create special texture, sampler state */
    if (!pstip_create_texture(pstip))
       goto fail;