mirror of
https://github.com/archlinuxarm/PKGBUILDs.git
synced 2024-11-28 22:57:37 +00:00
74 lines
2.9 KiB
Diff
74 lines
2.9 KiB
Diff
From 897c54d522ab960a879b763a15e489f630c491ee Mon Sep 17 00:00:00 2001
|
|
From: Thomas Hellstrom <thellstrom@vmware.com>
|
|
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" <mesa-stable@lists.freedesktop.org>
|
|
Tested-by: Andriy.Khulap <andriy.khulap@globallogic.com>
|
|
Tested-by: Vadym Shovkoplias <vadym.shovkoplias@globallogic.com>
|
|
Reviewed-by: Michel Dänzer <michel.daenzer@amd.com>
|
|
Signed-off-by: Thomas Hellstrom <thellstrom@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 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
|
|
|