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

Nathan Schulte nmschulte at gmail.com
Wed Jun 17 07:56:08 PDT 2015


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


More information about the xorg mailing list