On 01/11/2018 04:32 PM, Michel Dänzer wrote:
On 2018-01-11 10:53 AM, Thomas Hellstrom wrote:
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://urldefense.proofpoint.com/v2/url?u=https-3A__bugs.freedesktop.org_show-5Fbug.cgi-3Fid-3D104214&d=DwIDaQ&c=uilaK90D4TOVoH58JNXRgQ&r=wnSlgOCqfpNS4d02vP68_E9q2BNMCwfD2OZ_6dCFVQQ&m=9HcYeSD_Icbfrmtsk2Opj_2kYsyb6xfcoE81n8lODzc&s=lObZAF_CMRHJk8C3_gsSJLnjZRBb6WAWotpNW70UMK4&e=
Cc: "17.3" <mesa-sta...@lists.freedesktop.org>
Signed-off-by: Thomas Hellstrom <thellst...@vmware.com>
[...]

@@ -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 == 0) {
              dri3_free_render_buffer(draw, buf);
              draw->buffers[b] = NULL;
           }
Maybe write this as !buf->busy for consistency with dri3_find_back.
Either way,

Thanks for reviewing, Michel. I'll incorporate that, resend and push.

/Thomas


Reviewed-by: Michel Dänzer <michel.daen...@amd.com>



_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to