[Mesa-dev] [PATCH] mesa: only update framebuffer-state for clears

Marek Olšák maraeo at gmail.com
Tue Sep 18 02:07:32 UTC 2018


Reviewed-by: Marek Olšák <marek.olsak at amd.com>

Marek

On Wed, Sep 12, 2018 at 7:02 AM, Erik Faye-Lund
<erik.faye-lund at collabora.com> wrote:
> 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 <erik.faye-lund at collabora.com>
> ---
> This was motivated by seeing an unexpected shader-compile with
> nonsensical state on start-up in glxgears.
>
>  src/mesa/main/clear.c | 34 ++++++++++++++++++++--------------
>  1 file changed, 20 insertions(+), 14 deletions(-)
>
> diff --git a/src/mesa/main/clear.c b/src/mesa/main/clear.c
> index 6beff9ed84..3d2ca490c9 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)
> --
> 2.17.1
>


More information about the mesa-dev mailing list