[PATCH xf86-video-ati 1/2] Call drmmode_set_desired_modes from a WindowExposures hook
Michel Dänzer
michel at daenzer.net
Wed Mar 1 10:02:41 UTC 2017
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>
---
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
More information about the amd-gfx
mailing list