1 --- a/hw/xfree86/modes/xf86RandR12.c
2 +++ b/hw/xfree86/modes/xf86RandR12.c
4 ScreenPtr cmScreen = pScreen->current_master;
6 xf86DetachOutputGPU(pScreen);
7 - AttachUnboundGPU(cmScreen, pScreen);
8 + if (!pScreen->current_master)
9 + AttachUnboundGPU(cmScreen, pScreen);
11 provider->output_source = NULL;
15 SetRootClip(source_provider->pScreen, FALSE);
17 - DetachUnboundGPU(pScreen);
18 + if (!pScreen->current_master)
19 + DetachUnboundGPU(pScreen);
20 AttachOutputGPU(source_provider->pScreen, pScreen);
22 provider->output_source = source_provider;
24 if (provider->offload_sink) {
25 ScreenPtr cmScreen = pScreen->current_master;
26 xf86DetachOutputGPU(pScreen);
27 - AttachUnboundGPU(cmScreen, pScreen);
28 + if (!pScreen->current_master)
29 + AttachUnboundGPU(cmScreen, pScreen);
32 provider->offload_sink = NULL;
34 if (provider->offload_sink == sink_provider)
37 - DetachUnboundGPU(pScreen);
38 + if (!pScreen->current_master)
39 + DetachUnboundGPU(pScreen);
40 AttachOffloadGPU(sink_provider->pScreen, pScreen);
42 provider->offload_sink = sink_provider;
43 @@ -1917,12 +1921,14 @@
44 config->randr_provider->offload_sink = NULL;
47 - else if (config->randr_provider->output_source) {
49 + if (config->randr_provider->output_source) {
50 xf86DetachOutputGPU(screen);
51 config->randr_provider->output_source = NULL;
54 - else if (screen->current_master)
56 + if (screen->current_master)
57 DetachUnboundGPU(screen);
59 config->randr_provider = NULL;
62 @@ -3911,6 +3911,8 @@ AttachUnboundGPU(ScreenPtr pScreen, ScreenPtr new)
64 assert(!new->current_master);
65 xorg_list_add(&new->unattached_head, &pScreen->unattached_list);
66 + xorg_list_init(&new->offload_head);
67 + xorg_list_init(&new->output_head);
68 new->current_master = pScreen;
74 xorg_list_del(&slave->output_head);
75 - slave->current_master = NULL;
76 + if (xorg_list_is_empty(&slave->offload_head))
77 + slave->current_master = NULL;
84 xorg_list_del(&slave->offload_head);
85 - slave->current_master = NULL;
86 + if (xorg_list_is_empty(&slave->output_head))
87 + slave->current_master = NULL;