From 88e9bb760fbd1249bb364a6b68aceee0b442738c Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Mon, 1 Dec 2014 10:47:32 +0000 Subject: [PATCH] sna: Explicitly disable unused pipes after an output reconfiguration Signed-off-by: Chris Wilson --- src/sna/sna_display.c | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/src/sna/sna_display.c b/src/sna/sna_display.c index aa5bdc3a..16333330 100644 --- a/src/sna/sna_display.c +++ b/src/sna/sna_display.c @@ -4064,7 +4064,7 @@ static void sort_randr_outputs(struct sna *sna, ScreenPtr screen) } } -static void disable_unused_crtc(struct sna *sna) +static bool disable_unused_crtc(struct sna *sna) { xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(sna->scrn); bool update = false; @@ -4076,7 +4076,6 @@ static void disable_unused_crtc(struct sna *sna) if (!crtc->enabled) continue; - for (o = 0; o < sna->mode.num_real_output; o++) { xf86OutputPtr output = config->output[o]; if (output->crtc == crtc) @@ -4084,13 +4083,19 @@ static void disable_unused_crtc(struct sna *sna) } if (o == sna->mode.num_real_output) { + DBG(("%s: CRTC:%d was enabled with no outputs\n", + __FUNCTION__, to_sna_crtc(crtc)->id)); crtc->enabled = false; update = true; } } - if (update) + if (update) { + DBG(("%s: disabling unused functions\n", __FUNCTION__)); xf86DisableUnusedFunctions(sna->scrn); + } + + return update; } void sna_mode_discover(struct sna *sna) @@ -5790,13 +5795,19 @@ sna_crtc_config_notify(ScreenPtr screen) if (!sna->mode.dirty) return; - /* XXX DisableUnusedOutputs? */ + if (disable_unused_crtc(sna)) { + /* This will have recursed, so simply bail at this point */ + assert(sna->mode.dirty == false); +#ifdef RANDR_12_INTERFACE + xf86RandR12TellChanged(screen); +#endif + return; + } - probe_capabilities(sna); update_flush_interval(sna); - sna_cursors_reload(sna); + probe_capabilities(sna); sna_present_update(sna); sna->mode.dirty = false;