diff options
author | Nanley Chery <nanley.g.chery@intel.com> | 2020-11-02 09:02:42 -0800 |
---|---|---|
committer | Marge Bot <eric+marge@anholt.net> | 2020-11-13 18:41:53 +0000 |
commit | 1bf539b3a2129779addde397886870c00045e6d7 (patch) | |
tree | ccaad0ff1da8f8c69c5bf40a1ea586e22ef61b02 | |
parent | fda015023af5d0d2d844d5fde07a8c19e4d8f453 (diff) | |
download | external_mesa3d-1bf539b3a2129779addde397886870c00045e6d7.tar.gz external_mesa3d-1bf539b3a2129779addde397886870c00045e6d7.tar.bz2 external_mesa3d-1bf539b3a2129779addde397886870c00045e6d7.zip |
mesa: Clamp some depth values in glClearBufferfv
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 <marek.olsak@amd.com>
Reviewed-by: Eric Anholt <eric@anholt.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7410>
-rw-r--r-- | src/mesa/main/clear.c | 16 |
1 files changed, 15 insertions, 1 deletions
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; } |