* Keith Packard <kei...@keithp.com> [180203 20:33]: > I think the right place to fix this is in dispatch_dirty_regions, which > should be walking the set of active CTRCs and damaging the appropriate > fb_id for each one?
So is the following test patch at all along the lines you were thinking? I wonder if we should also have drmmode_crtc->rotate_dirty_enabled in addition to ms->dirty_enabled so we we could stop the ioctl on per *fb_id basis if not needed? Or maybe we could have drmmode_crtc->current_fb_id that would just get overwritten by drmModeAddFB() or some other logic? Regards, Tony 8< ------------------ 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.16.1 _______________________________________________ xorg-devel@lists.x.org: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: https://lists.x.org/mailman/listinfo/xorg-devel