123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- From 37d51acb3b6a38af1717bfaa7925043c35bfb447 Mon Sep 17 00:00:00 2001
- From: Dave Airlie <airlied@redhat.com>
- Date: Fri, 17 Aug 2012 09:49:24 +1000
- Subject: [PATCH] autobind GPUs to the screen, (v3)
- this is racy and really not what we want for hotplug going forward,
- but until DE support is in GNOME its probably for the best.
- v2: fix if config or slave config is NULL
- v3: fix multi useful slaves
- DO NOT UPSTREAM.
- ---
- hw/xfree86/common/xf86Init.c | 12 ++++++++++++
- hw/xfree86/common/xf86platformBus.c | 3 +++
- hw/xfree86/modes/xf86Crtc.c | 32 ++++++++++++++++++++++++++++++++
- 3 files changed, 47 insertions(+), 0 deletions(-)
- diff --git a/hw/xfree86/common/xf86Init.c b/hw/xfree86/common/xf86Init.c
- index d231ced..89629c1 100644
- --- a/hw/xfree86/common/xf86Init.c
- +++ b/hw/xfree86/common/xf86Init.c
- @@ -361,6 +361,16 @@ xf86CreateRootWindow(WindowPtr pWin)
- return ret;
- }
-
- +extern void xf86AutoConfigOutputDevice(ScrnInfoPtr pScrn, ScrnInfoPtr master);
- +static void
- +xf86AutoConfigOutputDevices(void)
- +{
- + int i;
- +
- + for (i = 0; i < xf86NumGPUScreens; i++)
- + xf86AutoConfigOutputDevice(xf86GPUScreens[i], xf86Screens[0]);
- +}
- +
- static void
- InstallSignalHandlers(void)
- {
- @@ -926,6 +936,8 @@ InitOutput(ScreenInfo * pScreenInfo, int argc, char **argv)
- for (i = 0; i < xf86NumGPUScreens; i++)
- AttachUnboundGPU(xf86Screens[0]->pScreen, xf86GPUScreens[i]->pScreen);
-
- + xf86AutoConfigOutputDevices();
- +
- xf86VGAarbiterWrapFunctions();
- if (sigio_blocked)
- OsReleaseSIGIO();
- diff --git a/hw/xfree86/common/xf86platformBus.c b/hw/xfree86/common/xf86platformBus.c
- index 0525e39..82fef32 100644
- --- a/hw/xfree86/common/xf86platformBus.c
- +++ b/hw/xfree86/common/xf86platformBus.c
- @@ -387,6 +387,8 @@ xf86platformProbeDev(DriverPtr drvp)
- return foundScreen;
- }
-
- +extern void xf86AutoConfigOutputDevice(ScrnInfoPtr pScrn, ScrnInfoPtr master);
- +
- int
- xf86platformAddDevice(int index)
- {
- @@ -446,6 +448,7 @@ xf86platformAddDevice(int index)
-
- /* attach unbound to 0 protocol screen */
- AttachUnboundGPU(xf86Screens[0]->pScreen, xf86GPUScreens[i]->pScreen);
- + xf86AutoConfigOutputDevice(xf86GPUScreens[i], xf86Screens[0]);
-
- return 0;
- }
- diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c
- index 3011f13..34c1848 100644
- --- a/hw/xfree86/modes/xf86Crtc.c
- +++ b/hw/xfree86/modes/xf86Crtc.c
- @@ -3323,3 +3323,35 @@ xf86DetachAllCrtc(ScrnInfoPtr scrn)
- crtc->x = crtc->y = 0;
- }
- }
- +
- +
- +void xf86AutoConfigOutputDevice(ScrnInfoPtr pScrn, ScrnInfoPtr master)
- +{
- + RRProviderPtr master_provider;
- + xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(master);
- + xf86CrtcConfigPtr slave_config = XF86_CRTC_CONFIG_PTR(pScrn);
- + Bool unbound = FALSE;
- +
- + if (!config || !slave_config)
- + return;
- +
- + master_provider = config->randr_provider;
- +
- + if ((master->capabilities & RR_Capability_SinkOffload) &&
- + pScrn->capabilities & RR_Capability_SourceOffload) {
- + /* source offload */
- +
- + DetachUnboundGPU(pScrn->pScreen);
- + unbound = TRUE;
- + AttachOffloadGPU(master->pScreen, pScrn->pScreen);
- + slave_config->randr_provider->offload_sink = master_provider;
- + }
- + if ((master->capabilities & RR_Capability_SourceOutput) &&
- + pScrn->capabilities & RR_Capability_SinkOutput) {
- + /* sink offload */
- + if (!unbound)
- + DetachUnboundGPU(pScrn->pScreen);
- + AttachOutputGPU(master->pScreen, pScrn->pScreen);
- + slave_config->randr_provider->output_source = master_provider;
- + }
- +}
- --
- 1.8.1
|