don't allocate scratch tile in sp_tile_cache_flush_clear() to avoid stack overflow
authorBrian <brian.paul@tungstengraphics.com>
Sat, 15 Dec 2007 16:49:20 +0000 (09:49 -0700)
committerBrian <brian.paul@tungstengraphics.com>
Sat, 15 Dec 2007 16:49:20 +0000 (09:49 -0700)
src/mesa/pipe/softpipe/sp_tile_cache.c

index d637c7291f61dacbc7ca68f7b1586c00269f46d1..a7be3812feaf87592fde7f0e1230a6778ff9a55b 100644 (file)
@@ -58,6 +58,8 @@ struct softpipe_tile_cache
 
    struct pipe_surface *tex_surf;
    int tex_face, tex_level, tex_z;
+
+   struct softpipe_cached_tile tile;  /**< scratch tile for clears */
 };
 
 
@@ -279,11 +281,10 @@ sp_tile_cache_flush_clear(struct pipe_context *pipe,
    const uint w = tc->surface->width;
    const uint h = tc->surface->height;
    uint x, y;
-   struct softpipe_cached_tile tile;
    uint numCleared = 0;
 
-   /* clear one tile to the clear value */
-   clear_tile(&tile, ps->format, tc->clear_val);
+   /* clear the scratch tile to the clear value */
+   clear_tile(&tc->tile, ps->format, tc->clear_val);
 
    /* push the tile to all positions marked as clear */
    for (y = 0; y < h; y += TILE_SIZE) {
@@ -291,7 +292,7 @@ sp_tile_cache_flush_clear(struct pipe_context *pipe,
          if (is_clear_flag_set(tc->clear_flags, x, y)) {
             pipe->put_tile(pipe, ps,
                            x, y, TILE_SIZE, TILE_SIZE,
-                           tile.data.color32, 0/*STRIDE*/);
+                           tc->tile.data.color32, 0/*STRIDE*/);
 
             /* do this? */
             clear_clear_flag(tc->clear_flags, x, y);