intel-virtual-output: Iterate over remote outputs in the same order as listed
authorChris Wilson <chris@chris-wilson.co.uk>
Fri, 14 Mar 2014 15:55:41 +0000 (15:55 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Fri, 14 Mar 2014 15:55:41 +0000 (15:55 +0000)
If we walk the output lists in the same order as they are listed by
RandR, we are more likely to hit favourable priority sorting. E.g. the
user is likely to setup the outputs in the same order as listed, meaning
fewer CRTC transitions etc.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
tools/virtual.c

index cf38315..c994574 100644 (file)
@@ -2163,6 +2163,20 @@ static struct display *last_display(struct context *ctx)
        return &ctx->display[ctx->ndisplay-1];
 }
 
+static void reverse_clone_list(struct display *display)
+{
+       struct clone *list = NULL;
+
+       while (display->clone) {
+               struct clone *clone = display->clone;
+               display->clone = clone->next;
+               clone->next = list;
+               list = clone;
+       }
+
+       display->clone = list;
+}
+
 static int last_display_add_clones__randr(struct context *ctx)
 {
        struct display *display = last_display(ctx);
@@ -2236,6 +2250,8 @@ static int last_display_add_clones__randr(struct context *ctx)
                XRRFreeOutputInfo(o);
        }
        XRRFreeScreenResources(res);
+
+       reverse_clone_list(display);
        return 0;
 }
 
@@ -2309,6 +2325,8 @@ static int last_display_add_clones__xinerama(struct context *ctx)
                ctx->active = clone;
        }
        XFree(xi);
+
+       reverse_clone_list(display);
        return 0;
 }