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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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
_______________________________________________
Intel-gfx mailing list
Intel-gfx@xxxxxxxxxxxxxxxxxxxxx
http://lists.freedesktop.org/mailman/listinfo/intel-gfx




[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]
  Powered by Linux