diff options
author | Erik Faye-Lund <[email protected]> | 2018-09-10 22:11:16 +0200 |
---|---|---|
committer | Erik Faye-Lund <[email protected]> | 2018-09-19 11:52:53 +0200 |
commit | fb86365148d5b8f3f06c5e42d9c8440fc1f6693f (patch) | |
tree | 7efeefe05188467f60bbd035fc2ab1f518961c58 | |
parent | 0c82e3603e195e7b0b3ba39caada6d3ff070076f (diff) |
mesa: only update framebuffer-state for clears
If we update the program-state etc, we risk compiling needless shaders,
which can cost quite a bit of performance.
Signed-off-by: Erik Faye-Lund <[email protected]>
Reviewed-by: Marek Olšák <[email protected]>
-rw-r--r-- | src/mesa/main/clear.c | 34 |
1 files changed, 20 insertions, 14 deletions
diff --git a/src/mesa/main/clear.c b/src/mesa/main/clear.c index 6beff9ed842..3d2ca490c9b 100644 --- a/src/mesa/main/clear.c +++ b/src/mesa/main/clear.c @@ -35,6 +35,7 @@ #include "context.h" #include "enums.h" #include "fbobject.h" +#include "framebuffer.h" #include "get.h" #include "macros.h" #include "mtypes.h" @@ -135,10 +136,10 @@ color_buffer_writes_enabled(const struct gl_context *ctx, unsigned idx) * \param mask bit-mask indicating the buffers to be cleared. * * Flushes the vertices and verifies the parameter. - * If __struct gl_contextRec::NewState is set then calls _mesa_update_state() - * to update gl_frame_buffer::_Xmin, etc. If the rasterization mode is set to - * GL_RENDER then requests the driver to clear the buffers, via the - * dd_function_table::Clear callback. + * If __struct gl_contextRec::NewState contains _NEW_BUFFERS then calls + * _mesa_update_framebuffer() to update gl_frame_buffer::_Xmin, etc. If the + * rasterization mode is set to GL_RENDER then requests the driver to clear + * the buffers, via the dd_function_table::Clear callback. */ static ALWAYS_INLINE void clear(struct gl_context *ctx, GLbitfield mask, bool no_error) @@ -165,8 +166,9 @@ clear(struct gl_context *ctx, GLbitfield mask, bool no_error) } } - if (ctx->NewState) { - _mesa_update_state( ctx ); /* update _Xmin, etc */ + if (ctx->NewState & _NEW_BUFFERS) { + _mesa_update_framebuffer(ctx, ctx->ReadBuffer, ctx->DrawBuffer); /* update _Xmin, etc */ + ctx->NewState &= ~_NEW_BUFFERS; } if (!no_error && ctx->DrawBuffer->_Status != GL_FRAMEBUFFER_COMPLETE_EXT) { @@ -346,8 +348,9 @@ clear_bufferiv(struct gl_context *ctx, GLenum buffer, GLint drawbuffer, FLUSH_VERTICES(ctx, 0); FLUSH_CURRENT(ctx, 0); - if (ctx->NewState) { - _mesa_update_state( ctx ); + if (ctx->NewState & _NEW_BUFFERS) { + _mesa_update_framebuffer(ctx, ctx->ReadBuffer, ctx->DrawBuffer); + ctx->NewState &= ~_NEW_BUFFERS; } switch (buffer) { @@ -460,8 +463,9 @@ clear_bufferuiv(struct gl_context *ctx, GLenum buffer, GLint drawbuffer, FLUSH_VERTICES(ctx, 0); FLUSH_CURRENT(ctx, 0); - if (ctx->NewState) { - _mesa_update_state( ctx ); + if (ctx->NewState & _NEW_BUFFERS) { + _mesa_update_framebuffer(ctx, ctx->ReadBuffer, ctx->DrawBuffer); + ctx->NewState &= ~_NEW_BUFFERS; } switch (buffer) { @@ -549,8 +553,9 @@ clear_bufferfv(struct gl_context *ctx, GLenum buffer, GLint drawbuffer, FLUSH_VERTICES(ctx, 0); FLUSH_CURRENT(ctx, 0); - if (ctx->NewState) { - _mesa_update_state( ctx ); + if (ctx->NewState & _NEW_BUFFERS) { + _mesa_update_framebuffer(ctx, ctx->ReadBuffer, ctx->DrawBuffer); + ctx->NewState &= ~_NEW_BUFFERS; } switch (buffer) { @@ -691,8 +696,9 @@ clear_bufferfi(struct gl_context *ctx, GLenum buffer, GLint drawbuffer, if (ctx->RasterDiscard) return; - if (ctx->NewState) { - _mesa_update_state( ctx ); + if (ctx->NewState & _NEW_BUFFERS) { + _mesa_update_framebuffer(ctx, ctx->ReadBuffer, ctx->DrawBuffer); + ctx->NewState &= ~_NEW_BUFFERS; } if (ctx->DrawBuffer->Attachment[BUFFER_DEPTH].Renderbuffer) |