[mutter] cogl/clip-stack-gl: Set glStencilMask correctly for clip rectangles



commit 5991f53c84cdcaaac550d55c0c8dbaa645b90b47
Author: Daniel van Vugt <daniel van vugt canonical com>
Date:   Thu May 20 17:27:41 2021 +0800

    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>

 cogl/cogl/driver/gl/cogl-clip-stack-gl.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
---
diff --git a/cogl/cogl/driver/gl/cogl-clip-stack-gl.c b/cogl/cogl/driver/gl/cogl-clip-stack-gl.c
index bec4d9b453..c2cccf0ee0 100644
--- a/cogl/cogl/driver/gl/cogl-clip-stack-gl.c
+++ b/cogl/cogl/driver/gl/cogl-clip-stack-gl.c
@@ -67,6 +67,7 @@ add_stencil_clip_rectangle (CoglFramebuffer *framebuffer,
 
   GE( ctx, glColorMask (FALSE, FALSE, FALSE, FALSE) );
   GE( ctx, glDepthMask (FALSE) );
+  GE( ctx, glStencilMask (0x3) );
 
   if (merge)
     {
@@ -93,7 +94,6 @@ add_stencil_clip_rectangle (CoglFramebuffer *framebuffer,
   else
     {
       GE( ctx, glEnable (GL_STENCIL_TEST) );
-      GE( ctx, glStencilMask (0x1) );
 
       /* Initially disallow everything */
       GE( ctx, glClearStencil (0) );
@@ -113,6 +113,7 @@ add_stencil_clip_rectangle (CoglFramebuffer *framebuffer,
   /* Restore the stencil mode */
   GE( ctx, glDepthMask (TRUE) );
   GE( ctx, glColorMask (TRUE, TRUE, TRUE, TRUE) );
+  GE( ctx, glStencilMask (0x0) );
   GE( ctx, glStencilFunc (GL_EQUAL, 0x1, 0x1) );
   GE( ctx, glStencilOp (GL_KEEP, GL_KEEP, GL_KEEP) );
 }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]