[Mesa-dev] [PATCH 1/2] loader/dri3: Use client local back to front blit in copySubBuffer if available

Axel Davy axel.davy at normalesup.org
Tue Sep 5 05:36:19 UTC 2017


On 04/09/2017 14:27, Thomas Hellstrom wrote:
> The copySubBuffer functionality always attempted a server side blit from
> back to fake front if a fake front was present, and we weren't displaying
> on a remote GPU.
>
> Now that we always have local blit capability on modern drivers, first
> attempt a local blit, and only if that fails, try the server blit.
>
> Signed-off-by: Thomas Hellstrom <thellstrom at vmware.com>
> ---
>   src/loader/loader_dri3_helper.c | 16 +++++++---------
>   1 file changed, 7 insertions(+), 9 deletions(-)
>
> diff --git a/src/loader/loader_dri3_helper.c b/src/loader/loader_dri3_helper.c
> index e3120f5..c0a6e0d 100644
> --- a/src/loader/loader_dri3_helper.c
> +++ b/src/loader/loader_dri3_helper.c
> @@ -635,14 +635,6 @@ loader_dri3_copy_sub_buffer(struct loader_dri3_drawable *draw,
>                                       back->image,
>                                       0, 0, back->width, back->height,
>                                       0, 0, __BLIT_FLAG_FLUSH);
> -      /* We use blit_image to update our fake front,
> -       */
> -      if (draw->have_fake_front)
> -         (void) loader_dri3_blit_image(draw,
> -                                       dri3_fake_front_buffer(draw)->image,
> -                                       back->image,
> -                                       x, y, width, height,
> -                                       x, y, __BLIT_FLAG_FLUSH);
>      }
Why removing that part ? It's a bit easier to read when the 
is_different_gpu path is separated to the normal path here.

>   
>      loader_dri3_swapbuffer_barrier(draw);
> @@ -656,7 +648,13 @@ loader_dri3_copy_sub_buffer(struct loader_dri3_drawable *draw,
>      /* Refresh the fake front (if present) after we just damaged the real
>       * front.
>       */
> -   if (draw->have_fake_front && !draw->is_different_gpu) {
> +   if (draw->have_fake_front &&
> +       !loader_dri3_blit_image(draw,
> +                               dri3_fake_front_buffer(draw)->image,
> +                               back->image,
> +                               x, y, width, height,
> +                               x, y, __BLIT_FLAG_FLUSH) &&
> +       !draw->is_different_gpu) {
>         dri3_fence_reset(draw->conn, dri3_fake_front_buffer(draw));
>         dri3_copy_area(draw->conn,
>                        back->pixmap,

In the case of is_different_gpu, reverting to using a server copy if 
loader_dri3_blit_image fails doesn't seem a good choice, because what 
the server sees is the linear copy of the buffers. You'd have to add a 
blit from the linear copy to the tiled buffer (which won't work if local 
blit is not available).


Yours,


Axel Davy



More information about the mesa-dev mailing list