diff options
author | Ilia Mirkin <[email protected]> | 2016-11-18 20:19:24 -0500 |
---|---|---|
committer | Ilia Mirkin <[email protected]> | 2016-11-21 21:11:26 -0500 |
commit | 807bc6ea9ee60240b44ca906e875f23d6e4f0ef7 (patch) | |
tree | 9e605aad68a4d0c3e4fd45a47d8b1364d8a94473 /src/gallium/drivers | |
parent | c3dd5b2e3f47f23c8f6651e0d3af6fde7486656d (diff) |
swr: calculate viewport width/height based on the scale
The former calculations were for min/max y. The width/height don't take
translate into account.
Signed-off-by: Ilia Mirkin <[email protected]>
Reviewed-by: Tim Rowley <[email protected]>
Diffstat (limited to 'src/gallium/drivers')
-rw-r--r-- | src/gallium/drivers/swr/swr_state.cpp | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/src/gallium/drivers/swr/swr_state.cpp b/src/gallium/drivers/swr/swr_state.cpp index a48baec251a..c4d7f0319ef 100644 --- a/src/gallium/drivers/swr/swr_state.cpp +++ b/src/gallium/drivers/swr/swr_state.cpp @@ -976,9 +976,9 @@ swr_update_derived(struct pipe_context *pipe, SWR_VIEWPORT_MATRICES *vpm = &ctx->derived.vpm; vp->x = state->translate[0] - state->scale[0]; - vp->width = state->translate[0] + state->scale[0]; + vp->width = 2 * state->scale[0]; vp->y = state->translate[1] - fabs(state->scale[1]); - vp->height = state->translate[1] + fabs(state->scale[1]); + vp->height = 2 * fabs(state->scale[1]); util_viewport_zmin_zmax(state, rasterizer->clip_halfz, &vp->minZ, &vp->maxZ); @@ -991,10 +991,16 @@ swr_update_derived(struct pipe_context *pipe, /* Now that the matrix is calculated, clip the view coords to screen * size. OpenGL allows for -ve x,y in the viewport. */ - vp->x = std::max(vp->x, 0.0f); - vp->y = std::max(vp->y, 0.0f); - vp->width = std::min(vp->width, (float)fb->width); - vp->height = std::min(vp->height, (float)fb->height); + if (vp->x < 0.0f) { + vp->width += vp->x; + vp->x = 0.0f; + } + if (vp->y < 0.0f) { + vp->height += vp->y; + vp->y = 0.0f; + } + vp->width = std::min(vp->width, (float)fb->width - vp->x); + vp->height = std::min(vp->height, (float)fb->height - vp->y); SwrSetViewports(ctx->swrContext, 1, vp, vpm); } |