Re: RandR + i915 (HD 4600 / Haswell) -- Cannot switch from internal to 3x external

Nathan Schulte
2015-06-17T14:56:11Z

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,