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@anholt.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7410>
(cherry picked from commit 2e713313a2)
This commit is contained in:
Nanley Chery 2020-11-06 10:55:03 -08:00 committed by Dylan Baker
parent f2d8a62116
commit cd8081867f
2 changed files with 15 additions and 3 deletions

View file

@ -2398,7 +2398,7 @@
"description": "mesa: Clamp some depth values in glClearBufferfi",
"nominated": true,
"nomination_type": 0,
"resolution": 0,
"resolution": 1,
"master_sha": null,
"because_sha": null
},

View file

@ -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 */