From: Michel Dänzer <[email protected]> This ensures that the screen pixmap contents have been initialized when the initial modes are set.
(Ported from radeon commits 673e1c7637687c74fc9bdeeeffb7ace0d04b734f and 1584dc545c78e0bce8d4b4b9f26b568e2c211453) Signed-off-by: Michel Dänzer <[email protected]> --- src/amdgpu_kms.c | 17 ++++++++++++++--- src/drmmode_display.c | 30 ++++++++++++++++++++---------- src/drmmode_display.h | 3 ++- 3 files changed, 36 insertions(+), 14 deletions(-) diff --git a/src/amdgpu_kms.c b/src/amdgpu_kms.c index 1d2f0d4..d3fa916 100644 --- a/src/amdgpu_kms.c +++ b/src/amdgpu_kms.c @@ -155,7 +155,7 @@ static Bool AMDGPUCreateScreenResources_KMS(ScreenPtr pScreen) return FALSE; pScreen->CreateScreenResources = AMDGPUCreateScreenResources_KMS; - if (!drmmode_set_desired_modes(pScrn, &info->drmmode)) + if (!drmmode_set_desired_modes(pScrn, &info->drmmode, FALSE)) return FALSE; drmmode_uevent_init(pScrn, &info->drmmode); @@ -433,6 +433,17 @@ static void AMDGPUBlockHandler_KMS(BLOCKHANDLER_ARGS_DECL) #endif } +static void AMDGPUBlockHandler_oneshot(BLOCKHANDLER_ARGS_DECL) +{ + SCREEN_PTR(arg); + ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); + AMDGPUInfoPtr info = AMDGPUPTR(pScrn); + + drmmode_set_desired_modes(pScrn, &info->drmmode, TRUE); + + AMDGPUBlockHandler_KMS(BLOCKHANDLER_ARGS); +} + static void amdgpu_flush_callback(CallbackListPtr * list, pointer user_data, pointer call_data) @@ -1194,7 +1205,7 @@ Bool AMDGPUScreenInit_KMS(SCREEN_INIT_ARGS_DECL) pScreen->CloseScreen = AMDGPUCloseScreen_KMS; pScreen->SaveScreen = AMDGPUSaveScreen_KMS; info->BlockHandler = pScreen->BlockHandler; - pScreen->BlockHandler = AMDGPUBlockHandler_KMS; + pScreen->BlockHandler = AMDGPUBlockHandler_oneshot; if (!AddCallback(&FlushCallback, amdgpu_flush_callback, pScrn)) return FALSE; @@ -1249,7 +1260,7 @@ Bool AMDGPUEnterVT_KMS(VT_FUNC_ARGS_DECL) drmmode_copy_fb(pScrn, &info->drmmode); #endif - if (!drmmode_set_desired_modes(pScrn, &info->drmmode)) + if (!drmmode_set_desired_modes(pScrn, &info->drmmode, TRUE)) return FALSE; return TRUE; diff --git a/src/drmmode_display.c b/src/drmmode_display.c index 2a5d4ad..32d75e4 100644 --- a/src/drmmode_display.c +++ b/src/drmmode_display.c @@ -1713,7 +1713,8 @@ void drmmode_adjust_frame(ScrnInfoPtr pScrn, drmmode_ptr drmmode, int x, int y) } } -Bool drmmode_set_desired_modes(ScrnInfoPtr pScrn, drmmode_ptr drmmode) +Bool drmmode_set_desired_modes(ScrnInfoPtr pScrn, drmmode_ptr drmmode, + Bool set_hw) { xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn); int c; @@ -1726,10 +1727,12 @@ Bool drmmode_set_desired_modes(ScrnInfoPtr pScrn, drmmode_ptr drmmode) /* Skip disabled CRTCs */ if (!crtc->enabled) { - drmmode_do_crtc_dpms(crtc, DPMSModeOff); - drmModeSetCrtc(drmmode->fd, - drmmode_crtc->mode_crtc->crtc_id, 0, 0, - 0, NULL, 0, NULL); + if (set_hw) { + drmmode_do_crtc_dpms(crtc, DPMSModeOff); + drmModeSetCrtc(drmmode->fd, + drmmode_crtc->mode_crtc->crtc_id, + 0, 0, 0, NULL, 0, NULL); + } continue; } @@ -1761,11 +1764,18 @@ Bool 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; + } } return TRUE; } diff --git a/src/drmmode_display.h b/src/drmmode_display.h index 197e46a..f029998 100644 --- a/src/drmmode_display.h +++ b/src/drmmode_display.h @@ -122,7 +122,8 @@ extern void drmmode_fini(ScrnInfoPtr pScrn, drmmode_ptr drmmode); extern void drmmode_set_cursor(ScrnInfoPtr scrn, drmmode_ptr drmmode, int id, struct amdgpu_buffer *bo); 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); #if GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) >= 10 extern void drmmode_copy_fb(ScrnInfoPtr pScrn, drmmode_ptr drmmode); #endif -- 2.5.0 _______________________________________________ xorg-driver-ati mailing list [email protected] http://lists.x.org/mailman/listinfo/xorg-driver-ati
