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:
@@ -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)
|
||||
|
Reference in New Issue
Block a user