On Wed, Mar 1, 2017 at 5:02 AM, Michel Dänzer <michel at daenzer.net> wrote: > From: Michel Dänzer <michel.daenzer at amd.com> > > This is the earliest opportunity where the root window contents are > guaranteed to be initialized, and prevents drmmode_set_mode_major from > getting called before drmmode_set_desired_modes via RADEONUnblank -> > drmmode_crtc_dpms. Also, in contrast to the BlockHandler hook, this is > called when running Xorg with -pogo. > > Fixes intermittently showing garbage on server startup or after server > reset. > > As a bonus, this avoids trouble due to higher layers (e.g. the tigervnc > Xorg module) calling RADEONBlockHandler_oneshot repeatedly even after > we set pScreen->BlockHandler = RADEONBlockHandler_KMS. > > Bugzilla: https://bugs.freedesktop.org/99457 > Signed-off-by: Michel Dänzer <michel.daenzer at amd.com> Series is: Reviewed-by: Alex Deucher <alexander.deucher at amd.com> > --- > src/radeon.h | 1 + > src/radeon_kms.c | 40 ++++++++++++++++++++++++++++------------ > 2 files changed, 29 insertions(+), 12 deletions(-) > > diff --git a/src/radeon.h b/src/radeon.h > index bfff232c4..815c12a1d 100644 > --- a/src/radeon.h > +++ b/src/radeon.h > @@ -523,6 +523,7 @@ typedef struct { > > CreateScreenResourcesProcPtr CreateScreenResources; > CreateWindowProcPtr CreateWindow; > + WindowExposuresProcPtr WindowExposures; > > Bool IsSecondary; > > diff --git a/src/radeon_kms.c b/src/radeon_kms.c > index 331f3f1c9..a0961199c 100644 > --- a/src/radeon_kms.c > +++ b/src/radeon_kms.c > @@ -1137,17 +1137,6 @@ static void RADEONBlockHandler_KMS(BLOCKHANDLER_ARGS_DECL) > #endif > } > > -static void RADEONBlockHandler_oneshot(BLOCKHANDLER_ARGS_DECL) > -{ > - SCREEN_PTR(arg); > - ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); > - RADEONInfoPtr info = RADEONPTR(pScrn); > - > - RADEONBlockHandler_KMS(BLOCKHANDLER_ARGS); > - > - drmmode_set_desired_modes(pScrn, &info->drmmode, TRUE); > -} > - > static Bool RADEONIsFastFBWorking(ScrnInfoPtr pScrn) > { > RADEONInfoPtr info = RADEONPTR(pScrn); > @@ -1636,6 +1625,31 @@ static Bool RADEONCreateWindow_oneshot(WindowPtr pWin) > return ret; > } > > +/* When the root window is mapped, set the initial modes */ > +static void RADEONWindowExposures_oneshot(WindowPtr pWin, RegionPtr pRegion > +#if XORG_VERSION_CURRENT < XORG_VERSION_NUMERIC(1, 16, 99, 901, 0) > + , RegionPtr pBSRegion > +#endif > + ) > +{ > + ScreenPtr pScreen = pWin->drawable.pScreen; > + ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); > + RADEONInfoPtr info = RADEONPTR(pScrn); > + > + if (pWin != pScreen->root) > + ErrorF("%s called for non-root window %p\n", __func__, pWin); > + > + pScreen->WindowExposures = info->WindowExposures; > +#if XORG_VERSION_CURRENT < XORG_VERSION_NUMERIC(1, 16, 99, 901, 0) > + pScreen->WindowExposures(pWin, pRegion, RegionPtr pBSRegion); > +#else > + pScreen->WindowExposures(pWin, pRegion); > +#endif > + > + radeon_cs_flush_indirect(pScrn); > + drmmode_set_desired_modes(pScrn, &info->drmmode, TRUE); > +} > + > Bool RADEONPreInit_KMS(ScrnInfoPtr pScrn, int flags) > { > RADEONInfoPtr info; > @@ -2330,6 +2344,8 @@ Bool RADEONScreenInit_KMS(SCREEN_INIT_ARGS_DECL) > info->CreateWindow = pScreen->CreateWindow; > pScreen->CreateWindow = RADEONCreateWindow_oneshot; > } > + info->WindowExposures = pScreen->WindowExposures; > + pScreen->WindowExposures = RADEONWindowExposures_oneshot; > > /* Provide SaveScreen & wrap BlockHandler and CloseScreen */ > /* Wrap CloseScreen */ > @@ -2337,7 +2353,7 @@ Bool RADEONScreenInit_KMS(SCREEN_INIT_ARGS_DECL) > pScreen->CloseScreen = RADEONCloseScreen_KMS; > pScreen->SaveScreen = RADEONSaveScreen_KMS; > info->BlockHandler = pScreen->BlockHandler; > - pScreen->BlockHandler = RADEONBlockHandler_oneshot; > + pScreen->BlockHandler = RADEONBlockHandler_KMS; > > info->CreateScreenResources = pScreen->CreateScreenResources; > pScreen->CreateScreenResources = RADEONCreateScreenResources_KMS; > -- > 2.11.0 > > _______________________________________________ > amd-gfx mailing list > amd-gfx at lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/amd-gfx