[Mesa-dev] [PATCH] mesa/st: Reduce the number of frontbuffer flush calls

Sinclair Yeh syeh at vmware.com
Tue Jul 4 13:44:35 UTC 2017


Reviewed-by: Sinclair Yeh <syeh at vmware.com>

On Thu, Jun 22, 2017 at 01:00:39PM +0200, Thomas Hellstrom wrote:
> The mesa state tracker was needlessly flushing the front buffer even if it
> hadn't been drawn to since the last flush. This was happening during
> glXSwapBuffers if we at some point previously had set that frontbuffer as
> a read- or draw renderbuffer, or at glFlush() or glFinish() if we at some
> point previously had rendered to the front buffer. Since the frontbuffer
> flush typically means a full drawable copy, it's a pretty big waste.
> 
> Signed-off-by: Thomas Hellstrom <thellstrom at vmware.com>
> ---
>  src/mesa/state_tracker/st_cb_flush.c | 37 ++----------------------------------
>  src/mesa/state_tracker/st_manager.c  | 12 ++++++++----
>  2 files changed, 10 insertions(+), 39 deletions(-)
> 
> diff --git a/src/mesa/state_tracker/st_cb_flush.c b/src/mesa/state_tracker/st_cb_flush.c
> index e8c6672..5a26018 100644
> --- a/src/mesa/state_tracker/st_cb_flush.c
> +++ b/src/mesa/state_tracker/st_cb_flush.c
> @@ -46,35 +46,6 @@
>  #include "util/u_gen_mipmap.h"
>  
>  
> -/** Check if we have a front color buffer and if it's been drawn to. */
> -static inline GLboolean
> -is_front_buffer_dirty(struct st_context *st)
> -{
> -   struct gl_framebuffer *fb = st->ctx->DrawBuffer;
> -   struct st_renderbuffer *strb
> -      = st_renderbuffer(fb->Attachment[BUFFER_FRONT_LEFT].Renderbuffer);
> -   return strb && strb->defined;
> -}
> -
> -
> -/**
> - * Tell the screen to display the front color buffer on-screen.
> - */
> -static void
> -display_front_buffer(struct st_context *st)
> -{
> -   struct gl_framebuffer *fb = st->ctx->DrawBuffer;
> -   struct st_renderbuffer *strb
> -      = st_renderbuffer(fb->Attachment[BUFFER_FRONT_LEFT].Renderbuffer);
> -
> -   if (strb) {
> -      /* Hook for copying "fake" frontbuffer if necessary:
> -       */
> -      st_manager_flush_frontbuffer(st);
> -   }
> -}
> -
> -
>  void st_flush(struct st_context *st,
>                struct pipe_fence_handle **fence,
>                unsigned flags)
> @@ -122,9 +93,7 @@ static void st_glFlush(struct gl_context *ctx)
>      */
>     st_flush(st, NULL, 0);
>  
> -   if (is_front_buffer_dirty(st)) {
> -      display_front_buffer(st);
> -   }
> +   st_manager_flush_frontbuffer(st);
>  }
>  
>  
> @@ -137,9 +106,7 @@ static void st_glFinish(struct gl_context *ctx)
>  
>     st_finish(st);
>  
> -   if (is_front_buffer_dirty(st)) {
> -      display_front_buffer(st);
> -   }
> +   st_manager_flush_frontbuffer(st);
>  }
>  
>  
> diff --git a/src/mesa/state_tracker/st_manager.c b/src/mesa/state_tracker/st_manager.c
> index 9978e3f..ea67097 100644
> --- a/src/mesa/state_tracker/st_manager.c
> +++ b/src/mesa/state_tracker/st_manager.c
> @@ -839,11 +839,15 @@ st_manager_flush_frontbuffer(struct st_context *st)
>  
>     if (stfb)
>        strb = st_renderbuffer(stfb->Base.Attachment[BUFFER_FRONT_LEFT].Renderbuffer);
> -   if (!strb)
> -      return;
>  
> -   /* never a dummy fb */
> -   stfb->iface->flush_front(&st->iface, stfb->iface, ST_ATTACHMENT_FRONT_LEFT);
> +   /* Do we have a front color buffer and has it been drawn to since last
> +    * frontbuffer flush?
> +    */
> +   if (strb && strb->defined) {
> +      stfb->iface->flush_front(&st->iface, stfb->iface,
> +                               ST_ATTACHMENT_FRONT_LEFT);
> +      strb->defined = GL_FALSE;
> +   }
>  }
>  
>  /**
> -- 
> 2.7.4
> 


More information about the mesa-dev mailing list