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

Thomas Hellstrom thellstrom at vmware.com
Tue Jun 27 05:29:12 UTC 2017


On 06/26/2017 09:31 PM, Marek Olšák wrote:
> Reviewed-by: Marek Olšák <marek.olsak at amd.com>
>
> Marek

Thanks for reviewing, Marek.

/Thomas



>
> On Thu, Jun 22, 2017 at 1:00 PM, Thomas Hellstrom <thellstrom at vmware.com> 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
>>
>> _______________________________________________
>> mesa-dev mailing list
>> mesa-dev at lists.freedesktop.org
>> https://urldefense.proofpoint.com/v2/url?u=https-3A__lists.freedesktop.org_mailman_listinfo_mesa-2Ddev&d=DwIFaQ&c=uilaK90D4TOVoH58JNXRgQ&r=wnSlgOCqfpNS4d02vP68_E9q2BNMCwfD2OZ_6dCFVQQ&m=zWPqN0aIKcvp7mhTQrh2FZuo9wfU8CuODAoVnPhPwp4&s=YUzjEKkZ5Kpaxxih7C5MbrIs33JnL6Tc74IkM-I_4cQ&e=




More information about the mesa-dev mailing list