loader/dri3: Use dri3_find_back in loader_dri3_swap_buffers_msc
authorThomas Hellstrom <thellstrom@vmware.com>
Tue, 4 Jul 2017 03:55:15 +0000 (12:55 +0900)
committerMichel Dänzer <michel@daenzer.net>
Thu, 13 Jul 2017 07:49:28 +0000 (16:49 +0900)
If the application hasn't done any drawing since the last call, we
would reuse the same back buffer which was used for the previous swap,
which may not have completed yet. This could result in various issues
such as tearing or application hangs.

In the normal case, the behaviour is unchanged.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=97957
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=101683
Cc: mesa-stable@lists.freedesktop.org
[Michel Dänzer: Make Thomas' fix from bugzilla actually work as
 intended, write commit log]

src/loader/loader_dri3_helper.c

index 493a7f5218cd1c76bca8edd93dd3710cdb4b1794..1c93e7a96d397ef6b00d0cbb7087b74b3fe85ea3 100644 (file)
@@ -640,7 +640,7 @@ loader_dri3_swap_buffers_msc(struct loader_dri3_drawable *draw,
 
    draw->vtable->flush_drawable(draw, flush_flags);
 
-   back = draw->buffers[LOADER_DRI3_BACK_ID(draw->cur_back)];
+   back = draw->buffers[dri3_find_back(draw)];
    if (draw->is_different_gpu && back) {
       /* Update the linear buffer before presenting the pixmap */
       draw->ext->image->blitImage(dri_context,