Hello, with my simple tests it works, but have some remarks (but don't have much experience with dri3):
1. It looks little dangerous to move logic of destroying buffers and seems in your version we are loosing some logic with 'busy' and 'num_back' 2. And also looks like buffers just will not be destroyed on time for some cases. 3. From my opinion it will be safer to use in function 'dri3_get_buffer' call (with my patch): 'dri3_fence_await(draw->conn, NULL, buffer)' instead of 'dri3_fence_await(draw->conn, draw, buffer)' On Fri, Apr 27, 2018 at 6:56 PM, Michel Dänzer <mic...@daenzer.net> wrote: > From: Michel Dänzer <michel.daen...@amd.com> > > 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" > Signed-off-by: Michel Dänzer <michel.daen...@amd.com> > --- > > Sergii, Eero, here's an alternative fix which I think is cleaner, can > you test it? > > 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; > + } > + } > + > /* pixmaps always have front buffers. > * Exchange swaps also mandate fake front buffers. > */ > -- > 2.17.0 > > -- Sergii Romantsov GlobalLogic Inc. www.globallogic.com
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev