[PATCHv3] modesetting: Update fb_id from shadow allocate and destroy if not set
Tony Lindgren
tony at atomide.com
Thu Jul 5 09:27:05 UTC 2018
Looks like drmModeDirtyFB() stopped working at some point and we now
call it with fb_id of zero for rotated displays. This will stop displays
relying on DRM_IOCTL_MODE_DIRTYFB ioctl to display anything.
This regression probably with commit 3dcd591fa9b7 ("modesetting: Add
support for using RandR shadow buffers") that inroduced rotate_fb_id.
Let's fix this issue by going through all the displays.
Cc: Hans De Goede <hdegoede at redhat.com>
Cc: Jason Ekstrand <jason.ekstrand at intel.com>
Cc: Keith Packard <keithp at keithp.com>
Cc: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
Cc: Lyude Paul <lyude at redhat.com>
Cc: Sebastian Reichel <sebastian.reichel at collabora.co.uk>
Cc: Tomi Valkeinen <tomi.valkeinen at ti.com>
Signed-off-by: Tony Lindgren <tony at atomide.com>
---
Here's this one resent with proper patch description, sorry
for the delays sending it out.
---
hw/xfree86/drivers/modesetting/driver.c | 41 +++++++++++++++++++++++--
1 file changed, 38 insertions(+), 3 deletions(-)
diff --git a/hw/xfree86/drivers/modesetting/driver.c b/hw/xfree86/drivers/modesetting/driver.c
--- a/hw/xfree86/drivers/modesetting/driver.c
+++ b/hw/xfree86/drivers/modesetting/driver.c
@@ -531,12 +531,11 @@ dispatch_dirty_region(ScrnInfoPtr scrn,
}
static void
-dispatch_dirty(ScreenPtr pScreen)
+dispatch_dirty_fb_id(ScreenPtr pScreen, int fb_id)
{
ScrnInfoPtr scrn = xf86ScreenToScrn(pScreen);
modesettingPtr ms = modesettingPTR(scrn);
PixmapPtr pixmap = pScreen->GetScreenPixmap(pScreen);
- int fb_id = ms->drmmode.fb_id;
int ret;
ret = dispatch_dirty_region(scrn, pixmap, ms->damage, fb_id);
@@ -547,7 +546,43 @@ dispatch_dirty(ScreenPtr pScreen)
ms->damage = NULL;
xf86DrvMsg(scrn->scrnIndex, X_INFO,
"Disabling kernel dirty updates, not required.\n");
- return;
+ }
+}
+
+static void
+dispatch_dirty(ScreenPtr pScreen)
+{
+ ScrnInfoPtr scrn = xf86ScreenToScrn(pScreen);
+ modesettingPtr ms = modesettingPTR(scrn);
+ modesettingEntPtr ms_ent = ms_ent_priv(scrn);
+ xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
+ xf86CrtcPtr crtc;
+ drmmode_crtc_private_ptr drmmode_crtc;
+ unsigned int mask;
+
+ mask = ms_ent->assigned_crtcs;
+
+ while (mask) {
+ int i, fb_id = 0;
+
+ i = ffs(mask) - 1;
+
+ crtc = xf86_config->crtc[i];
+ if (!ms_crtc_on(crtc))
+ goto skip;
+
+ drmmode_crtc = crtc->driver_private;
+
+ if (drmmode_crtc->rotate_fb_id)
+ fb_id = drmmode_crtc->rotate_fb_id;
+ else
+ fb_id = ms->drmmode.fb_id;
+
+ if (fb_id)
+ dispatch_dirty_fb_id(pScreen, fb_id);
+
+ skip:
+ mask &= ~(1 << i);
}
}
--
2.17.1
More information about the xorg-devel
mailing list