diff options
author | Marek Olšák <[email protected]> | 2016-04-16 00:29:05 +0200 |
---|---|---|
committer | Marek Olšák <[email protected]> | 2016-04-18 19:51:24 +0200 |
commit | e50e1f86b092d09a24e21122e1284054c54fb3cd (patch) | |
tree | e05881a096f80dcd55bbf38c6a6b97e06915a847 | |
parent | ee5b35142a822a7f1f2f6ee0d866f5aa4a0311d4 (diff) |
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 <[email protected]>
-rw-r--r-- | src/gallium/drivers/radeon/r600_viewport.c | 36 |
1 files 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, |