[PATCH xf86-video-ati 1/2] Call drmmode_set_desired_modes from a WindowExposures hook

Alex Deucher alexdeucher at gmail.com
Wed Mar 1 14:36:16 UTC 2017


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


More information about the amd-gfx mailing list