cogl/clip-stack-gl: Set glStencilMask correctly for clip rectangles
Previously we were using a mask of 0x1 for the lifetime of the stencil. This was wrong for two reasons: * The intersection algorithm needs to count up to a maximum 2, so a mask of 1 would clamp to 1 instead. Then decrementing all pixels resulted in all pixels being zero even though we want some to be 1. So the stencil then blocked some color buffer pixels being rendered. * The lifetime of the mask was too long. By leaving it non-zero at the end of the function we could accidentally end up modifying the stencil contents during our later color buffer paints. This fixes missing rendering of some actors seen in gnome-shell with test case: `env COGL_DEBUG=stencilling CLUTTER_PAINT=disable-clipped-redraws` Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1873>
This commit is contained in:
parent
c3d64cc05b
commit
5991f53c84
@ -67,6 +67,7 @@ add_stencil_clip_rectangle (CoglFramebuffer *framebuffer,
|
|||||||
|
|
||||||
GE( ctx, glColorMask (FALSE, FALSE, FALSE, FALSE) );
|
GE( ctx, glColorMask (FALSE, FALSE, FALSE, FALSE) );
|
||||||
GE( ctx, glDepthMask (FALSE) );
|
GE( ctx, glDepthMask (FALSE) );
|
||||||
|
GE( ctx, glStencilMask (0x3) );
|
||||||
|
|
||||||
if (merge)
|
if (merge)
|
||||||
{
|
{
|
||||||
@ -93,7 +94,6 @@ add_stencil_clip_rectangle (CoglFramebuffer *framebuffer,
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
GE( ctx, glEnable (GL_STENCIL_TEST) );
|
GE( ctx, glEnable (GL_STENCIL_TEST) );
|
||||||
GE( ctx, glStencilMask (0x1) );
|
|
||||||
|
|
||||||
/* Initially disallow everything */
|
/* Initially disallow everything */
|
||||||
GE( ctx, glClearStencil (0) );
|
GE( ctx, glClearStencil (0) );
|
||||||
@ -113,6 +113,7 @@ add_stencil_clip_rectangle (CoglFramebuffer *framebuffer,
|
|||||||
/* Restore the stencil mode */
|
/* Restore the stencil mode */
|
||||||
GE( ctx, glDepthMask (TRUE) );
|
GE( ctx, glDepthMask (TRUE) );
|
||||||
GE( ctx, glColorMask (TRUE, TRUE, TRUE, TRUE) );
|
GE( ctx, glColorMask (TRUE, TRUE, TRUE, TRUE) );
|
||||||
|
GE( ctx, glStencilMask (0x0) );
|
||||||
GE( ctx, glStencilFunc (GL_EQUAL, 0x1, 0x1) );
|
GE( ctx, glStencilFunc (GL_EQUAL, 0x1, 0x1) );
|
||||||
GE( ctx, glStencilOp (GL_KEEP, GL_KEEP, GL_KEEP) );
|
GE( ctx, glStencilOp (GL_KEEP, GL_KEEP, GL_KEEP) );
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user