From e50e1f86b092d09a24e21122e1284054c54fb3cd Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Sat, 16 Apr 2016 00:29:05 +0200 Subject: [PATCH] gallium/radeon: fix Nine with its slightly shifted viewports just need to do the calculation in floating-point and then round things properly Reviewed-by: Axel Davy --- src/gallium/drivers/radeon/r600_viewport.c | 36 +++++++++++++--------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/src/gallium/drivers/radeon/r600_viewport.c b/src/gallium/drivers/radeon/r600_viewport.c index 980c5ef17e6..5c998c8c435 100644 --- a/src/gallium/drivers/radeon/r600_viewport.c +++ b/src/gallium/drivers/radeon/r600_viewport.c @@ -51,32 +51,38 @@ static void r600_get_scissor_from_viewport(struct r600_common_context *rctx, const struct pipe_viewport_state *vp, struct r600_signed_scissor *scissor) { - int tmp; + float tmp, minx, miny, maxx, maxy; /* Convert (-1, -1) and (1, 1) from clip space into window space. */ - scissor->minx = -vp->scale[0] + vp->translate[0]; - scissor->miny = -vp->scale[1] + vp->translate[1]; - scissor->maxx = vp->scale[0] + vp->translate[0]; - scissor->maxy = vp->scale[1] + vp->translate[1]; + minx = -vp->scale[0] + vp->translate[0]; + miny = -vp->scale[1] + vp->translate[1]; + maxx = vp->scale[0] + vp->translate[0]; + maxy = vp->scale[1] + vp->translate[1]; /* r600_draw_rectangle sets this. Disable the scissor. */ - if (scissor->minx == -1 && scissor->miny == -1 && - scissor->maxx == 1 && scissor->maxy == 1) { + if (minx == -1 && miny == -1 && maxx == 1 && maxy == 1) { scissor->minx = scissor->miny = 0; scissor->maxx = scissor->maxy = GET_MAX_SCISSOR(rctx); + return; } /* Handle inverted viewports. */ - if (scissor->minx > scissor->maxx) { - tmp = scissor->minx; - scissor->minx = scissor->maxx; - scissor->maxx = tmp; + if (minx > maxx) { + tmp = minx; + minx = maxx; + maxx = tmp; } - if (scissor->miny > scissor->maxy) { - tmp = scissor->miny; - scissor->miny = scissor->maxy; - scissor->maxy = tmp; + if (miny > maxy) { + tmp = miny; + miny = maxy; + maxy = tmp; } + + /* Convert to integer and round up the max bounds. */ + scissor->minx = minx; + scissor->miny = miny; + scissor->maxx = ceilf(maxx); + scissor->maxy = ceilf(maxy); } static void r600_clamp_scissor(struct r600_common_context *rctx, -- 2.30.2