summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2012-10-08 15:42:10 +1000
committerDave Airlie <airlied@redhat.com>2012-10-08 15:42:10 +1000
commita71bfc02809a6b60826b139628dbe3ec2ae48088 (patch)
tree3582d51adf6190a4839916e049e5896bd58549e3
parentbc50df4a8fcc61b81c8720ff0fc3d0f422d2bb02 (diff)
xf86: provider switch
-rw-r--r--hw/xfree86/modes/xf86RandR12.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/hw/xfree86/modes/xf86RandR12.c b/hw/xfree86/modes/xf86RandR12.c
index 3530abf24..011303c1b 100644
--- a/hw/xfree86/modes/xf86RandR12.c
+++ b/hw/xfree86/modes/xf86RandR12.c
@@ -37,6 +37,7 @@
#include "windowstr.h"
#include "inputstr.h"
#include <randrstr.h>
+#include "impedance.h"
#include <X11/extensions/render.h>
#include "xf86Crtc.h"
@@ -1826,6 +1827,34 @@ xf86RandR14ProviderSetOffloadSink(ScreenPtr pScreen,
}
static Bool
+xf86RandR15ProviderSwitchPrimary(ScreenPtr pScreen,
+ RRProviderPtr provider)
+{
+ ScreenPtr pProtoScreen, pCurrentGPU;
+
+ /* have to locate the protocol screen this provider is using */
+ pProtoScreen = pScreen->current_master;
+ if (pProtoScreen->isGPU)
+ pProtoScreen = pProtoScreen->current_master;
+
+ pCurrentGPU = pProtoScreen->gpu[0];
+
+ if (provider->offload_sink)
+ DetachOffloadGPU(pScreen);
+ impedAddScreen(pProtoScreen, provider->pScreen);
+ impedRemoveScreen(pProtoScreen, pCurrentGPU);
+
+ pCurrentGPU->current_master = NULL;
+
+ if ((xf86ScreenToScrn(pCurrentGPU)->capabilities & RR_Capability_SinkOutput) &&
+ (xf86ScreenToScrn(provider->pScreen)->capabilities & RR_Capability_SourceOutput))
+ AttachOutputGPU(provider->pScreen, pCurrentGPU);
+
+
+ return TRUE;
+}
+
+static Bool
xf86RandR14ProviderSetProperty(ScreenPtr pScreen,
RRProviderPtr randr_provider,
Atom property, RRPropertyValuePtr value)
@@ -1910,6 +1939,7 @@ xf86RandR12Init12(ScreenPtr pScreen)
rp->rrProviderSetOutputSource = xf86RandR14ProviderSetOutputSource;
rp->rrProviderSetOffloadSink = xf86RandR14ProviderSetOffloadSink;
+ rp->rrProviderSwitchPrimary = xf86RandR15ProviderSwitchPrimary;
rp->rrProviderSetProperty = xf86RandR14ProviderSetProperty;
rp->rrProviderGetProperty = xf86RandR14ProviderGetProperty;