[Cogl] [PATCH] gl: ensure depth isn't masked during clear

Robert Bragg robert at sixbynine.org
Mon Mar 4 13:50:45 PST 2013


From: Robert Bragg <robert at linux.intel.com>

If a pipeline has been flushed that disables depth writing and then we
try to clear the framebuffer with cogl_framebuffer_clear4f, passing
COGL_BUFFER_BIT_DEPTH then we need to make sure that depth writing is
re-enabled before issuing the glClear call. We also need to make sure
that when the next primitive is flushed that we re-check what state the
depth mask should be in.
---
 cogl/driver/gl/cogl-framebuffer-gl.c | 16 +++++++++++++++-
 1 file changed, 15 insertions(+), 1 deletion(-)

diff --git a/cogl/driver/gl/cogl-framebuffer-gl.c b/cogl/driver/gl/cogl-framebuffer-gl.c
index d367556..b30b3cd 100644
--- a/cogl/driver/gl/cogl-framebuffer-gl.c
+++ b/cogl/driver/gl/cogl-framebuffer-gl.c
@@ -890,7 +890,21 @@ _cogl_framebuffer_gl_clear (CoglFramebuffer *framebuffer,
     }
 
   if (buffers & COGL_BUFFER_BIT_DEPTH)
-    gl_buffers |= GL_DEPTH_BUFFER_BIT;
+    {
+      gl_buffers |= GL_DEPTH_BUFFER_BIT;
+
+      if (ctx->depth_writing_enabled_cache != TRUE)
+        {
+          GE( ctx, glDepthMask (TRUE));
+
+          ctx->depth_writing_enabled_cache = TRUE;
+
+          /* Make sure the DepthMask is updated when the next primitive is drawn */
+          ctx->current_pipeline_changes_since_flush |=
+            COGL_PIPELINE_STATE_DEPTH;
+          ctx->current_pipeline_age--;
+        }
+    }
 
   if (buffers & COGL_BUFFER_BIT_STENCIL)
     gl_buffers |= GL_STENCIL_BUFFER_BIT;
-- 
1.8.1.1



More information about the Cogl mailing list