[Mesa-dev] [PATCH 5/5] dri3: Use SwapBuffer flips for back- and fake front

Axel Davy axel.davy at normalesup.org
Wed Jun 28 17:36:48 UTC 2017


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.

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.

Yours,

Axel Davy

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 <thellstrom at 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);




More information about the mesa-dev mailing list