From 0812c6c76eb7051b0a741c57a48ac178a99d473d Mon Sep 17 00:00:00 2001 From: Omar Vega Ramos Date: Tue, 16 Jan 2018 09:51:30 -0500 Subject: mesa-17.3.2-2.parabola1: updating version --- ...r-dri3-Avoid-freeing-renderbuffers-in-use.patch | 74 ++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 libre/mesa/0001-loader-dri3-Avoid-freeing-renderbuffers-in-use.patch (limited to 'libre/mesa/0001-loader-dri3-Avoid-freeing-renderbuffers-in-use.patch') diff --git a/libre/mesa/0001-loader-dri3-Avoid-freeing-renderbuffers-in-use.patch b/libre/mesa/0001-loader-dri3-Avoid-freeing-renderbuffers-in-use.patch new file mode 100644 index 000000000..499f711c9 --- /dev/null +++ b/libre/mesa/0001-loader-dri3-Avoid-freeing-renderbuffers-in-use.patch @@ -0,0 +1,74 @@ +From 897c54d522ab960a879b763a15e489f630c491ee Mon Sep 17 00:00:00 2001 +From: Thomas Hellstrom +Date: Thu, 11 Jan 2018 10:19:23 +0100 +Subject: [PATCH] loader/dri3: Avoid freeing renderbuffers in use +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +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" +Tested-by: Andriy.Khulap +Tested-by: Vadym Shovkoplias +Reviewed-by: Michel Dänzer +Signed-off-by: Thomas Hellstrom +--- + 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 cc890bc923..8f8efcb646 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) { + 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.15.1 + -- cgit v1.2.3