[Mesa-dev] dri3 flipping to fake front?

Thomas Hellstrom thellstrom at vmware.com
Tue Jun 20 13:31:10 UTC 2017


Michel, Eric, others

Do you know what's stopping dri3 from flipping to the fake front instead 
of copying? Like below?

The fake front will of course be "busy" until the server completes the 
present, but that doesn't really stop us from front rendering to it or 
reading from it if so desired?

/Thomas


diff --git a/src/loader/loader_dri3_helper.c 
b/src/loader/loader_dri3_helper.c
index 493a7f5..1ea8d3c 100644
--- a/src/loader/loader_dri3_helper.c
+++ b/src/loader/loader_dri3_helper.c
@@ -650,14 +650,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 (draw->have_fake_front) {
+      struct loader_dri3_buffer *tmp;
+
+      tmp = draw->buffers[LOADER_DRI3_FRONT_ID];
+      draw->buffers[LOADER_DRI3_FRONT_ID] = back;
+ draw->buffers[LOADER_DRI3_BACK_ID(draw->cur_back)] = tmp;
     }

     dri3_flush_present_events(draw);
@@ -725,16 +725,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);



More information about the mesa-dev mailing list