Since the maximum supported precision for stencil buffers is 8 bits, we should set bits 8:31 in the input mask values to zero.
The problem is that dEQP tests intentionally call glStencilFunc() with mask values of ~0U (0xffffffffU) which overflows to -1 when converted to signed integer by glGet* APIs. 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 Signed-off-by: Haixia Shi <h...@chromium.org> Cc: Ian Romanick <ian.d.roman...@intel.com> --- src/mesa/main/stencil.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/mesa/main/stencil.c b/src/mesa/main/stencil.c index b303bb7..f29187c 100644 --- a/src/mesa/main/stencil.c +++ b/src/mesa/main/stencil.c @@ -198,6 +198,11 @@ _mesa_StencilFunc( GLenum func, GLint ref, GLuint mask ) return; } + /* Since the maximum supported precision for stencil buffers is 8 bits, + * set bits 8:31 in the input mask value to zero. + */ + mask &= 0xFF; + if (face != 0) { if (ctx->Stencil.Function[face] == func && ctx->Stencil.ValueMask[face] == mask && @@ -258,6 +263,11 @@ _mesa_StencilMask( GLuint mask ) if (MESA_VERBOSE & VERBOSE_API) _mesa_debug(ctx, "glStencilMask()\n"); + /* Since the maximum supported precision for stencil buffers is 8 bits, + * set bits 8:31 in the input mask value to zero. + */ + mask &= 0xFF; + if (face != 0) { /* Only modify the EXT_stencil_two_side back-face state. */ @@ -468,6 +478,11 @@ _mesa_StencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask) FLUSH_VERTICES(ctx, _NEW_STENCIL); + /* Since the maximum supported precision for stencil buffers is 8 bits, + * set bits 8:31 in the input mask value to zero. + */ + mask &= 0xFF; + if (face != GL_BACK) { /* set front */ ctx->Stencil.Function[0] = func; @@ -502,6 +517,11 @@ _mesa_StencilMaskSeparate(GLenum face, GLuint mask) FLUSH_VERTICES(ctx, _NEW_STENCIL); + /* Since the maximum supported precision for stencil buffers is 8 bits, + * set bits 8:31 in the input mask value to zero. + */ + mask &= 0xFF; + if (face != GL_BACK) { ctx->Stencil.WriteMask[0] = mask; } -- 2.8.0.rc3.226.g39d4020 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev