On 06/28/2017 07:36 PM, Axel Davy wrote:
Hi,

To my knowledge, this is invalid to switch the front fake buffer with the back buffer.

The front buffer is supposed to take into account what the app draws with the xserver commands, etc.

SwapBuffers should bring the contents of the back buffer to the front (and fake front if applicable) buffer, and the backbuffer contents become undefined, or tagged with a certain age. None of this is violated here. The old back buffer will become the new fake front and appropriately synced with X rendering as needed.

Is there a specific scenario you are concerned with?


Plus, if there is draw->width and back->width, I guess they can be different size, thus switching may be incorrect relative to buffer size too.

Fake front and back are resized at the same time with dri3 AFAICT. This means that with respect to dimensions, the new code should be equivalent to the old one.


Yours,

Axel Davy

Thanks,

Thomas




On 22/06/2017 12:42, Thomas Hellstrom wrote:
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);



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

Reply via email to