From 8515c249cf4a55dd92570e56c9af1196bb61609b Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Sat, 30 Apr 2016 12:42:44 +0100 Subject: [PATCH] sna: Resize screen for XVidMode changes References: https://bugs.freedesktop.org/show_bug.cgi?id=95200 Signed-off-by: Chris Wilson --- src/sna/sna.h | 1 + src/sna/sna_display.c | 26 ++++++++++++++++++++++++++ src/sna/sna_driver.c | 9 ++++++++- 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/src/sna/sna.h b/src/sna/sna.h index 664308f..ba79450 100644 --- a/src/sna/sna.h +++ b/src/sna/sna.h @@ -448,6 +448,7 @@ extern void sna_mode_discover(struct sna *sna, bool tell); extern void sna_mode_check(struct sna *sna); extern bool sna_mode_disable(struct sna *sna); extern void sna_mode_enable(struct sna *sna); +extern bool sna_mode_fit(struct sna *sna, int width, int height); extern void sna_mode_reset(struct sna *sna); extern int sna_mode_wakeup(struct sna *sna); extern void sna_mode_redisplay(struct sna *sna); diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c index 759659d..9b445cf 100644 --- a/src/sna/sna_display.c +++ b/src/sna/sna_display.c @@ -5394,6 +5394,32 @@ sna_mode_resize(ScrnInfoPtr scrn, int width, int height) return TRUE; } +bool sna_mode_fit(struct sna *sna, int width, int height) +{ + xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(sna->scrn); + int total_width = 0, total_height = 0; + int i; + + for (i = 0; i < sna->mode.num_real_crtc; i++) { + xf86CrtcPtr crtc = config->crtc[i]; + + assert(to_sna_crtc(crtc)); + if (to_sna_crtc(crtc)->bo == NULL) + continue; + + if (crtc->bounds.x2 > total_width) + total_width = crtc->bounds.x2; + + if (crtc->bounds.y2 > total_height) + total_height = crtc->bounds.y2; + } + + if (total_width <= width && total_height <= height) + return sna_mode_resize(sna->scrn, width, height); + + return false; +} + /* cursor handling */ static void rotate_coord(Rotation rotation, int size, diff --git a/src/sna/sna_driver.c b/src/sna/sna_driver.c index b245594..28157a7 100644 --- a/src/sna/sna_driver.c +++ b/src/sna/sna_driver.c @@ -1234,8 +1234,15 @@ static Bool sna_enter_vt(VT_FUNC_ARGS_DECL) static Bool sna_switch_mode(SWITCH_MODE_ARGS_DECL) { SCRN_INFO_PTR(arg); + DBG(("%s\n", __FUNCTION__)); - return xf86SetSingleMode(scrn, mode, RR_Rotate_0); + + if (!xf86SetSingleMode(scrn, mode, RR_Rotate_0)) + return FALSE; + + sna_mode_fit(to_sna(scrn), mode->HDisplay, mode->VDisplay); + + return TRUE; } static ModeStatus -- 2.8.1