[Mesa-dev] [PATCH v2] mesa: Initializes the stencil value masks to 0xFF instead of ~0u

Ian Romanick idr at freedesktop.org
Mon Dec 15 11:30:30 PST 2014


On 12/15/2014 08:04 AM, Eduardo Lima Mitev wrote:
> 4.1.4 Stencil Test section of the GLES3 spec says: "In the initial state,
> [...] the front and back stencil mask are both set to the value 2 s − 1,
> where s is greater than or equal to the number of bits in the deepest
> stencil buffer* supported by the GL implementation."
> 
> Since the maximum supported precision for stencil buffers is 8 bits, mask
> values should be initialized to 2^8 - 1 = 0xFF.
> 
> Currently, these masks are initialized to max unsigned integer (~0u), which
> causes their values to overflow to -1 when converted to signed int by glGet* APIs.

I did some research on this... before desktop OpenGL 3.1, the spec said
something quite different.  Please add the following to the commit message:

"In OpenGL 3.0 and before, the an initial value of ~0u was specified:

    In the initial state, stenciling is disabled, the front and back
    stencil reference value are both zero, the front and back stencil
    comparison functions are both ALWAYS, and the front and back
    stencil mask are both all ones."


With that, this patch is

Reviewed-by: Ian Romanick <ian.d.romanick at intel.com>

> This patch intializes the stencil value masks to 0xFF instead.
> 
> Fixes 6 dEQP failing tests:
> * dEQP-GLES3.functional.state_query.integers.stencil_value_mask_getfloat
> * dEQP-GLES3.functional.state_query.integers.stencil_back_value_mask_getfloat
> * dEQP-GLES3.functional.state_query.integers.stencil_value_mask_separate_getfloat
> * dEQP-GLES3.functional.state_query.integers.stencil_value_mask_separate_both_getfloat
> * dEQP-GLES3.functional.state_query.integers.stencil_back_value_mask_separate_getfloat
> * dEQP-GLES3.functional.state_query.integers.stencil_back_value_mask_separate_both_getfloat
> ---
>  src/mesa/main/stencil.c | 24 ++++++++++++++++++------
>  1 file changed, 18 insertions(+), 6 deletions(-)
> 
> diff --git a/src/mesa/main/stencil.c b/src/mesa/main/stencil.c
> index f65116a..71932cf 100644
> --- a/src/mesa/main/stencil.c
> +++ b/src/mesa/main/stencil.c
> @@ -573,12 +573,24 @@ _mesa_init_stencil(struct gl_context *ctx)
>     ctx->Stencil.Ref[0] = 0;
>     ctx->Stencil.Ref[1] = 0;
>     ctx->Stencil.Ref[2] = 0;
> -   ctx->Stencil.ValueMask[0] = ~0U;
> -   ctx->Stencil.ValueMask[1] = ~0U;
> -   ctx->Stencil.ValueMask[2] = ~0U;
> -   ctx->Stencil.WriteMask[0] = ~0U;
> -   ctx->Stencil.WriteMask[1] = ~0U;
> -   ctx->Stencil.WriteMask[2] = ~0U;
> +
> +   /* 4.1.4 Stencil Test section of the GLES3 spec says:
> +    *
> +    *     "In the initial state, [...] the front and back stencil mask are both
> +    *     set to the value 2 s − 1, where s is greater than or equal to the
> +    *     number of bits in the deepest stencil buffer* supported by the GL
> +    *     implementation."
> +    *
> +    * Since the maximum supported precision for stencil buffers is 8 bits,
> +    * mask values should be initialized to 2^8 - 1 = 0xFF.
> +    */
> +   ctx->Stencil.ValueMask[0] = 0xFF;
> +   ctx->Stencil.ValueMask[1] = 0xFF;
> +   ctx->Stencil.ValueMask[2] = 0xFF;
> +   ctx->Stencil.WriteMask[0] = 0xFF;
> +   ctx->Stencil.WriteMask[1] = 0xFF;
> +   ctx->Stencil.WriteMask[2] = 0xFF;
> +
>     ctx->Stencil.Clear = 0;
>     ctx->Stencil._BackFace = 1;
>  }
> 



More information about the mesa-dev mailing list