On 2018-05-05 12:59 PM, Jason Ekstrand wrote: > On Wed, May 2, 2018 at 2:35 AM, Michel Dänzer <[email protected]> wrote: > >> From: Michel Dänzer <[email protected]> >> >> 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" >> Reported-by: Sergii Romantsov <[email protected]> >> Tested-by: Eero Tamminen <[email protected]> >> Acked-by: Daniel Stone <[email protected]> >> Signed-off-by: Michel Dänzer <[email protected]> >> --- >> 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; >> + } >> + } >> > > Moving this hear means that dri3_update_num_back is no longer getting > called from dri3_find_back_alloc which is used by swapbuffers_msc and > copy_sub_buffer. Is this intended?
Indeed, it is. E.g. in swap_buffers_msc, if dri3_update_num_back changes draw->num_back from 3 to 2, we might throw away a finished frame and present random other contents instead. -- Earthling Michel Dänzer | http://www.amd.com Libre software enthusiast | Mesa and X developer _______________________________________________ mesa-dev mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-dev
