Mesa (master): mesa: Clamp some depth values in glClearBufferfv
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Fri Nov 13 19:01:49 UTC 2020
Module: Mesa
Branch: master
Commit: 1bf539b3a2129779addde397886870c00045e6d7
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=1bf539b3a2129779addde397886870c00045e6d7
Author: Nanley Chery <nanley.g.chery at intel.com>
Date: Mon Nov 2 09:02:42 2020 -0800
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 at amd.com>
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, 15 insertions(+), 1 deletion(-)
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;
}
More information about the mesa-commit
mailing list