Wait for pending scanout update before calling drmmode_crtc_scanout_free

There is a case that when set screen from reverse to normal, the old
scanout damage is freed in modesetting before scanout update handler,
so it causes segment fault issue.

Signed-off-by: Jim Qu <Jim.Qu@amd.com>

[ Michel Dänzer: Only call drmmode_crtc_wait_pending_event before
  drmmode_crtc_scanout_free is actually called, slightly tweak commit
  message ]
Signed-off-by: Michel Dänzer <michel.daenzer@amd.com>
(Ported from amdgpu commit 9f6a8905611b5b1d8fcd31bebbc9af7ca1355cc3)
Acked-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
Jim Qu
2018-07-10 18:36:42 +02:00
committed by Michel Dänzer
parent 413622bccc
commit cc1d0824a8

View File

@@ -985,9 +985,11 @@ done:
if (drmmode_crtc->scanout[scanout_id].pixmap && if (drmmode_crtc->scanout[scanout_id].pixmap &&
fb != radeon_pixmap_get_fb(drmmode_crtc-> fb != radeon_pixmap_get_fb(drmmode_crtc->
scanout[scanout_id].pixmap)) scanout[scanout_id].pixmap)) {
drmmode_crtc_wait_pending_event(drmmode_crtc, pRADEONEnt->fd,
drmmode_crtc->scanout_update_pending);
drmmode_crtc_scanout_free(drmmode_crtc); drmmode_crtc_scanout_free(drmmode_crtc);
else if (!drmmode_crtc->tear_free) { } else if (!drmmode_crtc->tear_free) {
drmmode_crtc_scanout_destroy(drmmode, drmmode_crtc_scanout_destroy(drmmode,
&drmmode_crtc->scanout[1]); &drmmode_crtc->scanout[1]);
} }