llvmpipe: clamp maxx,maxy to framebuffer size (in terms of tiles)
authorBrian Paul <brianp@vmware.com>
Wed, 13 Jan 2010 00:08:07 +0000 (17:08 -0700)
committerBrian Paul <brianp@vmware.com>
Wed, 13 Jan 2010 00:08:07 +0000 (17:08 -0700)
In some corner cases the right-most / bottom-most vertex can be
right on the edge of the framebuffer.  Because the maxx, maxy vals
are computed with a series of float/int, pixel/tile transformations
we can end up with maxx >= scene->x_tiles or maxy >= scene->y_tiles.
This leads to putting data into bins that never get processed, or
reset.  This becomes stale data that can lead to segfaults.

Clamping fixes this.

src/gallium/drivers/llvmpipe/lp_setup_tri.c

index 5197dca8f9968a6e6e9c9bf75185898ce3def053..9248125de8b0473017b9e842a6061e9b95bd5af1 100644 (file)
@@ -389,6 +389,11 @@ do_triangle_ccw(struct setup_context *setup,
    maxx = tri->maxx / TILE_SIZE;
    maxy = tri->maxy / TILE_SIZE;
 
+   /* Clamp maxx, maxy to framebuffer size
+    */
+   maxx = MIN2(maxx, scene->tiles_x - 1);
+   maxy = MIN2(maxy, scene->tiles_y - 1);
+
    /* Determine which tile(s) intersect the triangle's bounding box
     */
    if (miny == maxy && minx == maxx)