[PATCH 2/2] modesetting: port clean start code from amdgpu. (v2)
Alex Deucher
alexdeucher at gmail.com
Mon May 2 21:12:33 UTC 2016
On Mon, May 2, 2016 at 4:54 PM, Dave Airlie <airlied at gmail.com> wrote:
> From: Dave Airlie <airlied at redhat.com>
>
> Both radeon and amdgpu don't set the mode until the first blockhandler,
> this means everything should be rendered on the screen correctly by then.
>
> This ports this code, it also removes the tail call of EnterVT from
> ScreenInit, it really isn't necessary and causes us to set a dirty
> mode with -modesetting always anyways.
>
> v2: reorder set desired modes vs block handler as done for amdgpu.
>
> Reviewed-by: Eric Anholt <eric at anholt.net>
> Signed-off-by: Dave Airlie <airlied at redhat.com>
For the series:
Reviewed-by: Alex Deucher <alexander.deucher at amd.com>
> ---
> hw/xfree86/drivers/modesetting/driver.c | 21 ++++++++++++++++----
> hw/xfree86/drivers/modesetting/drmmode_display.c | 25 +++++++++++++++++-------
> hw/xfree86/drivers/modesetting/drmmode_display.h | 2 +-
> 3 files changed, 36 insertions(+), 12 deletions(-)
>
> diff --git a/hw/xfree86/drivers/modesetting/driver.c b/hw/xfree86/drivers/modesetting/driver.c
> index 6c4bac3..fe5d5e1 100644
> --- a/hw/xfree86/drivers/modesetting/driver.c
> +++ b/hw/xfree86/drivers/modesetting/driver.c
> @@ -614,6 +614,17 @@ msBlockHandler(ScreenPtr pScreen, void *pTimeout, void *pReadmask)
> }
>
> static void
> +msBlockHandler_oneshot(ScreenPtr pScreen, void *pTimeout, void *pReadmask)
> +{
> + ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
> + modesettingPtr ms = modesettingPTR(pScrn);
> +
> + msBlockHandler(pScreen, pTimeout, pReadmask);
> +
> + drmmode_set_desired_modes(pScrn, &ms->drmmode, TRUE);
> +}
> +
> +static void
> FreeRec(ScrnInfoPtr pScrn)
> {
> modesettingPtr ms;
> @@ -972,7 +983,7 @@ CreateScreenResources(ScreenPtr pScreen)
> ret = pScreen->CreateScreenResources(pScreen);
> pScreen->CreateScreenResources = CreateScreenResources;
>
> - if (!drmmode_set_desired_modes(pScrn, &ms->drmmode))
> + if (!drmmode_set_desired_modes(pScrn, &ms->drmmode, pScrn->is_gpu))
> return FALSE;
>
> if (!drmmode_glamor_handle_new_screen_pixmap(&ms->drmmode))
> @@ -1235,7 +1246,7 @@ ScreenInit(ScreenPtr pScreen, int argc, char **argv)
> pScreen->CloseScreen = CloseScreen;
>
> ms->BlockHandler = pScreen->BlockHandler;
> - pScreen->BlockHandler = msBlockHandler;
> + pScreen->BlockHandler = msBlockHandler_oneshot;
>
> pScreen->SharePixmapBacking = msSharePixmapBacking;
> pScreen->SetSharedPixmapBacking = msSetSharedPixmapBacking;
> @@ -1289,7 +1300,9 @@ ScreenInit(ScreenPtr pScreen, int argc, char **argv)
> }
> #endif
>
> - return EnterVT(pScrn);
> + pScrn->vtSema = TRUE;
> +
> + return TRUE;
> }
>
> static void
> @@ -1336,7 +1349,7 @@ EnterVT(ScrnInfoPtr pScrn)
>
> SetMaster(pScrn);
>
> - if (!drmmode_set_desired_modes(pScrn, &ms->drmmode))
> + if (!drmmode_set_desired_modes(pScrn, &ms->drmmode, TRUE))
> return FALSE;
>
> return TRUE;
> diff --git a/hw/xfree86/drivers/modesetting/drmmode_display.c b/hw/xfree86/drivers/modesetting/drmmode_display.c
> index e0d624f..546673b 100644
> --- a/hw/xfree86/drivers/modesetting/drmmode_display.c
> +++ b/hw/xfree86/drivers/modesetting/drmmode_display.c
> @@ -1853,7 +1853,7 @@ drmmode_adjust_frame(ScrnInfoPtr pScrn, drmmode_ptr drmmode, int x, int y)
> }
>
> Bool
> -drmmode_set_desired_modes(ScrnInfoPtr pScrn, drmmode_ptr drmmode)
> +drmmode_set_desired_modes(ScrnInfoPtr pScrn, drmmode_ptr drmmode, Bool set_hw)
> {
> xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn);
> int c;
> @@ -1866,8 +1866,10 @@ drmmode_set_desired_modes(ScrnInfoPtr pScrn, drmmode_ptr drmmode)
>
> /* Skip disabled CRTCs */
> if (!crtc->enabled) {
> - drmModeSetCrtc(drmmode->fd, drmmode_crtc->mode_crtc->crtc_id,
> - 0, 0, 0, NULL, 0, NULL);
> + if (set_hw) {
> + drmModeSetCrtc(drmmode->fd, drmmode_crtc->mode_crtc->crtc_id,
> + 0, 0, 0, NULL, 0, NULL);
> + }
> continue;
> }
>
> @@ -1898,10 +1900,19 @@ drmmode_set_desired_modes(ScrnInfoPtr pScrn, drmmode_ptr drmmode)
> crtc->desiredY = 0;
> }
>
> - if (!crtc->funcs->
> - set_mode_major(crtc, &crtc->desiredMode, crtc->desiredRotation,
> - crtc->desiredX, crtc->desiredY))
> - return FALSE;
> + if (set_hw) {
> + if (!crtc->funcs->
> + set_mode_major(crtc, &crtc->desiredMode, crtc->desiredRotation,
> + crtc->desiredX, crtc->desiredY))
> + return FALSE;
> + } else {
> + crtc->mode = crtc->desiredMode;
> + crtc->rotation = crtc->desiredRotation;
> + crtc->x = crtc->desiredX;
> + crtc->y = crtc->desiredY;
> + if (!xf86CrtcRotate(crtc))
> + return FALSE;
> + }
> }
> return TRUE;
> }
> diff --git a/hw/xfree86/drivers/modesetting/drmmode_display.h b/hw/xfree86/drivers/modesetting/drmmode_display.h
> index a648d89..6b94641 100644
> --- a/hw/xfree86/drivers/modesetting/drmmode_display.h
> +++ b/hw/xfree86/drivers/modesetting/drmmode_display.h
> @@ -163,7 +163,7 @@ Bool drmmode_SetSlaveBO(PixmapPtr ppix,
>
> extern Bool drmmode_pre_init(ScrnInfoPtr pScrn, drmmode_ptr drmmode, int cpp);
> void drmmode_adjust_frame(ScrnInfoPtr pScrn, drmmode_ptr drmmode, int x, int y);
> -extern Bool drmmode_set_desired_modes(ScrnInfoPtr pScrn, drmmode_ptr drmmode);
> +extern Bool drmmode_set_desired_modes(ScrnInfoPtr pScrn, drmmode_ptr drmmode, Bool set_hw);
> extern Bool drmmode_setup_colormap(ScreenPtr pScreen, ScrnInfoPtr pScrn);
>
> extern void drmmode_uevent_init(ScrnInfoPtr scrn, drmmode_ptr drmmode);
> --
> 2.5.5
>
> _______________________________________________
> xorg-devel at lists.x.org: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: https://lists.x.org/mailman/listinfo/xorg-devel
More information about the xorg-devel
mailing list