[PATCHv3] modesetting: Update fb_id from shadow allocate and destroy if not set
Michel Dänzer
michel at daenzer.net
Thu Jul 5 14:18:30 UTC 2018
On 2018-07-05 11:27 AM, Tony Lindgren wrote:
> 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);
> }
> }
>
>
This uses the same damage region for all framebuffers, which is
generally not correct for drmmode_crtc->rotate_fb_id. The coordinate
offset, rotation and reflection need to be taken into account for that.
--
Earthling Michel Dänzer | http://www.amd.com
Libre software enthusiast | Mesa and X developer
More information about the xorg-devel
mailing list