[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