diff options
author | Brian Paul <[email protected]> | 2012-01-07 14:16:27 -0700 |
---|---|---|
committer | Brian Paul <[email protected]> | 2012-01-07 14:16:27 -0700 |
commit | 282292f24c0668516db6225114461544b5d38004 (patch) | |
tree | 90661ce88c7747876d98acadf654bca750ee126a | |
parent | 8dffb6bdab25dcacf165851e9d1fdb3beb73099a (diff) |
swrast: fix Z testing of points/lines for 16-bit depth buffers
We were comparing 32-bit Z buffer values against 16-bit fragment values.
Need to do scaling like for the 24-bit case.
Triangle Z testing was OK since it didn't hit this code path.
-rw-r--r-- | src/mesa/swrast/s_depth.c | 36 |
1 files changed, 29 insertions, 7 deletions
diff --git a/src/mesa/swrast/s_depth.c b/src/mesa/swrast/s_depth.c index 53f21cb698e..42724c72b8e 100644 --- a/src/mesa/swrast/s_depth.c +++ b/src/mesa/swrast/s_depth.c @@ -205,6 +205,7 @@ _swrast_depth_clamp_span( struct gl_context *ctx, SWspan *span ) /** * Get array of 32-bit z values from the depth buffer. With clipping. + * Note: the returned values are always in the range [0, 2^32-1]. */ static void get_z32_values(struct gl_context *ctx, struct gl_renderbuffer *rb, @@ -235,6 +236,11 @@ get_z32_values(struct gl_context *ctx, struct gl_renderbuffer *rb, } } + +/** + * Put an array of 32-bit z values into the depth buffer. + * Note: the z values are always in the range [0, 2^32-1]. + */ static void put_z32_values(struct gl_context *ctx, struct gl_renderbuffer *rb, GLuint count, const GLint x[], const GLint y[], @@ -284,8 +290,8 @@ _swrast_depth_test_span(struct gl_context *ctx, SWspan *span) void *zBufferVals; GLuint *zBufferTemp = NULL; GLuint passed; + GLuint zBits = _mesa_get_format_bits(rb->Format, GL_DEPTH_BITS); GLboolean ztest16 = GL_FALSE; - GLboolean ztest24 = _mesa_get_format_bits(rb->Format, GL_DEPTH_BITS) == 24; if (rb->Format == MESA_FORMAT_Z16 && !(span->arrayMask & SPAN_XY)) { /* directly read/write row of 16-bit Z values */ @@ -310,7 +316,7 @@ _swrast_depth_test_span(struct gl_context *ctx, SWspan *span) _mesa_unpack_uint_z_row(rb->Format, count, zStart, zBufferTemp); } - if (ztest24) { + if (zBits == 24) { GLuint i; /* Convert depth buffer values from 32 to 24 bits to match the * fragment Z values generated by rasterization. @@ -319,6 +325,16 @@ _swrast_depth_test_span(struct gl_context *ctx, SWspan *span) zBufferTemp[i] >>= 8; } } + else if (zBits == 16) { + GLuint i; + /* Convert depth buffer values from 32 to 16 bits */ + for (i = 0; i < count; i++) { + zBufferTemp[i] >>= 16; + } + } + else { + assert(zBits == 32); + } zBufferVals = zBufferTemp; } @@ -332,16 +348,22 @@ _swrast_depth_test_span(struct gl_context *ctx, SWspan *span) if (zBufferTemp) { /* need to write temp Z values back into the buffer */ - if (ztest24) { + /* Convert depth buffer values back to 32-bit values. The least + * significant bits don't matter since they'll get dropped when + * they're packed back into the depth buffer. + */ + if (zBits == 24) { GLuint i; - /* Convert depth buffer values back to 32-bit values. The least - * significant bits don't matter since they'll get dropped when - * they're packed back into the depth buffer. - */ for (i = 0; i < count; i++) { zBufferTemp[i] = (zBufferTemp[i] << 8); } } + else if (zBits == 16) { + GLuint i; + for (i = 0; i < count; i++) { + zBufferTemp[i] = zBufferTemp[i] << 16; + } + } if (span->arrayMask & SPAN_XY) { /* random locations */ |