Message ID | 20150617091349.GC24012@nuc-i3427.alporthouse.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On 06/17/2015 04:13 AM, Chris Wilson wrote: > On Wed, Jun 17, 2015 at 09:46:25AM +0100, Chris Wilson wrote: >> I think this is the right fix: >> >> diff --git a/xrandr.c b/xrandr.c >> index fbfd93e..c0feac3 100644 >> --- a/xrandr.c >> +++ b/xrandr.c >> @@ -3029,7 +3029,7 @@ main (int argc, char **argv) >> if (!config_output) argerr ("%s must be used after --output\n", argv[i]); >> set_name_xid (&config_output->mode, None); >> set_name_xid (&config_output->crtc, None); >> - config_output->changes |= changes_mode; >> + config_output->changes |= changes_mode | changes_crtc; >> continue; >> } >> if (!strcmp ("--fb", argv[i])) { > > Though there is still this logic in check_crtc_for_output: > > if (crtc->notput) { // check we can clone in our configuration > ... > } else if (crtc->crtc_info->noutput) { // check against old > } > > But we never ignore the old configuration when we disable all the > outputs on it. So to avoid running out of CRTC prematurely, we also need > to stop considering the old configuration like: > > diff --git a/xrandr.c b/xrandr.c > index c0feac3..181c76e 100644 > --- a/xrandr.c > +++ b/xrandr.c > @@ -2243,6 +2243,8 @@ static void > pick_crtcs (void) > { > output_t *output; > + int saved_crtc_noutput[num_crtcs]; > + int n; > > /* > * First try to match up newly enabled outputs with spare crtcs > @@ -2274,7 +2276,18 @@ pick_crtcs (void) > */ > for (output = all_outputs; output; output = output->next) > output->current_crtc_info = output->crtc_info; > + > + /* Mark all CRTC as currently unused */ > + for (n = 0; n < num_crtcs; n++) { > + saved_crtc_noutput[n] = crtcs[n].crtc_info->noutput; > + crtcs[n].crtc_info->noutput = 0; > + } > + > pick_crtcs_score (all_outputs); > + > + for (n = 0; n < num_crtcs; n++) > + crtcs[n].crtc_info->noutput = saved_crtc_noutput[n]; > + > for (output = all_outputs; output; output = output->next) > { > if (output->mode_info && !output->crtc_info) I'll give these two patches a try and report back. Thanks, -- Nate
On 06/17/2015 09:56 AM, Nathan Schulte wrote:
> I'll give these two patches a try and report back.
These two patches worked beautifully. Thanks! I assume you can take
care of getting them included upstream?
--
Nate
On Wed, Jun 17, 2015 at 01:05:54PM -0500, Nathan Schulte wrote: > On 06/17/2015 09:56 AM, Nathan Schulte wrote: > >I'll give these two patches a try and report back. > > These two patches worked beautifully. Thanks! I assume you can > take care of getting them included upstream? I'll taked that as a reported-and-tested-by and proceed. Thanks, -Chris
diff --git a/xrandr.c b/xrandr.c index c0feac3..181c76e 100644 --- a/xrandr.c +++ b/xrandr.c @@ -2243,6 +2243,8 @@ static void pick_crtcs (void) { output_t *output; + int saved_crtc_noutput[num_crtcs]; + int n; /* * First try to match up newly enabled outputs with spare crtcs @@ -2274,7 +2276,18 @@ pick_crtcs (void) */ for (output = all_outputs; output; output = output->next) output->current_crtc_info = output->crtc_info; + + /* Mark all CRTC as currently unused */ + for (n = 0; n < num_crtcs; n++) { + saved_crtc_noutput[n] = crtcs[n].crtc_info->noutput; + crtcs[n].crtc_info->noutput = 0; + } + pick_crtcs_score (all_outputs); + + for (n = 0; n < num_crtcs; n++) + crtcs[n].crtc_info->noutput = saved_crtc_noutput[n]; + for (output = all_outputs; output; output = output->next) { if (output->mode_info && !output->crtc_info)