[Mesa-dev] [PATCH 4/4] swrast: fix EXT_depth_bounds_test

Brian Paul brianp at vmware.com
Thu Aug 13 13:49:31 PDT 2015


One minor nit below.

For 1, 2, 4:
Reviewed-by: Brian Paul <brianp at vmware.com>

On 08/13/2015 02:32 PM, Marek Olšák wrote:
> From: Marek Olšák <marek.olsak at amd.com>
>
> zMin and zMax can't use _DepthMaxF, because the test is done in Z32_UNORM.
>
> Probably a useless patch given how popular swrast is nowadays, but it helped
> create and validate the piglit test.
> ---
>   src/mesa/swrast/s_depth.c | 14 ++++++++++++--
>   1 file changed, 12 insertions(+), 2 deletions(-)
>
> diff --git a/src/mesa/swrast/s_depth.c b/src/mesa/swrast/s_depth.c
> index 134f897..0a03541 100644
> --- a/src/mesa/swrast/s_depth.c
> +++ b/src/mesa/swrast/s_depth.c
> @@ -419,8 +419,8 @@ _swrast_depth_bounds_test( struct gl_context *ctx, SWspan *span )
>      struct gl_framebuffer *fb = ctx->DrawBuffer;
>      struct gl_renderbuffer *rb = fb->Attachment[BUFFER_DEPTH].Renderbuffer;
>      GLubyte *zStart;
> -   GLuint zMin = (GLuint) (ctx->Depth.BoundsMin * fb->_DepthMaxF + 0.5F);
> -   GLuint zMax = (GLuint) (ctx->Depth.BoundsMax * fb->_DepthMaxF + 0.5F);
> +   GLuint zMin = (double)ctx->Depth.BoundsMin * 0xffffffff;
> +   GLuint zMax = (double)ctx->Depth.BoundsMax * 0xffffffff;

I think a final cast to GLuint is needed to avoid an 'implicit 
conversion from double to int' warning with some compilers.



>      GLubyte *mask = span->array->mask;
>      const GLuint count = span->end;
>      GLuint i;
> @@ -444,6 +444,16 @@ _swrast_depth_bounds_test( struct gl_context *ctx, SWspan *span )
>         zBufferVals = (const GLuint *) zStart;
>      }
>      else {
> +      /* Round the bounds to the precision of the zbuffer. */
> +      if (rb->Format == MESA_FORMAT_Z_UNORM16) {
> +         zMin = (zMin & 0xffff0000) | (zMin >> 16);
> +         zMax = (zMax & 0xffff0000) | (zMax >> 16);
> +      } else {
> +         /* 24 bits */
> +         zMin = (zMin & 0xffffff00) | (zMin >> 24);
> +         zMax = (zMax & 0xffffff00) | (zMax >> 24);
> +      }
> +
>         /* unpack Z values into a temporary array */
>         if (span->arrayMask & SPAN_XY) {
>            get_z32_values(ctx, rb, count, span->array->x, span->array->y,
>



More information about the mesa-dev mailing list