Use flips for back- and fake front buffers.
This might lead to fake front and real front being shared if the hardware
is page-flip capable.

In any case it will save a full-drawable copy and also the subsequent wait for
the X server to submit that copy to hardware if front-buffer reading or
rendering is enabled.

Signed-off-by: Thomas Hellstrom <thellst...@vmware.com>
---
 src/loader/loader_dri3_helper.c | 26 ++++++++------------------
 1 file changed, 8 insertions(+), 18 deletions(-)

diff --git a/src/loader/loader_dri3_helper.c b/src/loader/loader_dri3_helper.c
index f012e55..041bfc4 100644
--- a/src/loader/loader_dri3_helper.c
+++ b/src/loader/loader_dri3_helper.c
@@ -652,14 +652,14 @@ loader_dri3_swap_buffers_msc(struct loader_dri3_drawable 
*draw,
                                   back->height,
                                   0, 0, back->width,
                                   back->height, __BLIT_FLAG_FLUSH);
-      /* Update the fake front */
-      if (draw->have_fake_front)
-         draw->ext->image->blitImage(dri_context,
-                                     
draw->buffers[LOADER_DRI3_FRONT_ID]->image,
-                                     back->image,
-                                     0, 0, draw->width, draw->height,
-                                     0, 0, draw->width, draw->height,
-                                     __BLIT_FLAG_FLUSH);
+   }
+
+   if (back && draw->have_fake_front) {
+      struct loader_dri3_buffer *tmp;
+
+      tmp = dri3_fake_front_buffer(draw);
+      draw->buffers[LOADER_DRI3_FRONT_ID] = back;
+      draw->buffers[LOADER_DRI3_BACK_ID(draw->cur_back)] = tmp;
    }
 
    dri3_flush_present_events(draw);
@@ -727,16 +727,6 @@ loader_dri3_swap_buffers_msc(struct loader_dri3_drawable 
*draw,
        * to reset the fence and make future users block until
        * the X server is done copying the bits
        */
-      if (draw->have_fake_front && !draw->is_different_gpu) {
-         dri3_fence_reset(draw->conn, draw->buffers[LOADER_DRI3_FRONT_ID]);
-         dri3_copy_area(draw->conn,
-                        back->pixmap,
-                        draw->buffers[LOADER_DRI3_FRONT_ID]->pixmap,
-                        dri3_drawable_gc(draw),
-                        0, 0, 0, 0,
-                        draw->width, draw->height);
-         dri3_fence_trigger(draw->conn, draw->buffers[LOADER_DRI3_FRONT_ID]);
-      }
       xcb_flush(draw->conn);
       if (draw->stamp)
          ++(*draw->stamp);
-- 
2.7.4

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

Reply via email to