[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-dev/attachments/20180111/e0a59ab5/attachment.html>
More information about the mesa-dev
mailing list