From f2d8a62116af40955d3f3a68cfe269bc00624238 Mon Sep 17 00:00:00 2001 From: Nanley Chery Date: Mon, 2 Nov 2020 09:02:42 -0800 Subject: [PATCH] mesa: Clamp some depth values in glClearBufferfv MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit OpenGL 3.0 spec, section 4.2.3 "Clearing the Buffers": If buffer is DEPTH, drawbuffer must be zero, and value points to the single depth value to clear the depth buffer to. 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 piglit test. v2. Add spec citation. (Eric Anholt) v3. Don't clamp floating point formats. (Eric Anholt) Cc: mesa-stable Reviewed-by: Marek Olšák Reviewed-by: Eric Anholt Part-of: (cherry picked from commit 1bf539b3a2129779addde397886870c00045e6d7) --- .pick_status.json | 2 +- src/mesa/main/clear.c | 16 +++++++++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index 4dfcbfc9be7..bf6a8b4dfff 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -2407,7 +2407,7 @@ "description": "mesa: Clamp some depth values in glClearBufferfv", "nominated": true, "nomination_type": 0, - "resolution": 0, + "resolution": 1, "master_sha": null, "because_sha": null }, diff --git a/src/mesa/main/clear.c b/src/mesa/main/clear.c index ca0ecd95b8c..0a51a868bae 100644 --- a/src/mesa/main/clear.c +++ b/src/mesa/main/clear.c @@ -30,6 +30,7 @@ +#include "glformats.h" #include "glheader.h" #include "clear.h" #include "context.h" @@ -589,7 +590,20 @@ clear_bufferfv(struct gl_context *ctx, GLenum buffer, GLint drawbuffer, * hook instead. */ const GLclampd clearSave = ctx->Depth.Clear; - ctx->Depth.Clear = *value; + + /* Page 263 (page 279 of the PDF) of the OpenGL 3.0 spec says: + * + * "If buffer is DEPTH, drawbuffer must be zero, and value points + * to the single depth value to clear the depth buffer to. + * 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 is_float_depth = + _mesa_has_depth_float_channel(rb->InternalFormat); + ctx->Depth.Clear = is_float_depth ? *value : SATURATE(*value); + ctx->Driver.Clear(ctx, BUFFER_BIT_DEPTH); ctx->Depth.Clear = clearSave; }