Mesa (master): mesa: Clamp some depth values in glClearBufferfi

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Nov 13 19:01:49 UTC 2020


Module: Mesa
Branch: master
Commit: 2e713313a29422b38435c91f8277c1893fcad095
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=2e713313a29422b38435c91f8277c1893fcad095

Author: Nanley Chery <nanley.g.chery at intel.com>
Date:   Fri Nov  6 10:55:03 2020 -0800

mesa: Clamp some depth values in glClearBufferfi

OpenGL 3.0 spec, section 4.2.3 "Clearing the Buffers":

   depth and stencil are the values to clear the depth and stencil
   buffers to, respectively. Clamping and type conversion for
   fixed-point depth buffers are performed in the same fashion as for
   ClearDepth.

Enables iris to pass the clearbuffer-depth-stencil piglit test.

Cc: mesa-stable
Reviewed-by: Eric Anholt <eric at anholt.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7410>

---

 src/mesa/main/clear.c | 16 ++++++++++++++--
 1 file changed, 14 insertions(+), 2 deletions(-)

diff --git a/src/mesa/main/clear.c b/src/mesa/main/clear.c
index 0a51a868bae..ba978a06ad6 100644
--- a/src/mesa/main/clear.c
+++ b/src/mesa/main/clear.c
@@ -738,8 +738,20 @@ clear_bufferfi(struct gl_context *ctx, GLenum buffer, GLint drawbuffer,
       const GLclampd clearDepthSave = ctx->Depth.Clear;
       const GLuint clearStencilSave = ctx->Stencil.Clear;
 
-      /* set new clear values */
-      ctx->Depth.Clear = depth;
+      /* set new clear values
+       *
+       * Page 263 (page 279 of the PDF) of the OpenGL 3.0 spec says:
+       *
+       *     "depth and stencil are the values to clear the depth and stencil
+       *     buffers to, respectively. Clamping and type conversion for
+       *     fixed-point depth buffers are performed in the same fashion as
+       *     for ClearDepth."
+       */
+      const struct gl_renderbuffer *rb =
+         ctx->DrawBuffer->Attachment[BUFFER_DEPTH].Renderbuffer;
+      const bool has_float_depth = rb &&
+         _mesa_has_depth_float_channel(rb->InternalFormat);
+      ctx->Depth.Clear = has_float_depth ? depth : SATURATE(depth);
       ctx->Stencil.Clear = stencil;
 
       /* clear buffers */



More information about the mesa-commit mailing list