[Mesa-dev] [PATCH] swrast: fix 32-bit Z overflow bug
Brian Paul
brianp at vmware.com
Mon Feb 6 16:43:05 PST 2012
When using a 32-bit Z buffer the float->uint conversion could overflow
and wrap around if the float value was too large. Add a clamp.
Fixes piglit fbo-readpixels-depth-formats failure.
---
src/mesa/swrast/s_tritemp.h | 5 +++--
1 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/src/mesa/swrast/s_tritemp.h b/src/mesa/swrast/s_tritemp.h
index 061759d..f870dde 100644
--- a/src/mesa/swrast/s_tritemp.h
+++ b/src/mesa/swrast/s_tritemp.h
@@ -624,8 +624,9 @@ static void NAME(struct gl_context *ctx, const SWvertex *v0,
}
else {
/* interpolate depth values w/out scaling */
- zLeft = (GLuint) (z0 + span.attrStepX[FRAG_ATTRIB_WPOS][2] * FixedToFloat(adjx)
- + span.attrStepY[FRAG_ATTRIB_WPOS][2] * FixedToFloat(adjy));
+ float z = (z0 + span.attrStepX[FRAG_ATTRIB_WPOS][2] * FixedToFloat(adjx)
+ + span.attrStepY[FRAG_ATTRIB_WPOS][2] * FixedToFloat(adjy));
+ zLeft = (z > 4294967295.0) ? 0xffffffff : (GLuint) z;
fdzOuter = (GLint) (span.attrStepY[FRAG_ATTRIB_WPOS][2] +
dxOuter * span.attrStepX[FRAG_ATTRIB_WPOS][2]);
}
--
1.7.3.4
More information about the mesa-dev
mailing list