[Mesa-stable] [Mesa-dev] [PATCH] loader/dri3: Avoid freeing renderbuffers in use

Vadim Shovkoplias vadim.shovkoplias at gmail.com
Thu Jan 11 11:02:59 UTC 2018


Tested-by: Vadym Shovkoplias <vadym.shovkoplias at globallogic.com>

This patch also fixes similar issue with SHENZHEN I/O game (
https://bugs.freedesktop.org/show_bug.cgi?id=104392)
Tested on HP Zbook.

2018-01-11 11:53 GMT+02:00 Thomas Hellstrom <thellstrom at vmware.com>:

> Upon reception of an event that lowered the number of active back buffers,
> the code would immediately try to free all back buffers with an id equal
> to or
> higher than the new number of active back buffers.
>
> However, that could lead to an active or to-be-active back buffer being
> freed,
> since the old number of back buffers was used when obtaining an idle back
> buffer for use.
>
> This lead to crashes when lowering the number of active back buffers by
> transitioning from page-flipping to non-page-flipping presents.
>
> Fix this by computing the number of active back buffers only when trying to
> obtain a new back buffer.
>
> Fixes: 15e208c4cc ("loader/dri3: Don't accidently free buffer holding new
> back content")
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=104214
> Cc: "17.3" <mesa-stable at lists.freedesktop.org>
> Signed-off-by: Thomas Hellstrom <thellstrom at vmware.com>
> ---
>  src/loader/loader_dri3_helper.c | 6 +++---
>  1 file changed, 3 insertions(+), 3 deletions(-)
>
> diff --git a/src/loader/loader_dri3_helper.c b/src/loader/loader_dri3_
> helper.c
> index cc890bc..c01b0ac 100644
> --- a/src/loader/loader_dri3_helper.c
> +++ b/src/loader/loader_dri3_helper.c
> @@ -205,7 +205,6 @@ void
>  loader_dri3_set_swap_interval(struct loader_dri3_drawable *draw, int
> interval)
>  {
>     draw->swap_interval = interval;
> -   dri3_update_num_back(draw);
>  }
>
>  /** dri3_free_render_buffer
> @@ -377,7 +376,6 @@ dri3_handle_present_event(struct loader_dri3_drawable
> *draw,
>              draw->flipping = false;
>              break;
>           }
> -         dri3_update_num_back(draw);
>
>           if (draw->vtable->show_fps)
>              draw->vtable->show_fps(draw, ce->ust);
> @@ -402,7 +400,8 @@ dri3_handle_present_event(struct loader_dri3_drawable
> *draw,
>              buf->busy = 0;
>
>           if (buf && draw->num_back <= b && b < LOADER_DRI3_MAX_BACK &&
> -             draw->cur_blit_source != b) {
> +             draw->cur_blit_source != b &&
> +             buf->busy == 0) {
>              dri3_free_render_buffer(draw, buf);
>              draw->buffers[b] = NULL;
>           }
> @@ -537,6 +536,7 @@ 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;
> --
> 2.7.4
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-stable/attachments/20180111/e0a59ab5/attachment.html>


More information about the mesa-stable mailing list