[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