[Mesa-dev] [PATCH] swrast: fix Z testing of points/lines for 16-bit depth buffers
Jose Fonseca
jfonseca at vmware.com
Mon Jan 9 11:09:04 PST 2012
----- Original Message -----
> 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.
> ---
> 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 53f21cb..42724c7 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;
is ztest16 still necessary?
Otherwise looks good.
Jose
> - 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 */
> --
> 1.7.3.4
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
More information about the mesa-dev
mailing list