From 0dc1a58b9379c79ede8c40b2e6f008dc0868a40e Mon Sep 17 00:00:00 2001 From: Lyude Paul Date: Mon, 13 Jun 2016 15:31:02 -0400 Subject: modesetting: Clear drmmode->fb_id before unflipping [fix copied from 40191d82370e in xf86-video-ati] Without this, we end up setting rotated CRTCs back to their previous framebuffer right after we perform a rotation. Reproducer: - Have two monitors connected at the same resolution - Rotate one monitor from normal straight to inverted - Watch as the monitor you didn't rotate either freezes or shows intense flickering Signed-off-by: Lyude Reviewed-by: Hans de Goede Signed-off-by: Hans de Goede (cherry picked from commit 848089e0dde38f043c85332785520946103e77c1) --- hw/xfree86/drivers/modesetting/present.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/hw/xfree86/drivers/modesetting/present.c b/hw/xfree86/drivers/modesetting/present.c index d65c8c845..9a596de75 100644 --- a/hw/xfree86/drivers/modesetting/present.c +++ b/hw/xfree86/drivers/modesetting/present.c @@ -626,6 +626,15 @@ ms_present_unflip(ScreenPtr screen, uint64_t event_id) if (!crtc->enabled) continue; + /* info->drmmode.fb_id still points to the FB for the last flipped BO. + * Clear it, drmmode_set_mode_major will re-create it + */ + if (drmmode_crtc->drmmode->fb_id) { + drmModeRmFB(drmmode_crtc->drmmode->fd, + drmmode_crtc->drmmode->fb_id); + drmmode_crtc->drmmode->fb_id = 0; + } + if (drmmode_crtc->dpms_mode == DPMSModeOn) crtc->funcs->set_mode_major(crtc, &crtc->mode, crtc->rotation, crtc->x, crtc->y); -- cgit v1.2.3