mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 16:08:04 +02:00
meta: Mask Stencil.Clear against stencilMax in _mesa_meta_Clear
This fixes incorrect behaviour when the stencil clear value exceeds the size of the stencil buffer, for example, when set with: glClearStencil (~1); /* Set a bit pattern of 111...11111110 */ glClear (GL_STENCIL_BUFFER_BIT); The clear value needs to be masked by the value 2^m - 1, where m is the number of bits in the stencil buffer. Previously, we passed the value masked with 0x7fffffff to _mesa_StencilFuncSeparate which then clamps, NOT masks the value to the range 0 to 2^m - 1. The result would be clearing the stencil buffer to 0xff, rather than 0xfe. Signed-off-by: Peter Clifton <pcjc2@cam.ac.uk> Signed-off-by: Brian Paul <brianp@vmware.com>
This commit is contained in:
parent
03a4f97a68
commit
ee88727df8
1 changed files with 2 additions and 1 deletions
|
|
@ -1398,6 +1398,7 @@ _mesa_meta_Clear(struct gl_context *ctx, GLbitfield buffers)
|
|||
struct vertex verts[4];
|
||||
/* save all state but scissor, pixel pack/unpack */
|
||||
GLbitfield metaSave = META_ALL - META_SCISSOR - META_PIXEL_STORE;
|
||||
const GLuint stencilMax = (1 << ctx->DrawBuffer->Visual.stencilBits) - 1;
|
||||
|
||||
if (buffers & BUFFER_BITS_COLOR) {
|
||||
/* if clearing color buffers, don't save/restore colormask */
|
||||
|
|
@ -1453,7 +1454,7 @@ _mesa_meta_Clear(struct gl_context *ctx, GLbitfield buffers)
|
|||
_mesa_StencilOpSeparate(GL_FRONT_AND_BACK,
|
||||
GL_REPLACE, GL_REPLACE, GL_REPLACE);
|
||||
_mesa_StencilFuncSeparate(GL_FRONT_AND_BACK, GL_ALWAYS,
|
||||
ctx->Stencil.Clear & 0x7fffffff,
|
||||
ctx->Stencil.Clear & stencilMax,
|
||||
ctx->Stencil.WriteMask[0]);
|
||||
}
|
||||
else {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue