From 34e8d0e4baedeb658b87d64577f6acc766b3f51f Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Mon, 26 Jun 2017 17:44:44 +0200 Subject: [PATCH] mesa: add clear() helper Signed-off-by: Samuel Pitoiset Reviewed-by: Timothy Arceri --- src/mesa/main/clear.c | 54 +++++++++++++++++++++++++------------------ 1 file changed, 31 insertions(+), 23 deletions(-) diff --git a/src/mesa/main/clear.c b/src/mesa/main/clear.c index 884cf986c70..1b07a756ee4 100644 --- a/src/mesa/main/clear.c +++ b/src/mesa/main/clear.c @@ -140,40 +140,36 @@ color_buffer_writes_enabled(const struct gl_context *ctx, unsigned idx) * GL_RENDER then requests the driver to clear the buffers, via the * dd_function_table::Clear callback. */ -void GLAPIENTRY -_mesa_Clear( GLbitfield mask ) +static ALWAYS_INLINE void +clear(struct gl_context *ctx, GLbitfield mask, bool no_error) { - GET_CURRENT_CONTEXT(ctx); FLUSH_VERTICES(ctx, 0); - FLUSH_CURRENT(ctx, 0); - if (MESA_VERBOSE & VERBOSE_API) - _mesa_debug(ctx, "glClear 0x%x\n", mask); - - if (mask & ~(GL_COLOR_BUFFER_BIT | - GL_DEPTH_BUFFER_BIT | - GL_STENCIL_BUFFER_BIT | - GL_ACCUM_BUFFER_BIT)) { - /* invalid bit set */ - _mesa_error( ctx, GL_INVALID_VALUE, "glClear(0x%x)", mask); - return; - } + if (!no_error) { + if (mask & ~(GL_COLOR_BUFFER_BIT | + GL_DEPTH_BUFFER_BIT | + GL_STENCIL_BUFFER_BIT | + GL_ACCUM_BUFFER_BIT)) { + _mesa_error( ctx, GL_INVALID_VALUE, "glClear(0x%x)", mask); + return; + } - /* Accumulation buffers were removed in core contexts, and they never - * existed in OpenGL ES. - */ - if ((mask & GL_ACCUM_BUFFER_BIT) != 0 - && (ctx->API == API_OPENGL_CORE || _mesa_is_gles(ctx))) { - _mesa_error( ctx, GL_INVALID_VALUE, "glClear(GL_ACCUM_BUFFER_BIT)"); - return; + /* Accumulation buffers were removed in core contexts, and they never + * existed in OpenGL ES. + */ + if ((mask & GL_ACCUM_BUFFER_BIT) != 0 + && (ctx->API == API_OPENGL_CORE || _mesa_is_gles(ctx))) { + _mesa_error( ctx, GL_INVALID_VALUE, "glClear(GL_ACCUM_BUFFER_BIT)"); + return; + } } if (ctx->NewState) { _mesa_update_state( ctx ); /* update _Xmin, etc */ } - if (ctx->DrawBuffer->_Status != GL_FRAMEBUFFER_COMPLETE_EXT) { + if (!no_error && ctx->DrawBuffer->_Status != GL_FRAMEBUFFER_COMPLETE_EXT) { _mesa_error(ctx, GL_INVALID_FRAMEBUFFER_OPERATION_EXT, "glClear(incomplete framebuffer)"); return; @@ -227,6 +223,18 @@ _mesa_Clear( GLbitfield mask ) } +void GLAPIENTRY +_mesa_Clear(GLbitfield mask) +{ + GET_CURRENT_CONTEXT(ctx); + + if (MESA_VERBOSE & VERBOSE_API) + _mesa_debug(ctx, "glClear 0x%x\n", mask); + + clear(ctx, mask, false); +} + + /** Returned by make_color_buffer_mask() for errors */ #define INVALID_MASK ~0x0U -- 2.30.2