dri3: Only update number of back buffers in loader_dri3_get_buffers
authorMichel Dänzer <michel.daenzer@amd.com>
Fri, 27 Apr 2018 15:41:48 +0000 (17:41 +0200)
committerMichel Dänzer <michel@daenzer.net>
Wed, 9 May 2018 13:40:41 +0000 (15:40 +0200)
And only free no longer needed back buffers there as well.

We want to stick to the same back buffer throughout a frame, otherwise
we can run into various issues.

Bugzilla: https://bugs.freedesktop.org/105906
Bugzilla: https://bugs.freedesktop.org/106399
Fixes: 3160cb86aa92 "egl/x11: Re-allocate buffers if format is suboptimal"
Reported-by: Sergii Romantsov <sergii.romantsov@globallogic.com>
Tested-by: Eero Tamminen <eero.t.tamminen@intel.com>
Acked-by: Daniel Stone <daniels@collabora.com>
src/loader/loader_dri3_helper.c

index 23729f7ecb247bffcd7ed6ab5ae0281d619d4c38..6db8303d26df595647045d2a7912341094e9ca73 100644 (file)
@@ -420,13 +420,6 @@ dri3_handle_present_event(struct loader_dri3_drawable *draw,
 
          if (buf && buf->pixmap == ie->pixmap)
             buf->busy = 0;
-
-         if (buf && draw->cur_blit_source != b && !buf->busy &&
-             (buf->reallocate ||
-             (draw->num_back <= b && b < LOADER_DRI3_MAX_BACK))) {
-            dri3_free_render_buffer(draw, buf);
-            draw->buffers[b] = NULL;
-         }
       }
       break;
    }
@@ -559,7 +552,6 @@ dri3_find_back(struct loader_dri3_drawable *draw)
    /* Check whether we need to reuse the current back buffer as new back.
     * In that case, wait until it's not busy anymore.
     */
-   dri3_update_num_back(draw);
    num_to_consider = draw->num_back;
    if (!loader_dri3_have_image_blit(draw) && draw->cur_blit_source != -1) {
       num_to_consider = 1;
@@ -1815,6 +1807,7 @@ loader_dri3_get_buffers(__DRIdrawable *driDrawable,
 {
    struct loader_dri3_drawable *draw = loaderPrivate;
    struct loader_dri3_buffer   *front, *back;
+   int buf_id;
 
    buffers->image_mask = 0;
    buffers->front = NULL;
@@ -1826,6 +1819,16 @@ loader_dri3_get_buffers(__DRIdrawable *driDrawable,
    if (!dri3_update_drawable(driDrawable, draw))
       return false;
 
+   dri3_update_num_back(draw);
+
+   /* Free no longer needed back buffers */
+   for (buf_id = draw->num_back; buf_id < LOADER_DRI3_MAX_BACK; buf_id++) {
+      if (draw->cur_blit_source != buf_id && draw->buffers[buf_id]) {
+         dri3_free_render_buffer(draw, draw->buffers[buf_id]);
+         draw->buffers[buf_id] = NULL;
+      }
+   }
+
    /* pixmaps always have front buffers.
     * Exchange swaps also mandate fake front buffers.
     */