[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