diff options
author | Brian Paul <[email protected]> | 2010-01-12 17:08:07 -0700 |
---|---|---|
committer | Brian Paul <[email protected]> | 2010-01-12 17:08:07 -0700 |
commit | 214ffad01598c8780417b9fa9df75e951c8ac049 (patch) | |
tree | 2132c46804a7569cfdd6fb4563d1aa7b32529e28 /src/gallium | |
parent | de10168a462f57ead41800ea135476bb5ae8c678 (diff) |
llvmpipe: clamp maxx,maxy to framebuffer size (in terms of tiles)
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.
Diffstat (limited to 'src/gallium')
-rw-r--r-- | src/gallium/drivers/llvmpipe/lp_setup_tri.c | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/src/gallium/drivers/llvmpipe/lp_setup_tri.c b/src/gallium/drivers/llvmpipe/lp_setup_tri.c index 5197dca8f99..9248125de8b 100644 --- a/src/gallium/drivers/llvmpipe/lp_setup_tri.c +++ b/src/gallium/drivers/llvmpipe/lp_setup_tri.c @@ -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) |