summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian Paul <brianp@vmware.com>2014-08-01 16:55:03 -0600
committerBrian Paul <brianp@vmware.com>2014-08-05 10:21:18 -0600
commit36de884ffd09de16006db5ee428426bedf960564 (patch)
tree0b49e0a796de709af1360abf2a791d62fdc6bbf5
parent6719914f982b5700217b34c97551018d1e02ca45 (diff)
downloadexternal_mesa3d-36de884ffd09de16006db5ee428426bedf960564.zip
external_mesa3d-36de884ffd09de16006db5ee428426bedf960564.tar.gz
external_mesa3d-36de884ffd09de16006db5ee428426bedf960564.tar.bz2
st/mesa: adjust Z coordinates for quad clearing
Specify the quad's Z position in clip coordinate space, not normalized Z space. Use viewport scale, translation = 0.5, 0.5. Before, we were specifying the quad's Z position in [0,1] and using viewport scale=1.0, translate=0.0. That works fine, unless your driver needs to work in clip coordinate space and needs to reconstruct viewport near/far values from the scale/translation factors. The VMware svga driver falls into that category. When we did that reconstruction we wound up with near=-1 and far=1 which are outside the limits of [0,1]. In some cases, this caused the quad to be drawn at the wrong depth. In other cases it was clipped away. Fixes some scissored depth clears with VMware driver. This should have no effect on other drivers. We're already using these values for the glBitmap and glDraw/CopyPixels code. Reviewed-by: Roland Scheidegger <sroland@vmware.com>
-rw-r--r--src/mesa/state_tracker/st_cb_clear.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/src/mesa/state_tracker/st_cb_clear.c b/src/mesa/state_tracker/st_cb_clear.c
index 4bfa8d7..2c1414e 100644
--- a/src/mesa/state_tracker/st_cb_clear.c
+++ b/src/mesa/state_tracker/st_cb_clear.c
@@ -173,6 +173,9 @@ draw_quad(struct st_context *st,
return;
}
+ /* Convert Z from [0,1] to [-1,1] range */
+ z = z * 2.0f - 1.0f;
+
/* positions */
vertices[0][0][0] = x0;
vertices[0][0][1] = y0;
@@ -319,11 +322,11 @@ clear_with_quad(struct gl_context *ctx, unsigned clear_buffers)
struct pipe_viewport_state vp;
vp.scale[0] = 0.5f * fb_width;
vp.scale[1] = fb_height * (invert ? -0.5f : 0.5f);
- vp.scale[2] = 1.0f;
+ vp.scale[2] = 0.5f;
vp.scale[3] = 1.0f;
vp.translate[0] = 0.5f * fb_width;
vp.translate[1] = 0.5f * fb_height;
- vp.translate[2] = 0.0f;
+ vp.translate[2] = 0.5f;
vp.translate[3] = 0.0f;
cso_set_viewport(st->cso_context, &vp);
}