On Mon, May 2, 2016 at 4:54 PM, Dave Airlie <airl...@gmail.com> wrote: > From: Dave Airlie <airl...@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 <e...@anholt.net> > Signed-off-by: Dave Airlie <airl...@redhat.com>
For the series: Reviewed-by: Alex Deucher <alexander.deuc...@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@lists.x.org: X.Org development > Archives: http://lists.x.org/archives/xorg-devel > Info: https://lists.x.org/mailman/listinfo/xorg-devel _______________________________________________ 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