Reviewed-by: Sinclair Yeh <[email protected]>
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 <[email protected]> > --- > 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 > _______________________________________________ mesa-dev mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-dev
