[Mesa-dev] [PATCH] dri3: Only update number of back buffers in loader_dri3_get_buffers

Eero Tamminen eero.t.tamminen at intel.com
Mon Apr 30 14:47:56 UTC 2018


Hi,

On 27.04.2018 18:56, Michel Dänzer wrote:
> From: Michel Dänzer <michel.daenzer at amd.com>
> 
> 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
> Fixes: 3160cb86aa92 "egl/x11: Re-allocate buffers if format is suboptimal"
> Signed-off-by: Michel Dänzer <michel.daenzer at amd.com>
> ---
> 
> Sergii, Eero, here's an alternative fix which I think is cleaner, can
> you test it?

Tested on KBL GT2.

Without the patch, there are >30 compiz crashes within ~3h test run.

With the patch, same compiz process works fine for the whole run.

-> looks good to me.


Tested-by: Eero Tamminen <eero.t.tamminen at intel.com>


	- Eero


>   src/loader/loader_dri3_helper.c | 19 +++++++++++--------
>   1 file changed, 11 insertions(+), 8 deletions(-)
> 
> diff --git a/src/loader/loader_dri3_helper.c b/src/loader/loader_dri3_helper.c
> index 23729f7ecb2..6db8303d26d 100644
> --- a/src/loader/loader_dri3_helper.c
> +++ b/src/loader/loader_dri3_helper.c
> @@ -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.
>       */
> 



More information about the mesa-dev mailing list