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

Marek

Thanks for reviewing, Marek.

/Thomas




On Thu, Jun 22, 2017 at 1:00 PM, Thomas Hellstrom <thellst...@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 <thellst...@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@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=


_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to