> -----Original Message----- > From: amd-gfx [mailto:amd-gfx-bounces at lists.freedesktop.org] On Behalf > Of Michel Dänzer > Sent: Wednesday, August 30, 2017 4:25 AM > To: amd-gfx at lists.freedesktop.org > Subject: [PATCH xf86-video-amdgpu] Use a timer for unreferencing the all- > black FB > > From: Michel Dänzer <michel.daenzer at amd.com> > > The timer fires 1 second after LeaveVT. This gives the next DRM master > enough time to set up scanout of its own buffers. > > Fixes prolonged intermittent black screen when switching from Xorg to > e.g. the GDM Wayland mode login VT. > > Fixes: c16ff42f927d ("Make all active CRTCs scan out an all-black > framebuffer in LeaveVT") > (Ported from radeon commit 9d9c565c84601f4c6c73ad769f86491088683f7a) > > Signed-off-by: Michel Dänzer <michel.daenzer at amd.com> Reviewed-by: Alex Deucher <alexander.deucher at amd.com> > --- > src/amdgpu_kms.c | 42 +++++++++++++++++++++++++++--------------- > 1 file changed, 27 insertions(+), 15 deletions(-) > > diff --git a/src/amdgpu_kms.c b/src/amdgpu_kms.c > index c3613eb8d..d82ead2ac 100644 > --- a/src/amdgpu_kms.c > +++ b/src/amdgpu_kms.c > @@ -1044,7 +1044,6 @@ static void > AMDGPUBlockHandler_KMS(BLOCKHANDLER_ARGS_DECL) > { > SCREEN_PTR(arg); > ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); > - AMDGPUEntPtr pAMDGPUEnt = AMDGPUEntPriv(pScrn); > AMDGPUInfoPtr info = AMDGPUPTR(pScrn); > xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn); > int c; > @@ -1053,21 +1052,8 @@ static void > AMDGPUBlockHandler_KMS(BLOCKHANDLER_ARGS_DECL) > (*pScreen->BlockHandler) (BLOCKHANDLER_ARGS); > pScreen->BlockHandler = AMDGPUBlockHandler_KMS; > > - if (!xf86ScreenToScrn(amdgpu_master_screen(pScreen))->vtSema) { > - /* Unreference the all-black FB created by > AMDGPULeaveVT_KMS. After > - * this, there should be no FB left created by this driver. > - */ > - > - for (c = 0; c < xf86_config->num_crtc; c++) { > - drmmode_crtc_private_ptr drmmode_crtc = > - xf86_config->crtc[c]->driver_private; > - > - drmmode_fb_reference(pAMDGPUEnt->fd, > &drmmode_crtc->fb, > - NULL); > - } > - > + if (!xf86ScreenToScrn(amdgpu_master_screen(pScreen))->vtSema) > return; > - } > > if (!amdgpu_is_gpu_screen(pScreen)) > { > @@ -1629,6 +1615,30 @@ static void > amdgpu_drop_drm_master(ScrnInfoPtr pScrn) > } > > > +static > +CARD32 cleanup_black_fb(OsTimerPtr timer, CARD32 now, pointer data) > +{ > + ScreenPtr screen = data; > + ScrnInfoPtr scrn = xf86ScreenToScrn(screen); > + AMDGPUEntPtr pAMDGPUEnt = AMDGPUEntPriv(scrn); > + xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn); > + int c; > + > + if (xf86ScreenToScrn(amdgpu_master_screen(screen))->vtSema) > + return 0; > + > + /* Unreference the all-black FB created by AMDGPULeaveVT_KMS. > After > + * this, there should be no FB left created by this driver. > + */ > + for (c = 0; c < xf86_config->num_crtc; c++) { > + drmmode_crtc_private_ptr drmmode_crtc = > + xf86_config->crtc[c]->driver_private; > + > + drmmode_fb_reference(pAMDGPUEnt->fd, > &drmmode_crtc->fb, NULL); > + } > + > + return 0; > +} > > static Bool AMDGPUSaveScreen_KMS(ScreenPtr pScreen, int mode) > { > @@ -2061,6 +2071,8 @@ void > AMDGPULeaveVT_KMS(VT_FUNC_ARGS_DECL) > } > pixmap_unref_fb(pScreen->GetScreenPixmap(pScreen), None, > pAMDGPUEnt); > > + TimerSet(NULL, 0, 1000, cleanup_black_fb, pScreen); > + > xf86_hide_cursors(pScrn); > > amdgpu_drop_drm_master(pScrn); > -- > 2.14.1 > > _______________________________________________ > amd-gfx mailing list > amd-gfx at lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/amd-gfx