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; }