From bfb36a5806196e257958907bfcdd71c24acc5d37 Mon Sep 17 00:00:00 2001 From: Pekka Paalanen Date: Mon, 10 Feb 2020 16:07:41 +0100 Subject: [PATCH] randr: auto-bind of GPU is a config change MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When a GPU is auto-bound adding more outputs to a screen, that needs to count as a configuration change on that screen so that a WM listening for RRScreenChangeNotify gets notified and handles it as a hotplug. This is particularly for cases where the outputs are already connected. Otherwise nothing might happen. Issue #909 describes a real world case where plugging in a DisplayLink dock with a monitor already connected is sometimes left inactive by GNOME. That issue is a race, and requires adding a sleep(5); as the first thing in NewGPUDeviceRequest() to reproduce reliably. With the sleep, the monitor in the dock will never activate automatically. Add this fix over the sleep, and the issue is gone. This fix was originally developed on a branch replicating Ubuntu 19.04 patch set based on xserver 1.20.4. Testing on master branch was impossible due to xorg/xserver#910. Closes: https://gitlab.freedesktop.org/xorg/xserver/issues/909 Signed-off-by: Pekka Paalanen Reviewed-by: Michel Dänzer --- randr/rrprovider.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/randr/rrprovider.c b/randr/rrprovider.c index b25ad0feb..dbc3be0e2 100644 --- a/randr/rrprovider.c +++ b/randr/rrprovider.c @@ -1,5 +1,6 @@ /* * Copyright © 2012 Red Hat Inc. + * Copyright 2019 DisplayLink (UK) Ltd. * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -501,6 +502,9 @@ RRProviderAutoConfigGpuScreen(ScreenPtr pScreen, ScreenPtr masterScreen) (master_provider->capabilities & RR_Capability_SourceOutput)) { pScrPriv->rrProviderSetOutputSource(pScreen, provider, master_provider); RRInitPrimeSyncProps(pScreen); + + masterPriv->configChanged = TRUE; + RRSetChanged(masterScreen); } if ((provider->capabilities & RR_Capability_SourceOffload) &&