st/mesa: fix int->uint conversion for negative scissor bound values

Based on a patch by Xavier Chantry <chantry.xavier@gmail.com>:

If x+width or y+height is negative, then maxx or maxy will get a bogus value
when converting that to unsigned. Fix this by setting 0 as minimal value.

This was also triggered by teeworlds, but only with some combination of
resolution and map section. For example upper part of dm2 at 1280x1024.
This commit is contained in:
Brian Paul
2010-01-24 18:18:17 -07:00
parent e88d6fe299
commit 47d30b0c2c

View File

@@ -31,6 +31,7 @@
*/
#include "main/macros.h"
#include "st_context.h"
#include "pipe/p_context.h"
#include "st_atom.h"
@@ -52,15 +53,19 @@ update_scissor( struct st_context *st )
scissor.maxy = fb->Height;
if (st->ctx->Scissor.Enabled) {
/* need to be careful here with xmax or ymax < 0 */
GLint xmax = MAX2(0, st->ctx->Scissor.X + st->ctx->Scissor.Width);
GLint ymax = MAX2(0, st->ctx->Scissor.Y + st->ctx->Scissor.Height);
if (st->ctx->Scissor.X > (GLint)scissor.minx)
scissor.minx = st->ctx->Scissor.X;
if (st->ctx->Scissor.Y > (GLint)scissor.miny)
scissor.miny = st->ctx->Scissor.Y;
if (st->ctx->Scissor.X + st->ctx->Scissor.Width < (GLint)scissor.maxx)
scissor.maxx = st->ctx->Scissor.X + st->ctx->Scissor.Width;
if (st->ctx->Scissor.Y + st->ctx->Scissor.Height < (GLint)scissor.maxy)
scissor.maxy = st->ctx->Scissor.Y + st->ctx->Scissor.Height;
if (xmax < (GLint) scissor.maxx)
scissor.maxx = xmax;
if (ymax < (GLint) scissor.maxy)
scissor.maxy = ymax;
/* check for null space */
if (scissor.minx >= scissor.maxx || scissor.miny >= scissor.maxy)