[Mesa-dev] [PATCH] dri3: Only update number of back buffers in loader_dri3_get_buffers

Michel Dänzer michel at daenzer.net
Wed May 9 10:09:17 UTC 2018


On 2018-05-05 12:59 PM, Jason Ekstrand wrote:
> On Wed, May 2, 2018 at 2:35 AM, Michel Dänzer <michel at daenzer.net> wrote:
> 
>> From: Michel Dänzer <michel.daenzer at 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"
>> Reported-by: Sergii Romantsov <sergii.romantsov at globallogic.com>
>> Tested-by: Eero Tamminen <eero.t.tamminen at intel.com>
>> Acked-by: Daniel Stone <daniels at collabora.com>
>> Signed-off-by: Michel Dänzer <michel.daenzer at amd.com>
>> ---
>>  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


More information about the mesa-dev mailing list