Rebase to 1.18.99.901 (1.19-rc1) (+ git master patches uptill today)

- Drop Obsoletes for the driver packages removed from F21 (its been 2
  years since they have been removed now)
This commit is contained in:
Hans de Goede 2016-09-28 16:00:28 +02:00
parent 0deee42aec
commit db3d278c99
10 changed files with 1065 additions and 1971 deletions

View File

@ -1,155 +0,0 @@
From a3922cf7f02feac88a80995cef5e843aafdd970b Mon Sep 17 00:00:00 2001
From: Peter Hutterer <peter.hutterer@who-t.net>
Date: Wed, 1 Jun 2016 14:38:54 +1000
Subject: [PATCH xserver] Allow compile-time selection of a fallback input
driver
A new --with-fallback-input-driver=foo option allows selecting a
fallback driver for the server if the driver configured for the device
is not found. Note that this only applies when the device has a driver
assigned and that module fails to load, devices without a driver are
ignored as usual.
This avoids the situation where a configuration assigns e.g. the
synaptics driver but that driver is not available on the system,
resulting in a dead device. A fallback driver can at least provides some
functionality.
This becomes more important as we move towards making other driver true
leaf nodes that can be installed/uninstalled as requested. Specifically,
wacom and synaptics, a config that assigns either driver should be
viable even when the driver itself is not (yet) installed on the system.
It is up to the distributions to make sure that the fallback driver is
always installed. The fallback driver can be disabled with
--without-fallback-input-driver and is disabled by default on non-Linux
systems because we don't have generic drivers on those platforms.
Default driver on Linux is libinput, evdev is the only other serious
candidate here.
Sample log output:
[ 3274.421] (II) config/udev: Adding input device SynPS/2 Synaptics TouchPad (/dev/input/event4)
[ 3274.421] (**) SynPS/2 Synaptics TouchPad: Applying InputClass "touchpad weird driver"
[ 3274.421] (II) LoadModule: "banana"
[ 3274.422] (WW) Warning, couldn't open module banana
[ 3274.422] (II) UnloadModule: "banana"
[ 3274.422] (II) Unloading banana
[ 3274.422] (EE) Failed to load module "banana" (module does not exist, 0)
[ 3274.422] (EE) No input driver matching `banana'
[ 3274.422] (II) Falling back to input driver `libinput'
.. server proceeds to assign libinput, init the device, world peace and rainbows
everywhere, truly what a sight. Shame about the banana though.
Reviewed-by: Adam Jackson <ajax@redhat.com>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
(cherry picked from commit c69bd15e00aea2610834d05f63777f9bf20eca34)
---
configure.ac | 19 +++++++++++++++++++
hw/xfree86/common/xf86Xinput.c | 39 +++++++++++++++++++++++++++++++--------
include/xorg-config.h.in | 3 +++
3 files changed, 53 insertions(+), 8 deletions(-)
diff --git a/configure.ac b/configure.ac
index 868e859..dea8edd 100644
--- a/configure.ac
+++ b/configure.ac
@@ -493,6 +493,25 @@ AC_ARG_ENABLE(listen-local, AS_HELP_STRING([--disable-listen-local],
[Listen on local by default (default:enabled)]),
[LISTEN_LOCAL=$enableval], [LISTEN_LOCAL=yes])
+case $host_os in
+ linux*)
+ FALLBACK_INPUT_DRIVER="libinput"
+ ;;
+ *)
+ FALLBACK_INPUT_DRIVER=""
+ ;;
+esac
+AC_ARG_WITH(fallback-input-driver,
+ AC_HELP_STRING([--with-fallback-input-driver=$FALLBACK_INPUT_DRIVER],
+ [Input driver fallback if the requested driver for a device is unavailable]),
+ [ FALLBACK_INPUT_DRIVER=$withval ], [])
+if test "x$FALLBACK_INPUT_DRIVER" = "xno"; then
+ FALLBACK_INPUT_DRIVER=""
+fi
+AC_MSG_CHECKING([for fallback input driver])
+AC_MSG_RESULT([$FALLBACK_INPUT_DRIVER])
+AC_DEFINE_UNQUOTED(FALLBACK_INPUT_DRIVER, ["$FALLBACK_INPUT_DRIVER"], [ Fallback input driver ])
+
dnl Determine font path
XORG_FONTROOTDIR
XORG_FONTSUBDIR(FONTMISCDIR, fontmiscdir, misc)
diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c
index c56a2b9..44f4818 100644
--- a/hw/xfree86/common/xf86Xinput.c
+++ b/hw/xfree86/common/xf86Xinput.c
@@ -819,6 +819,22 @@ xf86stat(const char *path, int *maj, int *min)
*min = minor(st.st_rdev);
}
+static inline InputDriverPtr
+xf86LoadInputDriver(const char *driver_name)
+{
+ InputDriverPtr drv = NULL;
+
+ /* Memory leak for every attached device if we don't
+ * test if the module is already loaded first */
+ drv = xf86LookupInputDriver(driver_name);
+ if (!drv) {
+ if (xf86LoadOneModule(driver_name, NULL))
+ drv = xf86LookupInputDriver(driver_name);
+ }
+
+ return drv;
+}
+
/**
* Create a new input device, activate and enable it.
*
@@ -845,16 +861,23 @@ xf86NewInputDevice(InputInfoPtr pInfo, DeviceIntPtr *pdev, BOOL enable)
int rval;
char *path = NULL;
- /* Memory leak for every attached device if we don't
- * test if the module is already loaded first */
- drv = xf86LookupInputDriver(pInfo->driver);
- if (!drv)
- if (xf86LoadOneModule(pInfo->driver, NULL))
- drv = xf86LookupInputDriver(pInfo->driver);
+ drv = xf86LoadInputDriver(pInfo->driver);
if (!drv) {
xf86Msg(X_ERROR, "No input driver matching `%s'\n", pInfo->driver);
- rval = BadName;
- goto unwind;
+
+ if (strlen(FALLBACK_INPUT_DRIVER) > 0) {
+ xf86Msg(X_INFO, "Falling back to input driver `%s'\n",
+ FALLBACK_INPUT_DRIVER);
+ drv = xf86LoadInputDriver(FALLBACK_INPUT_DRIVER);
+ if (drv) {
+ free(pInfo->driver);
+ pInfo->driver = strdup(FALLBACK_INPUT_DRIVER);
+ }
+ }
+ if (!drv) {
+ rval = BadName;
+ goto unwind;
+ }
}
path = xf86CheckStrOption(pInfo->options, "Device", NULL);
diff --git a/include/xorg-config.h.in b/include/xorg-config.h.in
index 7c03126..2e2da45 100644
--- a/include/xorg-config.h.in
+++ b/include/xorg-config.h.in
@@ -151,4 +151,7 @@
/* Support APM/ACPI power management in the server */
#undef XF86PM
+/* Fallback input driver if the assigned driver fails */
+#undef FALLBACK_INPUT_DRIVER
+
#endif /* _XORG_CONFIG_H_ */
--
2.7.4

View File

@ -1,59 +0,0 @@
From fbb5ac73cb51317bf395e4849e82837c39395bae Mon Sep 17 00:00:00 2001
From: Adam Jackson <ajax@redhat.com>
Date: Mon, 9 May 2016 10:58:47 -0400
Subject: [PATCH] dri: BC hack for ati and openchrome
DRICreatePCIBusID creates a string that is then passed into libdrm. It
only lives in the dri1 code for some reason, so move it to the dri2
code.
---
hw/xfree86/dri/dri.c | 12 ------------
hw/xfree86/dri2/dri2.c | 12 ++++++++++++
2 files changed, 12 insertions(+), 12 deletions(-)
diff --git a/hw/xfree86/dri/dri.c b/hw/xfree86/dri/dri.c
index 0046e52..489f115 100644
--- a/hw/xfree86/dri/dri.c
+++ b/hw/xfree86/dri/dri.c
@@ -2367,18 +2367,6 @@ DRIMoveBuffersHelper(ScreenPtr pScreen,
}
-char *
-DRICreatePCIBusID(const struct pci_device *dev)
-{
- char *busID;
-
- if (asprintf(&busID, "pci:%04x:%02x:%02x.%d",
- dev->domain, dev->bus, dev->dev, dev->func) == -1)
- return NULL;
-
- return busID;
-}
-
static void
drmSIGIOHandler(int interrupt, void *closure)
{
diff --git a/hw/xfree86/dri2/dri2.c b/hw/xfree86/dri2/dri2.c
index d55be19..f5907f0 100644
--- a/hw/xfree86/dri2/dri2.c
+++ b/hw/xfree86/dri2/dri2.c
@@ -1712,3 +1712,15 @@ not_recognized:
*is_param_recognized = FALSE;
return Success;
}
+
+char *
+DRICreatePCIBusID(const struct pci_device *dev)
+{
+ char *busID;
+
+ if (asprintf(&busID, "pci:%04x:%02x:%02x.%d",
+ dev->domain, dev->bus, dev->dev, dev->func) == -1)
+ return NULL;
+
+ return busID;
+}
--
2.7.4

View File

@ -1,192 +0,0 @@
From b9968515cc960ec7a95e32f63339eb7fd952bffc Mon Sep 17 00:00:00 2001
From: Adam Jackson <ajax@redhat.com>
Date: Wed, 16 Mar 2016 11:38:13 -0400
Subject: [PATCH xserver] glx: Implement GLX_EXT_libglvnd (v2.1)
For the dri2 backend, we depend on xfree86 already, so we can walk the
options for the screen looking for a vendor string from xorg.conf. For
the swrast backend we don't have that luxury, so just say mesa. This
extension isn't really meaningful on Windows or OSX yet (since libglvnd
isn't really functional there yet), so on those platforms we don't say
anything and return BadValue for the token from QueryServerString.
v2: Use xnf* allocators when parsing options (Eric and Emil)
v2.1: Backport to 1.18 (ajax)
Reviewed-by: Eric Anholt <eric@anholt.net>
Reviewed-by: Emil Velikov <emil.velikov@collabora.com>
Signed-off-by: Adam Jackson <ajax@redhat.com>
(cherry picked from commit b08526eecf1e165ed9ec2e6b571a5a616a9b696e)
---
glx/extension_string.c | 1 +
glx/extension_string.h | 1 +
glx/glxcmds.c | 10 ++++++++++
glx/glxdri2.c | 25 +++++++++++++++++++++++++
glx/glxdriswrast.c | 4 ++++
glx/glxscreens.c | 1 +
glx/glxscreens.h | 2 ++
hw/xfree86/man/xorg.conf.man | 6 ++++++
8 files changed, 50 insertions(+)
diff --git a/glx/extension_string.c b/glx/extension_string.c
index 616c793..d729ccf 100644
--- a/glx/extension_string.c
+++ b/glx/extension_string.c
@@ -85,6 +85,7 @@ static const struct extension_info known_glx_extensions[] = {
{ GLX(EXT_fbconfig_packed_float), VER(0,0), N, },
{ GLX(EXT_framebuffer_sRGB), VER(0,0), N, },
{ GLX(EXT_import_context), VER(0,0), Y, },
+ { GLX(EXT_libglvnd), VER(0,0), N, },
{ GLX(EXT_stereo_tree), VER(0,0), N, },
{ GLX(EXT_texture_from_pixmap), VER(0,0), Y, },
{ GLX(EXT_visual_info), VER(0,0), Y, },
diff --git a/glx/extension_string.h b/glx/extension_string.h
index 425a805..a10d710 100644
--- a/glx/extension_string.h
+++ b/glx/extension_string.h
@@ -47,6 +47,7 @@ enum {
EXT_create_context_es2_profile_bit,
EXT_fbconfig_packed_float_bit,
EXT_import_context_bit,
+ EXT_libglvnd_bit,
EXT_stereo_tree_bit,
EXT_texture_from_pixmap_bit,
EXT_visual_info_bit,
diff --git a/glx/glxcmds.c b/glx/glxcmds.c
index 561faeb..904e5f6 100644
--- a/glx/glxcmds.c
+++ b/glx/glxcmds.c
@@ -2443,6 +2443,10 @@ __glXDisp_QueryExtensionsString(__GLXclientState * cl, GLbyte * pc)
return Success;
}
+#ifndef GLX_VENDOR_NAMES_EXT
+#define GLX_VENDOR_NAMES_EXT 0x20F6
+#endif
+
int
__glXDisp_QueryServerString(__GLXclientState * cl, GLbyte * pc)
{
@@ -2475,6 +2479,12 @@ __glXDisp_QueryServerString(__GLXclientState * cl, GLbyte * pc)
case GLX_EXTENSIONS:
ptr = pGlxScreen->GLXextensions;
break;
+ case GLX_VENDOR_NAMES_EXT:
+ if (pGlxScreen->glvnd) {
+ ptr = pGlxScreen->glvnd;
+ break;
+ }
+ /* else fall through */
default:
return BadValue;
}
diff --git a/glx/glxdri2.c b/glx/glxdri2.c
index 58e60b9..cabc655 100644
--- a/glx/glxdri2.c
+++ b/glx/glxdri2.c
@@ -943,6 +943,15 @@ initializeExtensions(__GLXDRIscreen * screen)
/* white lie */
extern glx_func_ptr glXGetProcAddressARB(const char *);
+enum {
+ GLXOPT_VENDOR_LIBRARY,
+};
+
+static const OptionInfoRec GLXOptions[] = {
+ { GLXOPT_VENDOR_LIBRARY, "GlxVendorLibrary", OPTV_STRING, {0}, FALSE },
+ { -1, NULL, OPTV_NONE, {0}, FALSE },
+};
+
static __GLXscreen *
__glXDRIscreenProbe(ScreenPtr pScreen)
{
@@ -950,6 +959,8 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
__GLXDRIscreen *screen;
size_t buffer_size;
ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
+ const char *glvnd = NULL;
+ OptionInfoPtr options;
screen = calloc(1, sizeof *screen);
if (screen == NULL)
@@ -995,6 +1006,20 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
GLX_PIXMAP_BIT |
GLX_PBUFFER_BIT);
+ options = xnfalloc(sizeof(GLXOptions));
+ memcpy(options, GLXOptions, sizeof(GLXOptions));
+ xf86ProcessOptions(pScrn->scrnIndex, pScrn->options, options);
+ glvnd = xf86GetOptValString(options, GLXOPT_VENDOR_LIBRARY);
+ if (glvnd)
+ screen->base.glvnd = xnfstrdup(glvnd);
+ free(options);
+
+ if (!screen->base.glvnd)
+ screen->base.glvnd = strdup("mesa");
+
+ if (screen->base.glvnd)
+ __glXEnableExtension(screen->glx_enable_bits, "GLX_EXT_libglvnd");
+
__glXScreenInit(&screen->base, pScreen);
/* The first call simply determines the length of the extension string.
diff --git a/glx/glxdriswrast.c b/glx/glxdriswrast.c
index 924067c..0c5b784 100644
--- a/glx/glxdriswrast.c
+++ b/glx/glxdriswrast.c
@@ -487,6 +487,10 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
GLX_PIXMAP_BIT |
GLX_PBUFFER_BIT);
+#if !defined(XQUARTZ) && !defined(WIN32)
+ screen->base.glvnd = strdup("mesa");
+ __glXEnableExtension(screen->glx_enable_bits, "GLX_EXT_libglvnd");
+#endif
__glXScreenInit(&screen->base, pScreen);
/* The first call simply determines the length of the extension string.
diff --git a/glx/glxscreens.c b/glx/glxscreens.c
index b0ad3b7..8d6b076 100644
--- a/glx/glxscreens.c
+++ b/glx/glxscreens.c
@@ -418,6 +418,7 @@ __glXScreenInit(__GLXscreen * pGlxScreen, ScreenPtr pScreen)
void
__glXScreenDestroy(__GLXscreen * screen)
{
+ free(screen->glvnd);
free(screen->GLXextensions);
free(screen->GLextensions);
free(screen->visuals);
diff --git a/glx/glxscreens.h b/glx/glxscreens.h
index a905877..b1df222 100644
--- a/glx/glxscreens.h
+++ b/glx/glxscreens.h
@@ -154,6 +154,8 @@ struct __GLXscreen {
unsigned GLXminor;
/*@} */
+ char *glvnd;
+
Bool (*CloseScreen) (ScreenPtr pScreen);
};
diff --git a/hw/xfree86/man/xorg.conf.man b/hw/xfree86/man/xorg.conf.man
index e33114d..13ee191 100644
--- a/hw/xfree86/man/xorg.conf.man
+++ b/hw/xfree86/man/xorg.conf.man
@@ -2028,6 +2028,12 @@ Note that disabling an operation will have no effect if the operation is
not accelerated (whether due to lack of support in the hardware or in the
driver).
.TP 7
+.BI "Option \*qGlxVendorLibrary\*q \*q" string \*q
+This option specifies a space-separated list of OpenGL vendor libraries to
+use for the screen. This may be used to select an alternate implementation
+for development, debugging, or alternate feature sets.
+Default: mesa.
+.TP 7
.BI "Option \*qInitPrimary\*q \*q" boolean \*q
Use the Int10 module to initialize the primary graphics card.
Normally, only secondary cards are soft-booted using the Int10 module, as the
--
2.7.4

View File

@ -1 +1 @@
d8b7a900cf912cadb5915b3924dd6ce5a74505e7
453f813bb4afd39eb5b6b3c4a822894e04b6b11b

View File

@ -1 +1 @@
d4842dfe3bd9a9d062f2fa1df9104a46 xorg-server-1.18.4.tar.bz2
00b98dde4aaab2f3ba47d9a9fdebdc6b xorg-server-20160928.tar.xz

View File

@ -1,713 +0,0 @@
From d264f82a7dd601278b1d7099b1eb066eb65cac23 Mon Sep 17 00:00:00 2001
From: Daniel Stone <daniels@collabora.com>
Date: Fri, 20 Nov 2015 15:37:31 +0000
Subject: [PATCH 01/11] XWayland: Use FocusIn events for keyboard enter
wl_keyboard::enter is the equivalent of FocusIn + KeymapNotify: it
notifies us that the surface/window has now received the focus, and
provides us a set of keys which are currently down.
We should use these keys to update the current state, but not to send
any events to clients.
Signed-off-by: Daniel Stone <daniels@collabora.com>
Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
(cherry picked from commit fee0827a9a695600765f3d04376fc9babe497401)
---
hw/xwayland/xwayland-input.c | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/hw/xwayland/xwayland-input.c b/hw/xwayland/xwayland-input.c
index 23e138d..f9e3255 100644
--- a/hw/xwayland/xwayland-input.c
+++ b/hw/xwayland/xwayland-input.c
@@ -462,7 +462,7 @@ keyboard_handle_enter(void *data, struct wl_keyboard *keyboard,
wl_array_copy(&xwl_seat->keys, keys);
wl_array_for_each(k, &xwl_seat->keys)
- QueueKeyboardEvents(xwl_seat->keyboard, KeyPress, *k + 8);
+ QueueKeyboardEvents(xwl_seat->keyboard, KeymapNotify, *k + 8);
}
static void
@@ -474,6 +474,10 @@ keyboard_handle_leave(void *data, struct wl_keyboard *keyboard,
xwl_seat->xwl_screen->serial = serial;
+ /* Unlike keymap_handle_enter above, this time we _do_ want to trigger
+ * full release, as we don't know how long we'll be out of focus for.
+ * Notify clients that the keys have been released, disable autorepeat,
+ * etc. */
wl_array_for_each(k, &xwl_seat->keys)
QueueKeyboardEvents(xwl_seat->keyboard, KeyRelease, *k + 8);
--
2.7.4
From 640692be7d8f61af2da04fea16ba5a97c53993c5 Mon Sep 17 00:00:00 2001
From: Olivier Fourdan <ofourdan@redhat.com>
Date: Wed, 11 May 2016 09:15:19 +0200
Subject: [PATCH 02/11] xwayland: don't check events as early as InitInput
If data is received during XWayland startup, it will be read early in
InitInput() before the connection data is initialized, causing a crash.
Remove the wayland rountrips from InitInput() as this is done again in
xwl_screen_init() where it seems more appropriate.
Signed-off-by: Olivier Fourdan <ofourdan@redhat.com>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=95337
Reviewed-by: Adam Jackson <ajax@redhat.com>
(cherry picked from commit 984be789d5935bc7f695dc61234ef0251ed33679)
---
hw/xwayland/xwayland-input.c | 5 -----
1 file changed, 5 deletions(-)
diff --git a/hw/xwayland/xwayland-input.c b/hw/xwayland/xwayland-input.c
index f9e3255..cbc1bf2 100644
--- a/hw/xwayland/xwayland-input.c
+++ b/hw/xwayland/xwayland-input.c
@@ -899,11 +899,6 @@ InitInput(int argc, char *argv[])
xwl_screen->input_registry = wl_display_get_registry(xwl_screen->display);
wl_registry_add_listener(xwl_screen->input_registry, &input_listener,
xwl_screen);
-
- xwl_screen->expecting_event = 0;
- wl_display_roundtrip(xwl_screen->display);
- while (xwl_screen->expecting_event)
- wl_display_roundtrip(xwl_screen->display);
}
void
--
2.7.4
From 9e19417ad6b78de4e6dede3713396b5030b1bf93 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
Date: Tue, 24 May 2016 18:46:42 +0800
Subject: [PATCH 03/11] xwayland: Use the CLOCK_MONOTONIC clock
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
By default the X server will try CLOCK_MONOTONIC_COARSE before
CLOCK_MONOTONIC, while A Wayland compositor may only support getting
their timestamps from the CLOCK_MONOTONIC clock. This causes various
issues since it may happen that a timestamp from CLOCK_MONOTONIC
retrieved before a sending an X request will still be "later" than the
timestamp the X server than gets after receiving the request, due to the
fact that CLOCK_MONOTONIC_COARSE has a lower resolution.
To avoid these issues, make Xwayland always use CLOCK_MONOTONIC, so
that it becomes possible for Wayland compositor only supporting
CLOCK_MONOTONIC and X server to use the same clock.
Signed-off-by: Jonas Ådahl <jadahl@gmail.com>
Acked-by: Daniel Stone <daniels@collabora.com>
Tested-by: Olivier Fourdan <ofourdan@redhat.com>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
(cherry picked from commit a779fda224bee0c4d27636503367e55ae93b33c2)
---
configure.ac | 4 ++++
hw/xwayland/xwayland.c | 2 ++
include/os.h | 7 +++++++
os/utils.c | 24 ++++++++++++++++++++++--
4 files changed, 35 insertions(+), 2 deletions(-)
diff --git a/configure.ac b/configure.ac
index 868e859..c865bfa 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2487,6 +2487,10 @@ if test "x$XWAYLAND" = xyes; then
AC_SUBST([XWAYLAND_LIBS])
AC_SUBST([XWAYLAND_SYS_LIBS])
+ if test "x$MONOTONIC_CLOCK" != xyes; then
+ AC_MSG_ERROR([Xwayland requires CLOCK_MONOTONIC support.])
+ fi
+
WAYLAND_PREFIX=`$PKG_CONFIG --variable=prefix wayland-client`
AC_PATH_PROG([WAYLAND_SCANNER], [wayland-scanner],,
[${WAYLAND_PREFIX}/bin$PATH_SEPARATOR$PATH])
diff --git a/hw/xwayland/xwayland.c b/hw/xwayland/xwayland.c
index 2d44d07..28dea2f 100644
--- a/hw/xwayland/xwayland.c
+++ b/hw/xwayland/xwayland.c
@@ -32,6 +32,7 @@
#include <misyncshm.h>
#include <compositeext.h>
#include <glx_extinit.h>
+#include <os.h>
#ifdef XF86VIDMODE
#include <X11/extensions/xf86vmproto.h>
@@ -52,6 +53,7 @@ AbortDDX(enum ExitCode error)
void
OsVendorInit(void)
{
+ ForceClockId(CLOCK_MONOTONIC);
}
void
diff --git a/include/os.h b/include/os.h
index 36074a4..11af73f 100644
--- a/include/os.h
+++ b/include/os.h
@@ -51,6 +51,9 @@ SOFTWARE.
#include <stdarg.h>
#include <stdint.h>
#include <string.h>
+#ifdef MONOTONIC_CLOCK
+#include <time.h>
+#endif
#define SCREEN_SAVER_ON 0
#define SCREEN_SAVER_OFF 1
@@ -170,6 +173,10 @@ extern _X_EXPORT void ListenOnOpenFD(int /* fd */ , int /* noxauth */ );
extern _X_EXPORT Bool AddClientOnOpenFD(int /* fd */ );
+#ifdef MONOTONIC_CLOCK
+extern void ForceClockId(clockid_t /* forced_clockid */);
+#endif
+
extern _X_EXPORT CARD32 GetTimeInMillis(void);
extern _X_EXPORT CARD64 GetTimeInMicros(void);
diff --git a/os/utils.c b/os/utils.c
index b45719e..cc3bece 100644
--- a/os/utils.c
+++ b/os/utils.c
@@ -211,6 +211,10 @@ sig_atomic_t inSignalContext = FALSE;
#define HAS_SAVED_IDS_AND_SETEUID
#endif
+#ifdef MONOTONIC_CLOCK
+static clockid_t clockid;
+#endif
+
OsSigHandlerPtr
OsSignal(int sig, OsSigHandlerPtr handler)
{
@@ -428,6 +432,24 @@ GiveUp(int sig)
errno = olderrno;
}
+#ifdef MONOTONIC_CLOCK
+void
+ForceClockId(clockid_t forced_clockid)
+{
+ struct timespec tp;
+
+ BUG_RETURN (clockid);
+
+ clockid = forced_clockid;
+
+ if (clock_gettime(clockid, &tp) != 0) {
+ FatalError("Forced clock id failed to retrieve current time: %s\n",
+ strerror(errno));
+ return;
+ }
+}
+#endif
+
#if (defined WIN32 && defined __MINGW32__) || defined(__CYGWIN__)
CARD32
GetTimeInMillis(void)
@@ -447,7 +469,6 @@ GetTimeInMillis(void)
#ifdef MONOTONIC_CLOCK
struct timespec tp;
- static clockid_t clockid;
if (!clockid) {
#ifdef CLOCK_MONOTONIC_COARSE
@@ -476,7 +497,6 @@ GetTimeInMicros(void)
struct timeval tv;
#ifdef MONOTONIC_CLOCK
struct timespec tp;
- static clockid_t clockid;
if (!clockid) {
if (clock_gettime(CLOCK_MONOTONIC, &tp) == 0)
--
2.7.4
From 619095a3d227f89ea938c3c55f34188ec3cd9e49 Mon Sep 17 00:00:00 2001
From: Olivier Fourdan <ofourdan@redhat.com>
Date: Thu, 12 May 2016 14:51:51 +0200
Subject: [PATCH 04/11] xwayland: Restore wl_display_roundtrip() in InitInput
This partially revert commit 984be78
The rountrip in Xwayland's InitInput() is unlikely the culprit for the
crash reported in bug 95337, even though it's triggered from
InitInput().
Startup goes like this:
xwl_screen_init()
xwl_output_create()
wl_display_roundtrip()
InitInput()
wl_display_roundtrip()
ConnectionInfo initialized
What happens in bug 95337 is that some output data is already available
when we reach InitInput()'s wl_display_roundtrip() and therefore we end
up trying to update the ConnectionInfo's data from RR routines before
ConnectionInfo is actually initialized.
Removing the wl_display_roundtrip() from InitInput() will not fix the
issue (although it would make it less lileky to happen), because
xwl_screen_init() also does a wl_display_roundtrip() after creating the
output, so the race that led to bug 95337 remains.
However, re-setting the xwl_screen->expecting_event to 0 again in
InitInput() still doesn't seem right. so this part is not restored
(thus a partial revert).
Signed-off-by: Olivier Fourdan <ofourdan@redhat.com>
Reviewed-by: Adam Jackson <ajax@redhat.com>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=95337
(cherry picked from commit 6a6bbc3b756706bdade01434f1ee8d8cbe7dd854)
---
hw/xwayland/xwayland-input.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/hw/xwayland/xwayland-input.c b/hw/xwayland/xwayland-input.c
index cbc1bf2..6e95d7e 100644
--- a/hw/xwayland/xwayland-input.c
+++ b/hw/xwayland/xwayland-input.c
@@ -899,6 +899,10 @@ InitInput(int argc, char *argv[])
xwl_screen->input_registry = wl_display_get_registry(xwl_screen->display);
wl_registry_add_listener(xwl_screen->input_registry, &input_listener,
xwl_screen);
+
+ wl_display_roundtrip(xwl_screen->display);
+ while (xwl_screen->expecting_event)
+ wl_display_roundtrip(xwl_screen->display);
}
void
--
2.7.4
From 173b3fb71e404a77402ed1c6884ef9cd184918e7 Mon Sep 17 00:00:00 2001
From: Olivier Fourdan <ofourdan@redhat.com>
Date: Fri, 13 May 2016 08:58:58 +0200
Subject: [PATCH 05/11] randr: Do not update ConnectionInfo if NULL
RRScreenSizeNotify() will update the connection information block, but
if this occurs during initialization before ConnectionInfo is even
initialized, this will lead to a crash.
Simply check for ConnectionInfo prior to update it to avoid the crash.
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=95337
Reviewed-by: Adam Jackson <ajax@redhat.com>
Signed-off-by: Olivier Fourdan <ofourdan@redhat.com>
(cherry picked from commit 941aeb3b92e644923bd112eef8023f033a140ee6)
---
randr/rrscreen.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/randr/rrscreen.c b/randr/rrscreen.c
index d0ca91e..b5e2090 100644
--- a/randr/rrscreen.c
+++ b/randr/rrscreen.c
@@ -41,6 +41,9 @@ RREditConnectionInfo(ScreenPtr pScreen)
int screen = 0;
int d;
+ if (ConnectionInfo == NULL)
+ return;
+
connSetup = (xConnSetup *) ConnectionInfo;
vendor = (char *) connSetup + sizeof(xConnSetup);
formats = (xPixmapFormat *) ((char *) vendor +
--
2.7.4
From 813db111f5b41d07601f4e127b1fb3ce14744af6 Mon Sep 17 00:00:00 2001
From: Jason Gerecke <killertofu@gmail.com>
Date: Fri, 17 Jun 2016 08:44:40 -0700
Subject: [PATCH 06/11] xwayland: Use correct labels when initializing pointer
valuators
Signed-off-by: Jason Gerecke <jason.gerecke@wacom.com>
Reviewed-by: Olivier Fourdan <ofourdan@redhat.com>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
(cherry picked from commit 72df6e2a3a5020696902b70fe940934ef0a681c4)
---
hw/xwayland/xwayland-input.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/hw/xwayland/xwayland-input.c b/hw/xwayland/xwayland-input.c
index 6e95d7e..3413248 100644
--- a/hw/xwayland/xwayland-input.c
+++ b/hw/xwayland/xwayland-input.c
@@ -78,7 +78,7 @@ xwl_pointer_proc(DeviceIntPtr device, int what)
axes_labels[2] = XIGetKnownProperty(AXIS_LABEL_PROP_REL_HWHEEL);
axes_labels[3] = XIGetKnownProperty(AXIS_LABEL_PROP_REL_WHEEL);
- if (!InitValuatorClassDeviceStruct(device, NAXES, btn_labels,
+ if (!InitValuatorClassDeviceStruct(device, NAXES, axes_labels,
GetMotionHistorySize(), Absolute))
return BadValue;
--
2.7.4
From e73279c5dca705e3ee595d254cd1b9fa0df43062 Mon Sep 17 00:00:00 2001
From: Jason Gerecke <killertofu@gmail.com>
Date: Fri, 17 Jun 2016 08:44:41 -0700
Subject: [PATCH 07/11] xwayland: Expose all NBUTTONS buttons on the pointer
The call to 'InitButtonClassDeviceStruct' which initializes the pointer
buttons only results in the first three buttons being created due to a
hardcoded '3'. In order to expose all the buttons defined in the
btn_labels array, we subtitute 'NBUTTONS' in its place.
Signed-off-by: Jason Gerecke <jason.gerecke@wacom.com>
Reviewed-by: Olivier Fourdan <ofourdan@redhat.com>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
(cherry picked from commit 6f2a5b8cdf7b1e913a1e0581e65195dd10f04ca3)
---
hw/xwayland/xwayland-input.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/hw/xwayland/xwayland-input.c b/hw/xwayland/xwayland-input.c
index 3413248..433af9c 100644
--- a/hw/xwayland/xwayland-input.c
+++ b/hw/xwayland/xwayland-input.c
@@ -98,7 +98,7 @@ xwl_pointer_proc(DeviceIntPtr device, int what)
if (!InitPtrFeedbackClassDeviceStruct(device, xwl_pointer_control))
return BadValue;
- if (!InitButtonClassDeviceStruct(device, 3, btn_labels, map))
+ if (!InitButtonClassDeviceStruct(device, NBUTTONS, btn_labels, map))
return BadValue;
return Success;
--
2.7.4
From f77be59aa6f1c4b773488981d6736e26f9083a11 Mon Sep 17 00:00:00 2001
From: Adam Jackson <ajax@redhat.com>
Date: Fri, 8 Jul 2016 15:17:05 -0400
Subject: [PATCH 08/11] xwayland: Only force monotonic clock once
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Otherwise on regeneration we get:
(EE) BUG: triggered 'if (clockid)'
(EE) BUG: utils.c:440 in ForceClockId()
(EE)
(EE) Backtrace:
(EE) 0: ./hw/xwayland/Xwayland (ForceClockId+0x5c) [0x47713c]
(EE) 1: ./hw/xwayland/Xwayland (OsInit+0x25) [0x4763d5]
(EE) 2: ./hw/xwayland/Xwayland (dix_main+0x11c) [0x43e60c]
(EE) 3: /lib64/libc.so.6 (__libc_start_main+0xf1) [0x7f627b2f9731]
(EE) 4: ./hw/xwayland/Xwayland (_start+0x29) [0x4238e9]
(EE) 5: ? (?+0x29) [0x29]
Signed-off-by: Adam Jackson <ajax@redhat.com>
Reviewed-by: Jonas Ådahl <jadahl@gmail.com>
(cherry picked from commit 9fcb554e9bfdf3eed2c2250d89150e3e7b907f01)
---
hw/xwayland/xwayland.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/hw/xwayland/xwayland.c b/hw/xwayland/xwayland.c
index 28dea2f..fdc0817 100644
--- a/hw/xwayland/xwayland.c
+++ b/hw/xwayland/xwayland.c
@@ -53,7 +53,8 @@ AbortDDX(enum ExitCode error)
void
OsVendorInit(void)
{
- ForceClockId(CLOCK_MONOTONIC);
+ if (serverGeneration == 1)
+ ForceClockId(CLOCK_MONOTONIC);
}
void
--
2.7.4
From 8435f9e6dfbd7e07e694eb917e73aefec9a43207 Mon Sep 17 00:00:00 2001
From: Olivier Fourdan <ofourdan@redhat.com>
Date: Tue, 2 Aug 2016 11:24:41 +0200
Subject: [PATCH 09/11] xwayland: Plug memleak in frame callbacks
The frame callback set up via wl_surface_frame() needs to be freed with
wl_callback_destroy() or we'll leak memory.
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=97065
Signed-off-by: Olivier Fourdan <ofourdan@redhat.com>
Reviewed-by: Daniel Stone <daniels@collabora.com>
(cherry picked from commit 4d586118c113f3c0a6e95ed2d3fc7f9d03a4e362)
---
hw/xwayland/xwayland-cursor.c | 2 ++
hw/xwayland/xwayland.c | 2 ++
2 files changed, 4 insertions(+)
diff --git a/hw/xwayland/xwayland-cursor.c b/hw/xwayland/xwayland-cursor.c
index 74dfe4e..7d14a3d 100644
--- a/hw/xwayland/xwayland-cursor.c
+++ b/hw/xwayland/xwayland-cursor.c
@@ -100,6 +100,8 @@ frame_callback(void *data,
uint32_t time)
{
struct xwl_seat *xwl_seat = data;
+
+ wl_callback_destroy (xwl_seat->cursor_frame_cb);
xwl_seat->cursor_frame_cb = NULL;
if (xwl_seat->cursor_needs_update) {
xwl_seat->cursor_needs_update = FALSE;
diff --git a/hw/xwayland/xwayland.c b/hw/xwayland/xwayland.c
index fdc0817..8143c4b 100644
--- a/hw/xwayland/xwayland.c
+++ b/hw/xwayland/xwayland.c
@@ -362,6 +362,8 @@ frame_callback(void *data,
uint32_t time)
{
struct xwl_window *xwl_window = data;
+
+ wl_callback_destroy (xwl_window->frame_callback);
xwl_window->frame_callback = NULL;
}
--
2.7.4
From 93f07a4c033bb4da00c33104a1cbbc69dcd46134 Mon Sep 17 00:00:00 2001
From: Olivier Fourdan <ofourdan@redhat.com>
Date: Mon, 8 Aug 2016 17:57:57 +0200
Subject: [PATCH 10/11] xwayland: Avoid double free of RRCrtc and RROutput
At shutdown, the Xserver will free all its resources which includes the
RRCrtc and RROutput created.
Xwayland would do the same in its xwl_output_destroy() called from
xwl_close_screen(), leading to a double free of existing RRCrtc
RROutput:
Invalid read of size 4
at 0x4CDA10: RRCrtcDestroy (rrcrtc.c:689)
by 0x426E75: xwl_output_destroy (xwayland-output.c:301)
by 0x424144: xwl_close_screen (xwayland.c:117)
by 0x460E17: CursorCloseScreen (cursor.c:187)
by 0x4EB5A3: AnimCurCloseScreen (animcur.c:106)
by 0x4EF431: present_close_screen (present_screen.c:64)
by 0x556D40: dix_main (main.c:354)
by 0x6F0D290: (below main) (in /usr/lib/libc-2.24.so)
Address 0xbb1fc30 is 0 bytes inside a block of size 728 free'd
at 0x4C2BDB0: free (in
/usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
by 0x4CCE5F: RRCrtcDestroyResource (rrcrtc.c:719)
by 0x577541: doFreeResource (resource.c:895)
by 0x5787B5: FreeClientResources (resource.c:1161)
by 0x578862: FreeAllResources (resource.c:1176)
by 0x556C54: dix_main (main.c:323)
by 0x6F0D290: (below main) (in /usr/lib/libc-2.24.so)
Block was alloc'd at
at 0x4C2CA6A: calloc (in
/usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
by 0x4CC6DB: RRCrtcCreate (rrcrtc.c:76)
by 0x426D1C: xwl_output_create (xwayland-output.c:264)
by 0x4232EC: registry_global (xwayland.c:431)
by 0x76CB1C7: ffi_call_unix64 (in /usr/lib/libffi.so.6.0.4)
by 0x76CAC29: ffi_call (in /usr/lib/libffi.so.6.0.4)
by 0x556CEFD: wl_closure_invoke (connection.c:935)
by 0x5569CBF: dispatch_event.isra.4 (wayland-client.c:1310)
by 0x556AF13: dispatch_queue (wayland-client.c:1456)
by 0x556AF13: wl_display_dispatch_queue_pending
(wayland-client.c:1698)
by 0x556B33A: wl_display_roundtrip_queue (wayland-client.c:1121)
by 0x42371C: xwl_screen_init (xwayland.c:631)
by 0x552F60: AddScreen (dispatch.c:3864)
And:
Invalid read of size 4
at 0x522890: RROutputDestroy (rroutput.c:348)
by 0x42684E: xwl_output_destroy (xwayland-output.c:302)
by 0x423CF4: xwl_close_screen (xwayland.c:118)
by 0x4B6377: CursorCloseScreen (cursor.c:187)
by 0x539503: AnimCurCloseScreen (animcur.c:106)
by 0x53D081: present_close_screen (present_screen.c:64)
by 0x43DBF0: dix_main (main.c:354)
by 0x7068730: (below main) (libc-start.c:289)
Address 0xc403190 is 0 bytes inside a block of size 154 free'd
at 0x4C2CD5A: free (vg_replace_malloc.c:530)
by 0x521DF3: RROutputDestroyResource (rroutput.c:389)
by 0x45DA61: doFreeResource (resource.c:895)
by 0x45ECFD: FreeClientResources (resource.c:1161)
by 0x45EDC2: FreeAllResources (resource.c:1176)
by 0x43DB04: dix_main (main.c:323)
by 0x7068730: (below main) (libc-start.c:289)
Block was alloc'd at
at 0x4C2BBAD: malloc (vg_replace_malloc.c:299)
by 0x52206B: RROutputCreate (rroutput.c:84)
by 0x426763: xwl_output_create (xwayland-output.c:270)
by 0x422EDC: registry_global (xwayland.c:432)
by 0x740FC57: ffi_call_unix64 (unix64.S:76)
by 0x740F6B9: ffi_call (ffi64.c:525)
by 0x5495A9D: wl_closure_invoke (connection.c:949)
by 0x549283F: dispatch_event.isra.4 (wayland-client.c:1274)
by 0x5493A13: dispatch_queue (wayland-client.c:1420)
by 0x5493A13: wl_display_dispatch_queue_pending
(wayland-client.c:1662)
by 0x5493D2E: wl_display_roundtrip_queue (wayland-client.c:1085)
by 0x4232EC: xwl_screen_init (xwayland.c:632)
by 0x439F50: AddScreen (dispatch.c:3864)
Split xwl_output_destroy() into xwl_output_destroy() which frees the
wl_output and the xwl_output structure, and xwl_output_remove() which
does the RRCrtcDestroy() and RROutputDestroy() and call the latter only
when an output is effectively removed.
An additional benefit, on top of avoiding a double free, is to avoid
updating the screen size at shutdown.
Signed-off-by: Olivier Fourdan <ofourdan@redhat.com>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
(cherry picked from commit 4cbf1fb1f978ecd975770cebbb330dc10f712b77)
---
hw/xwayland/xwayland-output.c | 12 +++++++++---
hw/xwayland/xwayland.c | 2 +-
hw/xwayland/xwayland.h | 2 ++
3 files changed, 12 insertions(+), 4 deletions(-)
diff --git a/hw/xwayland/xwayland-output.c b/hw/xwayland/xwayland-output.c
index b66da13..38c92a6 100644
--- a/hw/xwayland/xwayland-output.c
+++ b/hw/xwayland/xwayland-output.c
@@ -292,20 +292,26 @@ err:
void
xwl_output_destroy(struct xwl_output *xwl_output)
{
+ wl_output_destroy(xwl_output->output);
+ free(xwl_output);
+}
+
+void
+xwl_output_remove(struct xwl_output *xwl_output)
+{
struct xwl_output *it;
struct xwl_screen *xwl_screen = xwl_output->xwl_screen;
int width = 0, height = 0;
- wl_output_destroy(xwl_output->output);
- xorg_list_del(&xwl_output->link);
RRCrtcDestroy(xwl_output->randr_crtc);
RROutputDestroy(xwl_output->randr_output);
+ xorg_list_del(&xwl_output->link);
xorg_list_for_each_entry(it, &xwl_screen->output_list, link)
output_get_new_size(it, &height, &width);
update_screen_size(xwl_output, width, height);
- free(xwl_output);
+ xwl_output_destroy(xwl_output);
}
static Bool
diff --git a/hw/xwayland/xwayland.c b/hw/xwayland/xwayland.c
index 8143c4b..959f616 100644
--- a/hw/xwayland/xwayland.c
+++ b/hw/xwayland/xwayland.c
@@ -451,7 +451,7 @@ global_remove(void *data, struct wl_registry *registry, uint32_t name)
xorg_list_for_each_entry_safe(xwl_output, tmp_xwl_output,
&xwl_screen->output_list, link) {
if (xwl_output->server_output_id == name) {
- xwl_output_destroy(xwl_output);
+ xwl_output_remove(xwl_output);
break;
}
}
diff --git a/hw/xwayland/xwayland.h b/hw/xwayland/xwayland.h
index 232d9f4..4b97a2e 100644
--- a/hw/xwayland/xwayland.h
+++ b/hw/xwayland/xwayland.h
@@ -170,6 +170,8 @@ struct xwl_output *xwl_output_create(struct xwl_screen *xwl_screen,
void xwl_output_destroy(struct xwl_output *xwl_output);
+void xwl_output_remove(struct xwl_output *xwl_output);
+
RRModePtr xwayland_cvt(int HDisplay, int VDisplay,
float VRefresh, Bool Reduced, Bool Interlaced);
--
2.7.4
From fb96f3b1c5bace29193aeb44fcae2e4d1854f877 Mon Sep 17 00:00:00 2001
From: Olivier Fourdan <ofourdan@redhat.com>
Date: Mon, 8 Aug 2016 17:25:35 +0200
Subject: [PATCH 11/11] present: Free the fake_present OsTimerPtr
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Plug a leak in present_fake_queue_vblank() where the OsTimer would not
be freed.
492,608 (482,816 direct, 9,792 indirect) bytes in 15,088 blocks
are definitely lost in loss record 3,954 of 3,954
at 0x4C2ABDE: malloc (in vgpreload_memcheck-amd64-linux.so)
by 0x586B19: TimerSet (WaitFor.c:433)
by 0x4F1AA9: present_fake_queue_vblank (present_fake.c:108)
by 0x4F15E0: present_pixmap (present.c:954)
by 0x4F23B4: proc_present_pixmap (present_request.c:138)
by 0x552BCE: Dispatch (dispatch.c:430)
by 0x556C22: dix_main (main.c:300)
by 0x6F0D290: (below main) (in /usr/lib/libc-2.24.so)
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=97065
Signed-off-by: Olivier Fourdan <ofourdan@redhat.com>
Reviewed-by: Michel Dänzer <michel.daenzer@amd.com>
(cherry picked from commit de5291c04b05772e6da599a475baa1b19dcae07a)
---
present/present_fake.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/present/present_fake.c b/present/present_fake.c
index 4985c81..2350638 100644
--- a/present/present_fake.c
+++ b/present/present_fake.c
@@ -64,6 +64,7 @@ present_fake_do_timer(OsTimerPtr timer,
present_fake_notify(fake_vblank->screen, fake_vblank->event_id);
xorg_list_del(&fake_vblank->list);
+ TimerFree(fake_vblank->timer);
free(fake_vblank);
return 0;
}
@@ -75,7 +76,7 @@ present_fake_abort_vblank(ScreenPtr screen, uint64_t event_id, uint64_t msc)
xorg_list_for_each_entry_safe(fake_vblank, tmp, &fake_vblank_queue, list) {
if (fake_vblank->event_id == event_id) {
- TimerCancel(fake_vblank->timer);
+ TimerFree(fake_vblank->timer); /* TimerFree will call TimerCancel() */
xorg_list_del(&fake_vblank->list);
free (fake_vblank);
break;
--
2.7.4

View File

@ -11,7 +11,7 @@
# X.org requires lazy relocations to work.
%undefine _hardened_build
#global gitdate 20151027
%global gitdate 20160928
%global stable_abi 1
%if !0%{?gitdate} || %{stable_abi}
@ -19,11 +19,11 @@
# source because rpm is a terrible language.
%global ansic_major 0
%global ansic_minor 4
%global videodrv_major 20
%global videodrv_major 23
%global videodrv_minor 0
%global xinput_major 22
%global xinput_major 24
%global xinput_minor 1
%global extension_major 9
%global extension_major 10
%global extension_minor 0
%endif
@ -77,24 +77,16 @@ Source31: xserver-sdk-abi-requires.git
# maintainer convenience script
Source40: driver-abi-rebuild.sh
# xwayland backports from master
Patch0: xorg-x11-server-xwayland-backports.patch
# prime fixes from master (and pending upstream review)
Patch1: xserver-prime-fixes.patch
Patch10: 0001-glx-Implement-GLX_EXT_libglvnd-v2.1.patch
# Misc fixes pending merge into master
Patch0: xserver-1.19-pending-fixes.patch
#Patch6044: xserver-1.6.99-hush-prerelease-warning.patch
Patch7025: 0001-Always-install-vbe-and-int10-sdk-headers.patch
# do not upstream - do not even use here yet
# Submitted upstream, pending
Patch7027: xserver-autobind-hotplug.patch
# Pick libinput as driver when the assigned module is missing
Patch7028: 0001-Allow-compile-time-selection-of-a-fallback-input-dri.patch
# because the display-managers are not ready yet, do not upstream
Patch10000: 0001-Fedora-hack-Make-the-suid-root-wrapper-always-start-.patch
@ -132,7 +124,7 @@ BuildRequires: xorg-x11-font-utils >= 7.2-11
BuildRequires: dbus-devel libepoxy-devel systemd-devel
BuildRequires: xorg-x11-xtrans-devel >= 1.3.2
BuildRequires: libXfont-devel libXau-devel libxkbfile-devel libXres-devel
BuildRequires: libXfont2-devel libXau-devel libxkbfile-devel libXres-devel
BuildRequires: libfontenc-devel libXtst-devel libXdmcp-devel
BuildRequires: libX11-devel libXext-devel
BuildRequires: libXinerama-devel libXi-devel
@ -141,11 +133,9 @@ BuildRequires: libXinerama-devel libXi-devel
BuildRequires: libXt-devel libdmx-devel libXmu-devel libXrender-devel
BuildRequires: libXi-devel libXpm-devel libXaw-devel libXfixes-devel
%if 0%{?fedora} > 20
BuildRequires: wayland-devel
BuildRequires: pkgconfig(wayland-client) >= 1.3.0
BuildRequires: pkgconfig(epoxy)
%endif
%if !0%{?rhel}
BuildRequires: pkgconfig(xshmfence) >= 1.1
%endif
@ -214,30 +204,6 @@ Provides: xorg-x11-glamor = %{version}-%{release}
Obsoletes: xorg-x11-drv-modesetting < %{version}-%{release}
Provides: xorg-x11-drv-modesetting = %{version}-%{release}
%if 0%{?fedora} > 20
# Dropped from F21
Obsoletes: xorg-x11-drv-apm < 1.2.5-18
Obsoletes: xorg-x11-drv-cirrus < 1.5.2-10
Obsoletes: xorg-x11-drv-glint < 1.2.8-17
Obsoletes: xorg-x11-drv-i128 < 1.3.6-18
Obsoletes: xorg-x11-drv-i740 < 1.3.4-18
Obsoletes: xorg-x11-drv-mach64 < 6.9.4-16
Obsoletes: xorg-x11-drv-mga < 1.6.2-17
Obsoletes: xorg-x11-drv-neomagic < 1.2.8-8
Obsoletes: xorg-x11-drv-r128 < 6.9.2-2
Obsoletes: xorg-x11-drv-rendition < 4.2.5-18
Obsoletes: xorg-x11-drv-s3virge < 1.10.6-18
Obsoletes: xorg-x11-drv-savage < 2.3.7-7
Obsoletes: xorg-x11-drv-siliconmotion < 1.7.7-17
Obsoletes: xorg-x11-drv-sis < 0.10.7-19
Obsoletes: xorg-x11-drv-tdfx < 1.4.5-17
Obsoletes: xorg-x11-drv-trident < 1.3.6-18
%endif
%if 0%{?fedora} > 21
# Dropped from F22
Obsoletes: xorg-x11-drv-void < 1.4.1-2
%endif
Requires: xorg-x11-server-common >= %{version}-%{release}
Requires: system-setup-keyboard
@ -315,7 +281,6 @@ X protocol, and therefore supports the newer X extensions like
Render and Composite.
%if 0%{?fedora} > 20
%package Xwayland
Summary: Wayland X Server
Group: User Interface/X
@ -323,7 +288,6 @@ Requires: xorg-x11-server-common >= %{version}-%{release}
%description Xwayland
Xwayland is an X server for running X clients under Wayland.
%endif
%if %{with_hw_servers}
@ -415,11 +379,7 @@ test `getminor extension` == %{extension_minor}
%if 0%{?fedora}
%global bodhi_flags --with-vendor-name="Fedora Project"
%if 0%{?fedora} > 20
%global wayland --enable-xwayland
%else
%global wayland --disable-xwayland
%endif
%endif
# ick
@ -615,10 +575,8 @@ find %{inst_srcdir}/hw/xfree86 -name \*.c -delete
%{_bindir}/Xephyr
%{_mandir}/man1/Xephyr.1*
%if 0%{?fedora} > 20
%files Xwayland
%{_bindir}/Xwayland
%endif
%if %{with_hw_servers}
%files devel
@ -636,6 +594,11 @@ find %{inst_srcdir}/hw/xfree86 -name \*.c -delete
%changelog
* Wed Sep 28 2016 Hans de Goede <hdegoede@redhat.com> - 1.18.99.901-1
- Rebase to 1.18.99.901 (1.19-rc1) (+ git master patches uptill today)
- Drop Obsoletes for the driver packages removed from F21 (its been 2
years since they have been removed now)
* Thu Sep 08 2016 Adam Jackson <ajax@redhat.com> 1.18.4-6
- Backport GLX_EXT_libglvnd support from 1.19

View File

@ -0,0 +1,827 @@
From abe57372a111c27e6ca0865f9ad7c3d2d6022dfb Mon Sep 17 00:00:00 2001
From: Hans de Goede <hdegoede@redhat.com>
Date: Thu, 15 Sep 2016 14:28:35 +0200
Subject: [PATCH xserver v2 01/14] modesetting: Fix reverse prime partial
update issues on secondary GPU outputs
When using reverse prime we do 2 copies, 1 from the primary GPU's
framebuffer to a shared pixmap and 1 from the shared pixmap to the
secondary GPU's framebuffer.
This means that on the primary GPU side the copy MUST be finished,
before we start the second copy (before the secondary GPU's driver
starts processing the damage on the shared pixmap).
This fixes secondary outputs sometimes showning (some) old fb contents,
because of the 2 copies racing with each other, for an example of
what this looks like see:
https://fedorapeople.org/~jwrdegoede/IMG_20160915_130555.jpg
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Reviewed-by: Dave Airlie <airlied@redhat.com>
Reviewed-by: Eric Anholt <eric@anholt.net>
---
hw/xfree86/drivers/modesetting/driver.c | 13 ++++++++++++-
1 file changed, 12 insertions(+), 1 deletion(-)
diff --git a/hw/xfree86/drivers/modesetting/driver.c b/hw/xfree86/drivers/modesetting/driver.c
index a8e83b2..f98d6da 100644
--- a/hw/xfree86/drivers/modesetting/driver.c
+++ b/hw/xfree86/drivers/modesetting/driver.c
@@ -586,13 +586,24 @@ dispatch_slave_dirty(ScreenPtr pScreen)
static void
redisplay_dirty(ScreenPtr screen, PixmapDirtyUpdatePtr dirty)
{
-
+ modesettingPtr ms = modesettingPTR(xf86ScreenToScrn(screen));
RegionRec pixregion;
PixmapRegionInit(&pixregion, dirty->slave_dst);
DamageRegionAppend(&dirty->slave_dst->drawable, &pixregion);
PixmapSyncDirtyHelper(dirty);
+ if (!screen->isGPU) {
+ /*
+ * When copying from the master framebuffer to the shared pixmap,
+ * we must ensure the copy is complete before the slave starts a
+ * copy to its own framebuffer (some slaves scanout directly from
+ * the shared pixmap, but not all).
+ */
+ if (ms->drmmode.glamor)
+ glamor_finish(screen);
+ }
+
DamageRegionProcessPending(&dirty->slave_dst->drawable);
RegionUninit(&pixregion);
}
--
2.9.3
From d445d873d322f50da163d5e8902049169ee91f8a Mon Sep 17 00:00:00 2001
From: Hans de Goede <hdegoede@redhat.com>
Date: Thu, 15 Sep 2016 14:35:52 +0200
Subject: [PATCH xserver v2 02/14] modesetting: Fix reverse prime update
lagging on secondary GPU outputs
When using secondary GPU outputs the primary GPU's blockhandler
will copy changes from its framebuffer to a pixmap shared with the
secondary GPU.
In reverse prime setups the secondary GPU's blockhandler will do another
copy from the shared pixmap to its own framebuffer.
Before this commit, if the primary GPU's blockhandler would run after
the secondary GPU's blockhandler and no events were pending, then the
secondary GPU's blockhandler would not run until some events came in
(WaitForSomething() would block in the poll call), resulting in the
secondary GPU output sometimes showing stale contents (e.g. a just closed
window) for easily up to 10 seconds.
This commit fixes this by setting the timeout passed into the
blockhandler to 0 if any shared pixmaps were updated by the primary GPU,
forcing an immediate re-run of all blockhandlers.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Reviewed-by: Dave Airlie <airlied@redhat.com>
---
hw/xfree86/drivers/modesetting/driver.c | 13 ++++++++-----
1 file changed, 8 insertions(+), 5 deletions(-)
diff --git a/hw/xfree86/drivers/modesetting/driver.c b/hw/xfree86/drivers/modesetting/driver.c
index f98d6da..d37a42a 100644
--- a/hw/xfree86/drivers/modesetting/driver.c
+++ b/hw/xfree86/drivers/modesetting/driver.c
@@ -584,7 +584,7 @@ dispatch_slave_dirty(ScreenPtr pScreen)
}
static void
-redisplay_dirty(ScreenPtr screen, PixmapDirtyUpdatePtr dirty)
+redisplay_dirty(ScreenPtr screen, PixmapDirtyUpdatePtr dirty, int *timeout)
{
modesettingPtr ms = modesettingPTR(xf86ScreenToScrn(screen));
RegionRec pixregion;
@@ -602,6 +602,9 @@ redisplay_dirty(ScreenPtr screen, PixmapDirtyUpdatePtr dirty)
*/
if (ms->drmmode.glamor)
glamor_finish(screen);
+ /* Ensure the slave processes the damage immediately */
+ if (timeout)
+ *timeout = 0;
}
DamageRegionProcessPending(&dirty->slave_dst->drawable);
@@ -609,7 +612,7 @@ redisplay_dirty(ScreenPtr screen, PixmapDirtyUpdatePtr dirty)
}
static void
-ms_dirty_update(ScreenPtr screen)
+ms_dirty_update(ScreenPtr screen, int *timeout)
{
modesettingPtr ms = modesettingPTR(xf86ScreenToScrn(screen));
@@ -636,7 +639,7 @@ ms_dirty_update(ScreenPtr screen)
if (ppriv->defer_dirty_update)
continue;
- redisplay_dirty(screen, ent);
+ redisplay_dirty(screen, ent, timeout);
DamageEmpty(ent->damage);
}
}
@@ -672,7 +675,7 @@ msBlockHandler(ScreenPtr pScreen, void *timeout)
else if (ms->dirty_enabled)
dispatch_dirty(pScreen);
- ms_dirty_update(pScreen);
+ ms_dirty_update(pScreen, timeout);
}
static void
@@ -1261,7 +1264,7 @@ msPresentSharedPixmap(PixmapPtr slave_dst)
RegionPtr region = DamageRegion(ppriv->dirty->damage);
if (RegionNotEmpty(region)) {
- redisplay_dirty(ppriv->slave_src->drawable.pScreen, ppriv->dirty);
+ redisplay_dirty(ppriv->slave_src->drawable.pScreen, ppriv->dirty, NULL);
DamageEmpty(ppriv->dirty->damage);
return TRUE;
--
2.9.3
From 551f6497040b0b96ca4aaef49ef6de5287256763 Mon Sep 17 00:00:00 2001
From: Hans de Goede <hdegoede@redhat.com>
Date: Sat, 17 Sep 2016 11:42:09 +0200
Subject: [PATCH xserver v2 03/14] xf86RandR12: Move calculating of shift
inside init_one_component
This is a preparation patch to allow easier usage of init_one_component
outside of xf86RandR12CrtcInitGamma.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
---
hw/xfree86/modes/xf86RandR12.c | 15 ++++++++-------
1 file changed, 8 insertions(+), 7 deletions(-)
diff --git a/hw/xfree86/modes/xf86RandR12.c b/hw/xfree86/modes/xf86RandR12.c
index d34bce2..b1ca8b4 100644
--- a/hw/xfree86/modes/xf86RandR12.c
+++ b/hw/xfree86/modes/xf86RandR12.c
@@ -1325,9 +1325,12 @@ xf86RandR12CrtcSetGamma(ScreenPtr pScreen, RRCrtcPtr randr_crtc)
}
static void
-init_one_component(CARD16 *comp, unsigned size, unsigned shift, float gamma)
+init_one_component(CARD16 *comp, unsigned size, float gamma)
{
int i;
+ unsigned shift;
+
+ for (shift = 0; (size << shift) < (1 << 16); shift++);
if (gamma == 1.0) {
for (i = 0; i < size; i++)
@@ -1344,7 +1347,7 @@ static Bool
xf86RandR12CrtcInitGamma(xf86CrtcPtr crtc, float gamma_red, float gamma_green,
float gamma_blue)
{
- unsigned size = crtc->randr_crtc->gammaSize, shift;
+ unsigned size = crtc->randr_crtc->gammaSize;
CARD16 *red, *green, *blue;
if (!crtc->funcs->gamma_set &&
@@ -1358,11 +1361,9 @@ xf86RandR12CrtcInitGamma(xf86CrtcPtr crtc, float gamma_red, float gamma_green,
green = red + size;
blue = green + size;
- for (shift = 0; (size << shift) < (1 << 16); shift++);
-
- init_one_component(red, size, shift, gamma_red);
- init_one_component(green, size, shift, gamma_green);
- init_one_component(blue, size, shift, gamma_blue);
+ init_one_component(red, size, gamma_red);
+ init_one_component(green, size, gamma_green);
+ init_one_component(blue, size, gamma_blue);
RRCrtcGammaSet(crtc->randr_crtc, red, green, blue);
free(red);
--
2.9.3
From 30679a8ec6a25604f1181bad5ebcb4b529b254c7 Mon Sep 17 00:00:00 2001
From: Hans de Goede <hdegoede@redhat.com>
Date: Sat, 17 Sep 2016 11:33:13 +0200
Subject: [PATCH xserver v2 04/14] xf86RandR12: Fix XF86VidModeSetGamma
triggering a BadImplementation error
Commit b4e46c0444bb ("xfree86: Hook up colormaps and RandR 1.2 gamma code")
dropped the providing of a pScrn->ChangeGamma callback from the xf86RandR12
code. Leaving pScrn->ChangeGamma NULL in most cases.
This triggers the BadImplementation error in xf86ChangeGamma() :
if (pScrn->ChangeGamma)
return (*pScrn->ChangeGamma) (pScrn, gamma);
return BadImplementation;
Which causes X-apps using XF86VidModeSetGamma to crash with a
X protocol error.
This commit fixes this by re-introducing the xf86RandR12ChangeGamma
helper removed by the commit and adjusting it to work with the new
combined palette / gamma code.
Fixes: b4e46c0444bb ("xfree86: Hook up colormaps and RandR 1.2 gamma code")
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
---
hw/xfree86/modes/xf86RandR12.c | 30 ++++++++++++++++++++++++++++++
1 file changed, 30 insertions(+)
diff --git a/hw/xfree86/modes/xf86RandR12.c b/hw/xfree86/modes/xf86RandR12.c
index b1ca8b4..d834619 100644
--- a/hw/xfree86/modes/xf86RandR12.c
+++ b/hw/xfree86/modes/xf86RandR12.c
@@ -1924,6 +1924,35 @@ xf86RandR12LoadPalette(ScrnInfoPtr pScrn, int numColors, int *indices,
}
}
+/*
+ * Compatibility pScrn->ChangeGamma provider for ddx drivers which do not call
+ * xf86HandleColormaps(). Note such drivers really should be fixed to call
+ * xf86HandleColormaps() as this clobbers the per-CRTC gamma ramp of the CRTC
+ * assigned to the RandR compatibility output.
+ */
+static int
+xf86RandR12ChangeGamma(ScrnInfoPtr pScrn, Gamma gamma)
+{
+ RRCrtcPtr randr_crtc = xf86CompatRRCrtc(pScrn);
+ int size;
+
+ if (!randr_crtc)
+ return Success;
+
+ size = max(0, randr_crtc->gammaSize);
+ if (!size)
+ return Success;
+
+ init_one_component(randr_crtc->gammaRed, size, gamma.red);
+ init_one_component(randr_crtc->gammaGreen, size, gamma.green);
+ init_one_component(randr_crtc->gammaBlue, size, gamma.blue);
+ xf86RandR12CrtcSetGamma(xf86ScrnToScreen(pScrn), randr_crtc);
+
+ pScrn->gamma = gamma;
+
+ return Success;
+}
+
static Bool
xf86RandR12EnterVT(ScrnInfoPtr pScrn)
{
@@ -2123,6 +2152,7 @@ xf86RandR12Init12(ScreenPtr pScreen)
rp->rrProviderDestroy = xf86RandR14ProviderDestroy;
pScrn->PointerMoved = xf86RandR12PointerMoved;
+ pScrn->ChangeGamma = xf86RandR12ChangeGamma;
randrp->orig_EnterVT = pScrn->EnterVT;
pScrn->EnterVT = xf86RandR12EnterVT;
--
2.9.3
From e5a9f1e6ea0b99462d8d305bf4836128f1b12562 Mon Sep 17 00:00:00 2001
From: Hans de Goede <hdegoede@redhat.com>
Date: Fri, 1 Jul 2016 17:36:02 +0200
Subject: [PATCH xserver v2 05/14] glx: Always enable EXT_texture_from_pixmap
for DRI swrast glx
Prior to commit f95645c6f700 ("glx: Don't enable EXT_texture_from_pixmap
unconditionally") DRI glx would always advertise EXT_texture_from_pixmap.
That commit moved the setting of the extension in the extension bits from
__glXInitExtensionEnableBits to its callers so that
__glXInitExtensionEnableBits can be used more generally, but at the same
time made the setting of EXT_texture_from_pixmap conditionally on
__DRI_TEX_BUFFER being present.
This has result in an unintended behavior change which breaks e.g.
compositors running on llvmpipe. This commit makes the DRI swrast glx code
advertise EXT_texture_from_pixmap unconditionally again fixing this.
Fixes: f95645c6f700 ("glx: Don't enable EXT_texture_from_pixmap unconditionally")
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
Changes in v2:
-Only add unconditional advertising of GLX_EXT_texture_from_pixmap
to glxdriswrast.c, do not also add it to glxdri2.c
---
glx/glxdriswrast.c | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/glx/glxdriswrast.c b/glx/glxdriswrast.c
index ac8bda8..f5c0c9f 100644
--- a/glx/glxdriswrast.c
+++ b/glx/glxdriswrast.c
@@ -396,6 +396,7 @@ initializeExtensions(__GLXscreen * screen)
__glXEnableExtension(screen->glx_enable_bits, "GLX_EXT_framebuffer_sRGB");
__glXEnableExtension(screen->glx_enable_bits, "GLX_ARB_fbconfig_float");
__glXEnableExtension(screen->glx_enable_bits, "GLX_EXT_fbconfig_packed_float");
+ __glXEnableExtension(screen->glx_enable_bits, "GLX_EXT_texture_from_pixmap");
extensions = dri->core->getExtensions(dri->driScreen);
@@ -407,8 +408,6 @@ initializeExtensions(__GLXscreen * screen)
if (strcmp(extensions[i]->name, __DRI_TEX_BUFFER) == 0) {
dri->texBuffer = (const __DRItexBufferExtension *) extensions[i];
- __glXEnableExtension(screen->glx_enable_bits,
- "GLX_EXT_texture_from_pixmap\n");
}
#ifdef __DRI2_FLUSH_CONTROL
--
2.9.3
From 42b9061808359916f8668d1247319246126c30db Mon Sep 17 00:00:00 2001
From: Adam Jackson <ajax@redhat.com>
Date: Tue, 5 Jul 2016 13:07:09 -0400
Subject: [PATCH xserver v2 06/14] xephyr: Don't crash if the server advertises
zero xv adaptors
Useless as an XVideo implementation with zero adaptors might be, it's
apparently a thing in the wild. Catch this case and bail out of xv init
if it happens.
Signed-off-by: Adam Jackson <ajax@redhat.com>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
hw/kdrive/ephyr/ephyrvideo.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/hw/kdrive/ephyr/ephyrvideo.c b/hw/kdrive/ephyr/ephyrvideo.c
index 56a5ff1..31b1eee 100644
--- a/hw/kdrive/ephyr/ephyrvideo.c
+++ b/hw/kdrive/ephyr/ephyrvideo.c
@@ -462,7 +462,7 @@ ephyrXVPrivQueryHostAdaptors(EphyrXVPriv * a_this)
if (a_this->host_adaptors)
a_this->num_adaptors = a_this->host_adaptors->num_adaptors;
- if (a_this->num_adaptors < 0) {
+ if (a_this->num_adaptors <= 0) {
EPHYR_LOG_ERROR("failed to get number of host adaptors\n");
goto out;
}
--
2.9.3
From 6c232ba62aacaa7724faa8b2a0fc664bbe4d0c44 Mon Sep 17 00:00:00 2001
From: David CARLIER <devnexen@gmail.com>
Date: Fri, 23 Sep 2016 14:17:12 +0300
Subject: [PATCH xserver v2 07/14] xfree86: small memory leaks fixes
A couple of memory leaks fixes and avoiding bit shifting on an
unitialized value.
[hdegoede@redhat.com: Split out some non free fixes in separate patches]
[hdegoede@redhat.com: Don't touch ancient (and weird) os/rpcauth.c code]
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
hw/xfree86/ddc/ddc.c | 2 +-
hw/xfree86/drivers/modesetting/driver.c | 3 ++-
hw/xfree86/utils/gtf/gtf.c | 2 ++
3 files changed, 5 insertions(+), 2 deletions(-)
diff --git a/hw/xfree86/ddc/ddc.c b/hw/xfree86/ddc/ddc.c
index ee533db..b82dfc1 100644
--- a/hw/xfree86/ddc/ddc.c
+++ b/hw/xfree86/ddc/ddc.c
@@ -149,7 +149,7 @@ GetEDID_DDC1(unsigned int *s_ptr)
return NULL;
s_end = s_ptr + NUM;
s_pos = s_ptr + s_start;
- d_block = malloc(EDID1_LEN);
+ d_block = calloc(1, EDID1_LEN);
if (!d_block)
return NULL;
d_pos = d_block;
diff --git a/hw/xfree86/drivers/modesetting/driver.c b/hw/xfree86/drivers/modesetting/driver.c
index d37a42a..216388f 100644
--- a/hw/xfree86/drivers/modesetting/driver.c
+++ b/hw/xfree86/drivers/modesetting/driver.c
@@ -847,7 +847,7 @@ ms_get_drm_master_fd(ScrnInfoPtr pScrn)
if (pEnt->location.type == BUS_PCI) {
ms->PciInfo = xf86GetPciInfoForEntity(ms->pEnt->index);
if (ms->PciInfo) {
- BusID = malloc(64);
+ BusID = XNFalloc(64);
sprintf(BusID, "PCI:%d:%d:%d",
#if XSERVER_LIBPCIACCESS
((ms->PciInfo->domain << 8) | ms->PciInfo->bus),
@@ -860,6 +860,7 @@ ms_get_drm_master_fd(ScrnInfoPtr pScrn)
);
}
ms->fd = drmOpen(NULL, BusID);
+ free(BusID);
}
else {
const char *devicename;
diff --git a/hw/xfree86/utils/gtf/gtf.c b/hw/xfree86/utils/gtf/gtf.c
index e88387d..c31bc8f 100644
--- a/hw/xfree86/utils/gtf/gtf.c
+++ b/hw/xfree86/utils/gtf/gtf.c
@@ -692,6 +692,8 @@ main(int argc, char *argv[])
if (o->fbmode)
print_fb_mode(m);
+ free(m);
+
return 0;
}
--
2.9.3
From 74d881897119f84f8d1cd1333dd5496a6672e899 Mon Sep 17 00:00:00 2001
From: Kyle Guinn <elyk03@gmail.com>
Date: Fri, 23 Sep 2016 15:03:34 +0300
Subject: [PATCH xserver v2 08/14] xfree86: Fix null pointer dereference
Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=93675
Signed-off-by: Kyle Guinn <elyk03@gmail.com>
[hdegoede@redhat.com: Simplify by adding 2 if conds together with &&]
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
hw/xfree86/i2c/xf86i2c.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/hw/xfree86/i2c/xf86i2c.c b/hw/xfree86/i2c/xf86i2c.c
index 2a8b8df..22109cf 100644
--- a/hw/xfree86/i2c/xf86i2c.c
+++ b/hw/xfree86/i2c/xf86i2c.c
@@ -614,7 +614,7 @@ xf86CreateI2CDevRec(void)
void
xf86DestroyI2CDevRec(I2CDevPtr d, Bool unalloc)
{
- if (d) {
+ if (d && d->pI2CBus) {
I2CDevPtr *p;
/* Remove this from the list of active I2C devices. */
@@ -628,10 +628,10 @@ xf86DestroyI2CDevRec(I2CDevPtr d, Bool unalloc)
xf86DrvMsg(d->pI2CBus->scrnIndex, X_INFO,
"I2C device \"%s:%s\" removed.\n",
d->pI2CBus->BusName, d->DevName);
-
- if (unalloc)
- free(d);
}
+
+ if (unalloc)
+ free(d);
}
/* I2C transmissions are related to an I2CDevRec you must link to a
--
2.9.3
From 5476dc2b99a7ed52281a39f9fbae4032e35e1923 Mon Sep 17 00:00:00 2001
From: Laszlo Ersek <lersek@redhat.com>
Date: Wed, 7 Sep 2016 15:08:06 +0200
Subject: [PATCH xserver v2 09/14] xfree86: recognize primary BUS_PCI device in
xf86IsPrimaryPlatform()
The new platform bus code and the old PCI bus code overlap. Platform bus
can handle any type of device, including PCI devices, whereas the PCI code
can only handle PCI devices. Some drivers only support the old style
PCI-probe methods, but the primary device detection code is server based,
not driver based; so we might end up with a primary device which only has
a PCI bus-capable driver, but was detected as primary by the platform
code, or the other way around.
(The above paragraph was shamelessly stolen from Hans de Goede, and
customized.)
The latter case applies to QEMU's virtio-gpu-pci device: it is detected as
a BUS_PCI primary device, but we actually probe it first (with the
modesetting driver) through xf86platformProbeDev(). The
xf86IsPrimaryPlatform() function doesn't recognize the device as primary
(it bails out as soon as it sees BUS_PCI); instead, we add the device as a
secondary graphics card under "autoAddGPU". In turn, the success of this
automatic probing-as-GPU prevents xf86CallDriverProbe() from proceeding to
the PCI probing.
The result is that the server exits with no primary devices detected.
Commit cf66471353ac ("xfree86: use udev to provide device enumeration for
kms devices (v10)") added "cross-bus" matching to xf86IsPrimaryPci(). Port
that now to xf86IsPrimaryPlatform(), so that we can probe virtio-gpu-pci
as a primary card in platform bus code.
Cc: Adam Jackson <ajax@redhat.com>
Cc: Dave Airlie <airlied@redhat.com>
Cc: Hans de Goede <hdegoede@redhat.com>
Cc: Keith Packard <keithp@keithp.com>
Cc: Marcin Juszkiewicz <mjuszkiewicz@redhat.com>
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Tested-By: Marcin Juszkiewicz <mjuszkiewicz@redhat.com>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
hw/xfree86/common/xf86platformBus.c | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/hw/xfree86/common/xf86platformBus.c b/hw/xfree86/common/xf86platformBus.c
index 96895a6..71f8df1 100644
--- a/hw/xfree86/common/xf86platformBus.c
+++ b/hw/xfree86/common/xf86platformBus.c
@@ -114,7 +114,15 @@ xf86_find_platform_device_by_devnum(int major, int minor)
static Bool
xf86IsPrimaryPlatform(struct xf86_platform_device *plat)
{
- return ((primaryBus.type == BUS_PLATFORM) && (plat == primaryBus.id.plat));
+ if (primaryBus.type == BUS_PLATFORM)
+ return plat == primaryBus.id.plat;
+#ifdef XSERVER_LIBPCIACCESS
+ if (primaryBus.type == BUS_PCI)
+ if (plat->pdev)
+ if (MATCH_PCI_DEVICES(primaryBus.id.pci, plat->pdev))
+ return TRUE;
+#endif
+ return FALSE;
}
static void
--
2.9.3
From 3790746a3135cb2dfcf3cb8a1b710c81821ae9dc Mon Sep 17 00:00:00 2001
From: Qiang Yu <Qiang.Yu@amd.com>
Date: Thu, 8 Sep 2016 21:24:58 +0800
Subject: [PATCH xserver v2 10/14] config: fix GPUDevice fail when AutoAddGPU
off + BusID
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
This fix is for the following xorg.conf can work:
Section "ServerFlags"
Option "AutoAddGPU" "off"
EndSection
Section "Device"
Identifier "Amd"
Driver "ati"
BusID "PCI:1:0:0"
EndSection
Section "Device"
Identifier "Intel"
Driver "modesetting"
BusID "pci:0:2:0"
EndSection
Section "Screen"
Identifier "Screen0"
Device "Intel"
GPUDevice "Amd"
EndSection
Without AutoAddGPU off, modesetting DDX will also be loaded
for GPUDevice.
Signed-off-by: Qiang Yu <Qiang.Yu@amd.com>
Reviewed-by: Michel Dänzer <michel.daenzer@amd.com>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
hw/xfree86/common/xf86platformBus.c | 18 +++++++++++++++---
1 file changed, 15 insertions(+), 3 deletions(-)
diff --git a/hw/xfree86/common/xf86platformBus.c b/hw/xfree86/common/xf86platformBus.c
index 71f8df1..39fb1dd 100644
--- a/hw/xfree86/common/xf86platformBus.c
+++ b/hw/xfree86/common/xf86platformBus.c
@@ -426,6 +426,19 @@ probeSingleDevice(struct xf86_platform_device *dev, DriverPtr drvp, GDevPtr gdev
return foundScreen;
}
+static Bool
+isGPUDevice(GDevPtr gdev)
+{
+ int i;
+
+ for (i = 0; i < gdev->myScreenSection->num_gpu_devices; i++) {
+ if (gdev == gdev->myScreenSection->gpu_devices[i])
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
int
xf86platformProbeDev(DriverPtr drvp)
{
@@ -458,9 +471,8 @@ xf86platformProbeDev(DriverPtr drvp)
if (j == xf86_num_platform_devices)
continue;
- foundScreen = probeSingleDevice(&xf86_platform_devices[j], drvp, devList[i], 0);
- if (!foundScreen)
- continue;
+ foundScreen = probeSingleDevice(&xf86_platform_devices[j], drvp, devList[i],
+ isGPUDevice(devList[i]) ? PLATFORM_PROBE_GPU_SCREEN : 0);
}
/* if autoaddgpu devices is enabled then go find any unclaimed platform
--
2.9.3
From 68fe9338a4c41863faa76357309cffd5805daeef Mon Sep 17 00:00:00 2001
From: Daniel Martin <consume.noise@gmail.com>
Date: Fri, 11 Dec 2015 12:05:22 +0100
Subject: [PATCH xserver v2 11/14] modesetting: Consume all available udev
events at once
We get multiple udev events for actions like docking a laptop into its
station or plugging a monitor to the station. By consuming as much
events as we can, we reduce the number of output re-evalutions.
I.e. having a Lenovo X250 in a ThinkPad Ultra Dock and plugging a
monitor to the station generates 5 udev events. Or having 2 monitors
attached to the station and docking the laptop generates 7 events.
It depends on the timing how many events can consumed at once.
Signed-off-by: Daniel Martin <consume.noise@gmail.com>
[hdegoede@redhat.com: Keep goto out so that we always call RRGetInfo()]
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
hw/xfree86/drivers/modesetting/drmmode_display.c | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/hw/xfree86/drivers/modesetting/drmmode_display.c b/hw/xfree86/drivers/modesetting/drmmode_display.c
index 6b933e4..b895d62 100644
--- a/hw/xfree86/drivers/modesetting/drmmode_display.c
+++ b/hw/xfree86/drivers/modesetting/drmmode_display.c
@@ -2269,11 +2269,14 @@ drmmode_handle_uevents(int fd, void *closure)
drmModeResPtr mode_res;
xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(scrn);
int i, j;
- Bool found;
+ Bool found = FALSE;
Bool changed = FALSE;
- dev = udev_monitor_receive_device(drmmode->uevent_monitor);
- if (!dev)
+ while ((dev = udev_monitor_receive_device(drmmode->uevent_monitor))) {
+ udev_device_unref(dev);
+ found = TRUE;
+ }
+ if (!found)
return;
mode_res = drmModeGetResources(drmmode->fd);
@@ -2339,7 +2342,6 @@ out_free_res:
drmModeFreeResources(mode_res);
out:
RRGetInfo(xf86ScrnToScreen(scrn), TRUE);
- udev_device_unref(dev);
}
#endif
--
2.9.3
From 351c9ed4f1720dc4789af272d1477e813732ce5a Mon Sep 17 00:00:00 2001
From: Michael Thayer <michael.thayer@oracle.com>
Date: Fri, 16 Sep 2016 17:51:25 +0200
Subject: [PATCH xserver v2 12/14] modesetting: only fall back to
drmModeSetCursor() on -EINVAL
This change effectively reverts commit 074cf58. We were falling back from
drmModeSetCursor2() to drmModeSetCursor() whenever the first failed. This
fall-back only makes sense on pre-mid-2013 kernels which implemented the
cursor_set hook but not cursor_set2, and in this case the call to
drmModeSetCursor2() will always return -EINVAL. Specifically, a return
value of -ENXIO usually means that neither are supported.
Signed-off-by: Michael Thayer <michael.thayer@oracle.com>
[hdegoede@redhat.com: initialize ret to -EINVAL]
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
hw/xfree86/drivers/modesetting/drmmode_display.c | 12 ++++++++----
1 file changed, 8 insertions(+), 4 deletions(-)
diff --git a/hw/xfree86/drivers/modesetting/drmmode_display.c b/hw/xfree86/drivers/modesetting/drmmode_display.c
index b895d62..61a0e27 100644
--- a/hw/xfree86/drivers/modesetting/drmmode_display.c
+++ b/hw/xfree86/drivers/modesetting/drmmode_display.c
@@ -756,7 +756,7 @@ drmmode_set_cursor(xf86CrtcPtr crtc)
drmmode_ptr drmmode = drmmode_crtc->drmmode;
uint32_t handle = drmmode_crtc->cursor_bo->handle;
modesettingPtr ms = modesettingPTR(crtc->scrn);
- int ret;
+ int ret = -EINVAL;
if (!drmmode_crtc->set_cursor2_failed) {
CursorPtr cursor = xf86CurrentCursor(crtc->scrn->pScreen);
@@ -768,11 +768,15 @@ drmmode_set_cursor(xf86CrtcPtr crtc)
if (!ret)
return TRUE;
- drmmode_crtc->set_cursor2_failed = TRUE;
+ /* -EINVAL can mean that an old kernel supports drmModeSetCursor but
+ * not drmModeSetCursor2, though it can mean other things too. */
+ if (ret == -EINVAL)
+ drmmode_crtc->set_cursor2_failed = TRUE;
}
- ret = drmModeSetCursor(drmmode->fd, drmmode_crtc->mode_crtc->crtc_id, handle,
- ms->cursor_width, ms->cursor_height);
+ if (ret == -EINVAL)
+ ret = drmModeSetCursor(drmmode->fd, drmmode_crtc->mode_crtc->crtc_id,
+ handle, ms->cursor_width, ms->cursor_height);
if (ret) {
xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(crtc->scrn);
--
2.9.3
From eeabe942ba61910dc28b83718aca309e0f99ec5a Mon Sep 17 00:00:00 2001
From: Hans de Goede <hdegoede@redhat.com>
Date: Fri, 23 Sep 2016 14:06:52 +0300
Subject: [PATCH xserver v2 13/14] Xext: Fix a memory leak
Based on: https://patchwork.freedesktop.org/patch/85636/
Rewritten to also free the resources allocated by
panoramix_setup_ids().
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Reviewed-by: Emi Velikov <emil.l.velikov@gmail.com>
---
Xext/shm.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Xext/shm.c b/Xext/shm.c
index 125000f..1b622e3 100644
--- a/Xext/shm.c
+++ b/Xext/shm.c
@@ -991,7 +991,7 @@ ProcPanoramiXShmCreatePixmap(ClientPtr client)
RT_PIXMAP, pMap, RT_NONE, NULL, DixCreateAccess);
if (result != Success) {
pDraw->pScreen->DestroyPixmap(pMap);
- return result;
+ break;
}
dixSetPrivate(&pMap->devPrivates, shmPixmapPrivateKey, shmdesc);
shmdesc->refcnt++;
@@ -1008,7 +1008,7 @@ ProcPanoramiXShmCreatePixmap(ClientPtr client)
}
}
- if (result == BadAlloc) {
+ if (result != Success) {
while (j--)
FreeResource(newPix->info[j].id, RT_NONE);
free(newPix);
--
2.9.3
From b2a438f6548a032c77bc54f7b52e683737b6756e Mon Sep 17 00:00:00 2001
From: Hans de Goede <hdegoede@redhat.com>
Date: Fri, 23 Sep 2016 14:11:52 +0300
Subject: [PATCH xserver v2 14/14] XF86VidMode: Fix free() on walked pointer
Based on: https://patchwork.freedesktop.org/patch/85636/
Rewritten to just not walk the pointer.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Reviewed-by: Emi Velikov <emil.l.velikov@gmail.com>
---
Xext/vidmode.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Xext/vidmode.c b/Xext/vidmode.c
index 499a2a8..ea3ad13 100644
--- a/Xext/vidmode.c
+++ b/Xext/vidmode.c
@@ -1364,7 +1364,7 @@ ProcVidModeGetDotClocks(ClientPtr client)
WriteToClient(client, sizeof(xXF86VidModeGetDotClocksReply), &rep);
if (!ClockProg) {
for (n = 0; n < numClocks; n++) {
- dotclock = *Clocks++;
+ dotclock = Clocks[n];
if (client->swapped) {
WriteSwappedDataToClient(client, 4, (char *) &dotclock);
}
--
2.9.3

View File

@ -1,32 +1,136 @@
From cd6f931fb06f825f246222a4362fbf728f8dce73 Mon Sep 17 00:00:00 2001
From 5b6faa0534453ea362de32a5bda0c4466c8e45b9 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)
Subject: [PATCH xserver v2] autobind GPUs to the screen
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.
This is a modified version of a patch we've been carry-ing in Fedora and
RHEL for years now. This patch automatically adds secondary GPUs to the
master as output sink / offload source making e.g. the use of
slave-outputs just work, with requiring the user to manually run
"xrandr --setprovideroutputsource" before he can hookup an external
monitor to his hybrid graphics laptop.
v2: fix if config or slave config is NULL
v3: fix multi useful slaves
DO NOT UPSTREAM.
There is one problem with this patch, which is why it was not upstreamed
before. What to do when a secondary GPU gets detected really is a policy
decission (e.g. one may want to autobind PCI GPUs but not USB ones) and
as such should be under control of the Desktop Environment.
Unconditionally adding autobinding support to the xserver will result
in races between the DE dealing with the hotplug of a secondary GPU
and the server itself dealing with it.
However we've waited for years for any Desktop Environments to actually
start doing some sort of autoconfiguration of secondary GPUs and there
is still not a single DE dealing with this, so I believe that it is
time to upstream this now.
To avoid potential future problems if any DEs get support for doing
secondary GPU configuration themselves, the new autobind functionality
is made optional. Since no DEs currently support doing this themselves it
is enabled by default. When DEs grow support for doing this themselves
they can disable the servers autobinding through the servers cmdline or a
xorg.conf snippet.
Signed-off-by: Dave Airlie <airlied@gmail.com>
[hdegoede@redhat.com: Make configurable, submit upstream]
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
hw/xfree86/common/xf86Init.c | 12 ++++++++++++
hw/xfree86/common/xf86platformBus.c | 3 +++
hw/xfree86/modes/xf86Crtc.c | 32 ++++++++++++++++++++++++++++++++
3 files changed, 47 insertions(+)
Changes in v2:
-Make the default enabled instead of installing a xorg.conf
snippet which enables it unconditionally
---
hw/xfree86/common/xf86Config.c | 19 +++++++++++++++++++
hw/xfree86/common/xf86Globals.c | 2 ++
hw/xfree86/common/xf86Init.c | 16 ++++++++++++++++
hw/xfree86/common/xf86Priv.h | 1 +
hw/xfree86/common/xf86Privstr.h | 1 +
hw/xfree86/common/xf86platformBus.c | 2 ++
hw/xfree86/man/Xorg.man | 7 +++++++
hw/xfree86/man/xorg.conf.man | 6 ++++++
hw/xfree86/modes/xf86Crtc.c | 28 ++++++++++++++++++++++++++++
hw/xfree86/modes/xf86Crtc.h | 3 +++
10 files changed, 85 insertions(+)
diff --git a/hw/xfree86/common/xf86Config.c b/hw/xfree86/common/xf86Config.c
index 560e2ea..31b34a2 100644
--- a/hw/xfree86/common/xf86Config.c
+++ b/hw/xfree86/common/xf86Config.c
@@ -720,6 +720,7 @@ typedef enum {
FLAG_DRI2,
FLAG_USE_SIGIO,
FLAG_AUTO_ADD_GPU,
+ FLAG_AUTO_BIND_GPU,
FLAG_MAX_CLIENTS,
FLAG_IGLX,
} FlagValues;
@@ -781,6 +782,8 @@ static OptionInfoRec FlagOptions[] = {
{0}, FALSE},
{FLAG_AUTO_ADD_GPU, "AutoAddGPU", OPTV_BOOLEAN,
{0}, FALSE},
+ {FLAG_AUTO_BIND_GPU, "AutoBindGPU", OPTV_BOOLEAN,
+ {0}, FALSE},
{FLAG_MAX_CLIENTS, "MaxClients", OPTV_INTEGER,
{0}, FALSE },
{FLAG_IGLX, "IndirectGLX", OPTV_BOOLEAN,
@@ -860,6 +863,22 @@ configServerFlags(XF86ConfFlagsPtr flagsconf, XF86OptionPtr layoutopts)
}
xf86Msg(from, "%sutomatically adding GPU devices\n",
xf86Info.autoAddGPU ? "A" : "Not a");
+
+ if (xf86AutoBindGPUDisabled) {
+ xf86Info.autoBindGPU = FALSE;
+ from = X_CMDLINE;
+ }
+ else if (xf86IsOptionSet(FlagOptions, FLAG_AUTO_BIND_GPU)) {
+ xf86GetOptValBool(FlagOptions, FLAG_AUTO_BIND_GPU,
+ &xf86Info.autoBindGPU);
+ from = X_CONFIG;
+ }
+ else {
+ from = X_DEFAULT;
+ }
+ xf86Msg(from, "%sutomatically binding GPU devices\n",
+ xf86Info.autoBindGPU ? "A" : "Not a");
+
/*
* Set things up based on the config file information. Some of these
* settings may be overridden later when the command line options are
diff --git a/hw/xfree86/common/xf86Globals.c b/hw/xfree86/common/xf86Globals.c
index 07cfabf..072c3fc 100644
--- a/hw/xfree86/common/xf86Globals.c
+++ b/hw/xfree86/common/xf86Globals.c
@@ -136,6 +136,7 @@ xf86InfoRec xf86Info = {
#else
.autoAddGPU = FALSE,
#endif
+ .autoBindGPU = TRUE,
};
const char *xf86ConfigFile = NULL;
@@ -196,6 +197,7 @@ Bool xf86FlipPixels = FALSE;
Gamma xf86Gamma = { 0.0, 0.0, 0.0 };
Bool xf86AllowMouseOpenFail = FALSE;
+Bool xf86AutoBindGPUDisabled = FALSE;
#ifdef XF86VIDMODE
Bool xf86VidModeDisabled = FALSE;
diff --git a/hw/xfree86/common/xf86Init.c b/hw/xfree86/common/xf86Init.c
index 6282252..dc33ad1 100644
index a544b65..70c5b7a 100644
--- a/hw/xfree86/common/xf86Init.c
+++ b/hw/xfree86/common/xf86Init.c
@@ -361,6 +361,16 @@ xf86CreateRootWindow(WindowPtr pWin)
return ret;
@@ -76,6 +76,7 @@
#include "xf86DDC.h"
#include "xf86Xinput.h"
#include "xf86InPriv.h"
+#include "xf86Crtc.h"
#include "picturestr.h"
#include "xf86Bus.h"
@@ -298,6 +299,15 @@ xf86PrivsElevated(void)
}
+extern void xf86AutoConfigOutputDevice(ScrnInfoPtr pScrn, ScrnInfoPtr master);
+static void
static void
+xf86AutoConfigOutputDevices(void)
+{
+ int i;
@ -35,10 +139,11 @@ index 6282252..dc33ad1 100644
+ xf86AutoConfigOutputDevice(xf86GPUScreens[i], xf86Screens[0]);
+}
+
static void
+static void
InstallSignalHandlers(void)
{
@@ -949,6 +959,8 @@ InitOutput(ScreenInfo * pScreenInfo, int argc, char **argv)
/*
@@ -871,6 +881,8 @@ InitOutput(ScreenInfo * pScreenInfo, int argc, char **argv)
for (i = 0; i < xf86NumGPUScreens; i++)
AttachUnboundGPU(xf86Screens[0]->pScreen, xf86GPUScreens[i]->pScreen);
@ -46,21 +151,55 @@ index 6282252..dc33ad1 100644
+
xf86VGAarbiterWrapFunctions();
if (sigio_blocked)
OsReleaseSIGIO();
input_unlock();
@@ -1389,6 +1401,10 @@ ddxProcessArgument(int argc, char **argv, int i)
xf86Info.iglxFrom = X_CMDLINE;
return 0;
}
+ if (!strcmp(argv[i], "-noautoBindGPU")) {
+ xf86AutoBindGPUDisabled = TRUE;
+ return 1;
+ }
/* OS-specific processing */
return xf86ProcessArgument(argc, argv, i);
diff --git a/hw/xfree86/common/xf86Priv.h b/hw/xfree86/common/xf86Priv.h
index c1f8a18..9a3d0df 100644
--- a/hw/xfree86/common/xf86Priv.h
+++ b/hw/xfree86/common/xf86Priv.h
@@ -46,6 +46,7 @@
extern _X_EXPORT const char *xf86ConfigFile;
extern _X_EXPORT const char *xf86ConfigDir;
extern _X_EXPORT Bool xf86AllowMouseOpenFail;
+extern _X_EXPORT Bool xf86AutoBindGPUDisabled;
#ifdef XF86VIDMODE
extern _X_EXPORT Bool xf86VidModeDisabled;
diff --git a/hw/xfree86/common/xf86Privstr.h b/hw/xfree86/common/xf86Privstr.h
index 9e327b9..a0a98aa 100644
--- a/hw/xfree86/common/xf86Privstr.h
+++ b/hw/xfree86/common/xf86Privstr.h
@@ -104,6 +104,7 @@ typedef struct {
MessageType dri2From;
Bool autoAddGPU;
+ Bool autoBindGPU;
} xf86InfoRec, *xf86InfoPtr;
#ifdef DPMSExtension
diff --git a/hw/xfree86/common/xf86platformBus.c b/hw/xfree86/common/xf86platformBus.c
index 33b2b7d..be3bdd9 100644
index 39fb1dd..3e2264f 100644
--- a/hw/xfree86/common/xf86platformBus.c
+++ b/hw/xfree86/common/xf86platformBus.c
@@ -393,6 +393,8 @@ xf86platformProbeDev(DriverPtr drvp)
return foundScreen;
}
@@ -48,6 +48,7 @@
#include "Pci.h"
#include "xf86platformBus.h"
#include "xf86Config.h"
+#include "xf86Crtc.h"
+extern void xf86AutoConfigOutputDevice(ScrnInfoPtr pScrn, ScrnInfoPtr master);
+
int
xf86platformAddDevice(int index)
{
@@ -465,6 +467,7 @@ xf86platformAddDevice(int index)
#include "randrstr.h"
int platformSlotClaimed;
@@ -560,6 +561,7 @@ xf86platformAddDevice(int index)
}
/* attach unbound to 0 protocol screen */
AttachUnboundGPU(xf86Screens[0]->pScreen, xf86GPUScreens[i]->pScreen);
@ -68,22 +207,58 @@ index 33b2b7d..be3bdd9 100644
RRResourcesChanged(xf86Screens[0]->pScreen);
RRTellChanged(xf86Screens[0]->pScreen);
diff --git a/hw/xfree86/man/Xorg.man b/hw/xfree86/man/Xorg.man
index def9bfc..8df6b7d 100644
--- a/hw/xfree86/man/Xorg.man
+++ b/hw/xfree86/man/Xorg.man
@@ -283,6 +283,13 @@ is a comma separated list of directories to search for
server modules. This option is only available when the server is run
as root (i.e, with real-uid 0).
.TP 8
+.B \-noautoBindGPU
+Disable automatically setting secondary GPUs up as output sinks and offload
+sources. This is equivalent to setting the
+.B AutoBindGPU
+xorg.conf(__filemansuffix__) file option. To
+.B false.
+.TP 8
.B \-nosilk
Disable Silken Mouse support.
.TP 8
diff --git a/hw/xfree86/man/xorg.conf.man b/hw/xfree86/man/xorg.conf.man
index 94b199e..bdc121a 100644
--- a/hw/xfree86/man/xorg.conf.man
+++ b/hw/xfree86/man/xorg.conf.man
@@ -676,6 +676,12 @@ Enabled by default.
If this option is disabled, then no GPU devices will be added from the udev
backend. Enabled by default. (May need to be disabled to setup Xinerama).
.TP 7
+.BI "Option \*qAutoBindGPU\*q \*q" boolean \*q
+If enabled then secondary GPUs will be automatically set up as output-sinks and
+offload-sources. Making e.g. laptop outputs connected only to the secondary
+GPU directly available for use without needing to run
+"xrandr --setprovideroutputsource". Enabled by default.
+.TP 7
.BI "Option \*qLog\*q \*q" string \*q
This option controls whether the log is flushed and/or synced to disk after
each message.
diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c
index 4726f2a..e83ea13 100644
index 966a168..4960678 100644
--- a/hw/xfree86/modes/xf86Crtc.c
+++ b/hw/xfree86/modes/xf86Crtc.c
@@ -3440,3 +3440,35 @@ xf86DetachAllCrtc(ScrnInfoPtr scrn)
@@ -3462,3 +3462,31 @@ 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 (!xf86Info.autoBindGPU)
+ return;
+
+ if (!config || !slave_config)
+ return;
@ -91,23 +266,30 @@ index 4726f2a..e83ea13 100644
+ master_provider = config->randr_provider;
+
+ if ((master->capabilities & RR_Capability_SinkOffload) &&
+ pScrn->capabilities & RR_Capability_SourceOffload) {
+ /* source offload */
+
+ DetachUnboundGPU(pScrn->pScreen);
+ unbound = TRUE;
+ pScrn->capabilities & RR_Capability_SourceOffload) {
+ /* source offload */
+ 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;
+ }
+}
diff --git a/hw/xfree86/modes/xf86Crtc.h b/hw/xfree86/modes/xf86Crtc.h
index 14ba9d7..6cf7e89 100644
--- a/hw/xfree86/modes/xf86Crtc.h
+++ b/hw/xfree86/modes/xf86Crtc.h
@@ -1051,4 +1051,7 @@ xf86ProviderSetup(ScrnInfoPtr scrn,
extern _X_EXPORT void
xf86DetachAllCrtc(ScrnInfoPtr scrn);
+extern _X_EXPORT void
+xf86AutoConfigOutputDevice(ScrnInfoPtr pScrn, ScrnInfoPtr master);
+
#endif /* _XF86CRTC_H_ */
--
1.8.3.1
2.9.3

View File

@ -1,759 +0,0 @@
From 94cc6e0424a08d007cc0a8cabcb7d2724ba0f740 Mon Sep 17 00:00:00 2001
From: Hans de Goede <hdegoede@redhat.com>
Date: Tue, 14 Jun 2016 11:58:01 +0200
Subject: [PATCH v2 xserver 01/11] modesetting: Load on GPU-s with 0 outputs
In newer laptops with switchable graphics, the GPU may have 0 outputs,
in this case the modesetting driver should still load if the GPU is
SourceOffload capable, so that it can be used as an offload source provider.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Reviewed-by: Eric Engestrom <eric.engestrom@imgtec.com>
(cherry picked from commit 60ad701a6a8cb9f1eacb72acfe2cb8d3b7a865dc)
---
hw/xfree86/drivers/modesetting/driver.c | 29 ++++++++++++++++++------
hw/xfree86/drivers/modesetting/drmmode_display.c | 6 ++---
2 files changed, 24 insertions(+), 11 deletions(-)
diff --git a/hw/xfree86/drivers/modesetting/driver.c b/hw/xfree86/drivers/modesetting/driver.c
index 14f80b3..718966b 100644
--- a/hw/xfree86/drivers/modesetting/driver.c
+++ b/hw/xfree86/drivers/modesetting/driver.c
@@ -215,14 +215,26 @@ open_hw(const char *dev)
}
static int
-check_outputs(int fd)
+check_outputs(int fd, int *count)
{
drmModeResPtr res = drmModeGetResources(fd);
int ret;
if (!res)
return FALSE;
+
+ if (count)
+ *count = res->count_connectors;
+
ret = res->count_connectors > 0;
+#if defined DRM_CAP_PRIME && GLAMOR_HAS_GBM_LINEAR
+ if (ret == FALSE) {
+ uint64_t value = 0;
+ if (drmGetCap(fd, DRM_CAP_PRIME, &value) == 0 &&
+ (value & DRM_PRIME_CAP_EXPORT))
+ ret = TRUE;
+ }
+#endif
drmModeFreeResources(res);
return ret;
}
@@ -237,13 +249,13 @@ probe_hw(const char *dev, struct xf86_platform_device *platform_dev)
fd = xf86_platform_device_odev_attributes(platform_dev)->fd;
if (fd == -1)
return FALSE;
- return check_outputs(fd);
+ return check_outputs(fd, NULL);
}
#endif
fd = open_hw(dev);
if (fd != -1) {
- int ret = check_outputs(fd);
+ int ret = check_outputs(fd, NULL);
close(fd);
return ret;
@@ -286,7 +298,7 @@ probe_hw_pci(const char *dev, struct pci_device *pdev)
devid = ms_DRICreatePCIBusID(pdev);
if (id && devid && !strcmp(id, devid))
- ret = check_outputs(fd);
+ ret = check_outputs(fd, NULL);
close(fd);
free(id);
@@ -787,7 +799,7 @@ PreInit(ScrnInfoPtr pScrn, int flags)
EntityInfoPtr pEnt;
uint64_t value = 0;
int ret;
- int bppflags;
+ int bppflags, connector_count;
int defaultdepth, defaultbpp;
if (pScrn->numEntities != 1)
@@ -824,6 +836,9 @@ PreInit(ScrnInfoPtr pScrn, int flags)
return FALSE;
ms->drmmode.fd = ms->fd;
+ if (!check_outputs(ms->fd, &connector_count))
+ return FALSE;
+
drmmode_get_default_bpp(pScrn, &ms->drmmode, &defaultdepth, &defaultbpp);
if (defaultdepth == 24 && defaultbpp == 24) {
ms->drmmode.force_24_32 = TRUE;
@@ -915,7 +930,7 @@ PreInit(ScrnInfoPtr pScrn, int flags)
#ifdef DRM_CAP_PRIME
ret = drmGetCap(ms->fd, DRM_CAP_PRIME, &value);
if (ret == 0) {
- if (value & DRM_PRIME_CAP_IMPORT) {
+ if (connector_count && (value & DRM_PRIME_CAP_IMPORT)) {
pScrn->capabilities |= RR_Capability_SinkOutput;
if (ms->drmmode.glamor)
pScrn->capabilities |= RR_Capability_SinkOffload;
@@ -943,7 +958,7 @@ PreInit(ScrnInfoPtr pScrn, int flags)
}
}
- if (pScrn->modes == NULL) {
+ if (!(pScrn->is_gpu && connector_count == 0) && pScrn->modes == NULL) {
xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "No modes.\n");
return FALSE;
}
diff --git a/hw/xfree86/drivers/modesetting/drmmode_display.c b/hw/xfree86/drivers/modesetting/drmmode_display.c
index 9c54310..cc78890 100644
--- a/hw/xfree86/drivers/modesetting/drmmode_display.c
+++ b/hw/xfree86/drivers/modesetting/drmmode_display.c
@@ -1657,10 +1657,8 @@ static Bool
drmmode_xf86crtc_resize(ScrnInfoPtr scrn, int width, int height)
{
xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
-
- drmmode_crtc_private_ptr
- drmmode_crtc = xf86_config->crtc[0]->driver_private;
- drmmode_ptr drmmode = drmmode_crtc->drmmode;
+ modesettingPtr ms = modesettingPTR(scrn);
+ drmmode_ptr drmmode = &ms->drmmode;
drmmode_bo old_front;
Bool ret;
ScreenPtr screen = xf86ScrnToScreen(scrn);
--
2.9.3
From 228e0622ef654bb3918cb62da32a34ab910572cc Mon Sep 17 00:00:00 2001
From: Hans De Goede <hdegoede@redhat.com>
Date: Mon, 8 Aug 2016 14:53:59 +0200
Subject: [PATCH v2 xserver 02/11] Fix Xorg -configure not working anymore
Xorg -configure relies on the bus implementation, e.g.
xf86pciBus.c to call xf86AddBusDeviceToConfigure(). The new
xf86platformBus code does not have support for this.
Almost all drivers support both the xf86platformBus and xf86pciBus
nowadays, and the generic xf86Bus xf86CallDriverProbe() function
prefers the new xf86platformBus probe method when available.
Since the platformBus paths do not call xf86AddBusDeviceToConfigure()
this results in Xorg -configure failing with the following error:
"No devices to configure. Configuration failed.".
Adding support for the xf86Configure code to xf86platformBus.c
is non trivial and since we advise users to normally run without
any Xorg.conf at all not worth the trouble.
However some users still want to use Xorg -configure to generate a
template config file, this commit implements a minimal fix to make
things work again for PCI devices by skipping the platform
probe method when xf86DoConfigure is set.
This has been tested on a system with integrated intel graphics,
with both the intel and modesetting drivers and restores Xorg -configure
functionality on both cases.
Reviewed-by: Adam Jackson <ajax@redhat.com>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
(cherry picked from commit 48c5c23a1b250c7f9d7a1747c76e4669ebf752cf)
---
hw/xfree86/common/xf86Bus.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/hw/xfree86/common/xf86Bus.c b/hw/xfree86/common/xf86Bus.c
index bd36fc5..5b93940 100644
--- a/hw/xfree86/common/xf86Bus.c
+++ b/hw/xfree86/common/xf86Bus.c
@@ -78,7 +78,8 @@ xf86CallDriverProbe(DriverPtr drv, Bool detect_only)
Bool foundScreen = FALSE;
#ifdef XSERVER_PLATFORM_BUS
- if (drv->platformProbe != NULL) {
+ /* xf86platformBus.c does not support Xorg -configure */
+ if (!xf86DoConfigure && drv->platformProbe != NULL) {
foundScreen = xf86platformProbeDev(drv);
}
if (ServerIsNotSeat0() && foundScreen)
--
2.9.3
From 18d9bb82a1ca97157bf9f6168c78c263f42df8cf Mon Sep 17 00:00:00 2001
From: Hans de Goede <hdegoede@redhat.com>
Date: Mon, 15 Aug 2016 10:44:57 +0200
Subject: [PATCH v2 xserver 03/11] modesetting: ms_dri2_create_buffer: check
screen of existing front buffers
If a frontbuffer drawable already has a pixmap, make sure it was created
on the right screen.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
hw/xfree86/drivers/modesetting/dri2.c | 20 +++++++-------------
1 file changed, 7 insertions(+), 13 deletions(-)
diff --git a/hw/xfree86/drivers/modesetting/dri2.c b/hw/xfree86/drivers/modesetting/dri2.c
index 83cb3e0..b810d59 100644
--- a/hw/xfree86/drivers/modesetting/dri2.c
+++ b/hw/xfree86/drivers/modesetting/dri2.c
@@ -117,17 +117,6 @@ get_drawable_pixmap(DrawablePtr drawable)
return screen->GetWindowPixmap((WindowPtr) drawable);
}
-static PixmapPtr
-get_front_buffer(DrawablePtr drawable)
-{
- PixmapPtr pixmap;
-
- pixmap = get_drawable_pixmap(drawable);
- pixmap->refcnt++;
-
- return pixmap;
-}
-
static DRI2Buffer2Ptr
ms_dri2_create_buffer(DrawablePtr drawable, unsigned int attachment,
unsigned int format)
@@ -151,8 +140,13 @@ ms_dri2_create_buffer(DrawablePtr drawable, unsigned int attachment,
}
pixmap = NULL;
- if (attachment == DRI2BufferFrontLeft)
- pixmap = get_front_buffer(drawable);
+ if (attachment == DRI2BufferFrontLeft) {
+ pixmap = get_drawable_pixmap(drawable);
+ if (pixmap && pixmap->drawable.pScreen != screen)
+ pixmap = NULL;
+ if (pixmap)
+ pixmap->refcnt++;
+ }
if (pixmap == NULL) {
int pixmap_width = drawable->width;
--
2.9.3
From 80327f92743e8456f229a833faff996d762b3e93 Mon Sep 17 00:00:00 2001
From: Hans de Goede <hdegoede@redhat.com>
Date: Mon, 15 Aug 2016 11:10:15 +0200
Subject: [PATCH v2 xserver 04/11] modesetting: Remove some dead code
The "if (pixmap) ..." block this commit removes is inside an
"if (pixmap == NULL) ..." block, so it will never execute.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
hw/xfree86/drivers/modesetting/dri2.c | 2 --
1 file changed, 2 deletions(-)
diff --git a/hw/xfree86/drivers/modesetting/dri2.c b/hw/xfree86/drivers/modesetting/dri2.c
index b810d59..9bc56c2 100644
--- a/hw/xfree86/drivers/modesetting/dri2.c
+++ b/hw/xfree86/drivers/modesetting/dri2.c
@@ -186,8 +186,6 @@ ms_dri2_create_buffer(DrawablePtr drawable, unsigned int attachment,
pixmap_cpp,
0);
if (pixmap == NULL) {
- if (pixmap)
- screen->DestroyPixmap(pixmap);
free(private);
free(buffer);
return NULL;
--
2.9.3
From 7a99b5d0110ce3553e8d94b78f6a1a737f93e1a7 Mon Sep 17 00:00:00 2001
From: Hans de Goede <hdegoede@redhat.com>
Date: Mon, 15 Aug 2016 12:02:54 +0200
Subject: [PATCH v2 xserver 05/11] modesetting: Implement DRI2InfoRec version 9
callbacks
Implement the CreateBuffer2 / DestroyBuffer2 / CopyRegion2 DRI2InfoRec
version 9 callbacks, this is necessary for being an offload source
provider with DRI2.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
hw/xfree86/drivers/modesetting/dri2.c | 64 ++++++++++++++++++++++++++++++-----
1 file changed, 55 insertions(+), 9 deletions(-)
diff --git a/hw/xfree86/drivers/modesetting/dri2.c b/hw/xfree86/drivers/modesetting/dri2.c
index 9bc56c2..ed94d63 100644
--- a/hw/xfree86/drivers/modesetting/dri2.c
+++ b/hw/xfree86/drivers/modesetting/dri2.c
@@ -118,10 +118,9 @@ get_drawable_pixmap(DrawablePtr drawable)
}
static DRI2Buffer2Ptr
-ms_dri2_create_buffer(DrawablePtr drawable, unsigned int attachment,
- unsigned int format)
+ms_dri2_create_buffer2(ScreenPtr screen, DrawablePtr drawable,
+ unsigned int attachment, unsigned int format)
{
- ScreenPtr screen = drawable->pScreen;
ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
DRI2Buffer2Ptr buffer;
PixmapPtr pixmap;
@@ -218,6 +217,14 @@ ms_dri2_create_buffer(DrawablePtr drawable, unsigned int attachment,
return buffer;
}
+static DRI2Buffer2Ptr
+ms_dri2_create_buffer(DrawablePtr drawable, unsigned int attachment,
+ unsigned int format)
+{
+ return ms_dri2_create_buffer2(drawable->pScreen, drawable, attachment,
+ format);
+}
+
static void
ms_dri2_reference_buffer(DRI2Buffer2Ptr buffer)
{
@@ -227,7 +234,8 @@ ms_dri2_reference_buffer(DRI2Buffer2Ptr buffer)
}
}
-static void ms_dri2_destroy_buffer(DrawablePtr drawable, DRI2Buffer2Ptr buffer)
+static void ms_dri2_destroy_buffer2(ScreenPtr unused, DrawablePtr unused2,
+ DRI2Buffer2Ptr buffer)
{
if (!buffer)
return;
@@ -245,28 +253,55 @@ static void ms_dri2_destroy_buffer(DrawablePtr drawable, DRI2Buffer2Ptr buffer)
}
}
+static void ms_dri2_destroy_buffer(DrawablePtr drawable, DRI2Buffer2Ptr buffer)
+{
+ ms_dri2_destroy_buffer2(NULL, drawable, buffer);
+}
+
static void
-ms_dri2_copy_region(DrawablePtr drawable, RegionPtr pRegion,
- DRI2BufferPtr destBuffer, DRI2BufferPtr sourceBuffer)
+ms_dri2_copy_region2(ScreenPtr screen, DrawablePtr drawable, RegionPtr pRegion,
+ DRI2BufferPtr destBuffer, DRI2BufferPtr sourceBuffer)
{
ms_dri2_buffer_private_ptr src_priv = sourceBuffer->driverPrivate;
ms_dri2_buffer_private_ptr dst_priv = destBuffer->driverPrivate;
PixmapPtr src_pixmap = src_priv->pixmap;
PixmapPtr dst_pixmap = dst_priv->pixmap;
- ScreenPtr screen = drawable->pScreen;
DrawablePtr src = (sourceBuffer->attachment == DRI2BufferFrontLeft)
? drawable : &src_pixmap->drawable;
DrawablePtr dst = (destBuffer->attachment == DRI2BufferFrontLeft)
? drawable : &dst_pixmap->drawable;
+ int off_x = 0, off_y = 0;
+ Bool translate = FALSE;
RegionPtr pCopyClip;
GCPtr gc;
+ if (destBuffer->attachment == DRI2BufferFrontLeft &&
+ drawable->pScreen != screen) {
+ dst = DRI2UpdatePrime(drawable, destBuffer);
+ if (!dst)
+ return;
+ if (dst != drawable)
+ translate = TRUE;
+ }
+
+ if (translate && drawable->type == DRAWABLE_WINDOW) {
+#ifdef COMPOSITE
+ PixmapPtr pixmap = get_drawable_pixmap(drawable);
+ off_x = -pixmap->screen_x;
+ off_y = -pixmap->screen_y;
+#endif
+ off_x += drawable->x;
+ off_y += drawable->y;
+ }
+
gc = GetScratchGC(dst->depth, screen);
if (!gc)
return;
pCopyClip = REGION_CREATE(screen, NULL, 0);
REGION_COPY(screen, pCopyClip, pRegion);
+ if (translate)
+ REGION_TRANSLATE(screen, pCopyClip, off_x, off_y);
(*gc->funcs->ChangeClip) (gc, CT_REGION, pCopyClip, 0);
ValidateGC(dst, gc);
@@ -282,11 +317,19 @@ ms_dri2_copy_region(DrawablePtr drawable, RegionPtr pRegion,
gc->ops->CopyArea(src, dst, gc,
0, 0,
drawable->width, drawable->height,
- 0, 0);
+ off_x, off_y);
FreeScratchGC(gc);
}
+static void
+ms_dri2_copy_region(DrawablePtr drawable, RegionPtr pRegion,
+ DRI2BufferPtr destBuffer, DRI2BufferPtr sourceBuffer)
+{
+ ms_dri2_copy_region2(drawable->pScreen, drawable, pRegion, destBuffer,
+ sourceBuffer);
+}
+
static uint64_t
gettime_us(void)
{
@@ -827,13 +870,16 @@ ms_dri2_screen_init(ScreenPtr screen)
info.driverName = NULL; /* Compat field, unused. */
info.deviceName = drmGetDeviceNameFromFd(ms->fd);
- info.version = 4;
+ info.version = 9;
info.CreateBuffer = ms_dri2_create_buffer;
info.DestroyBuffer = ms_dri2_destroy_buffer;
info.CopyRegion = ms_dri2_copy_region;
info.ScheduleSwap = ms_dri2_schedule_swap;
info.GetMSC = ms_dri2_get_msc;
info.ScheduleWaitMSC = ms_dri2_schedule_wait_msc;
+ info.CreateBuffer2 = ms_dri2_create_buffer2;
+ info.DestroyBuffer2 = ms_dri2_destroy_buffer2;
+ info.CopyRegion2 = ms_dri2_copy_region2;
/* These two will be filled in by dri2.c */
info.numDrivers = 0;
--
2.9.3
From 39ce336a223f2cdbffb3c774be70c9655f0de024 Mon Sep 17 00:00:00 2001
From: Hans de Goede <hdegoede@redhat.com>
Date: Tue, 23 Aug 2016 12:18:56 +0200
Subject: [PATCH v2 xserver 06/11] glamor: Add
glamor_shareable_fd_from_pixmap()
Add glamor_shareable_fd_from_pixmap function to get dma-buf fds suitable
for sharing across GPUs (not using GPU specific tiling).
This is necessary for the modesetting driver to correctly implement
the DRI2 SharePixmapBacking callback.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Reviewed-by: Keith Packard <keithp@keithp.com>
---
glamor/glamor.c | 20 ++++++++++++++++++++
glamor/glamor.h | 20 ++++++++++++++++++++
2 files changed, 40 insertions(+)
diff --git a/glamor/glamor.c b/glamor/glamor.c
index 0cb73c4..f9020f0 100644
--- a/glamor/glamor.c
+++ b/glamor/glamor.c
@@ -829,6 +829,26 @@ glamor_fd_from_pixmap(ScreenPtr screen,
return -1;
}
+_X_EXPORT int
+glamor_shareable_fd_from_pixmap(ScreenPtr screen,
+ PixmapPtr pixmap, CARD16 *stride, CARD32 *size)
+{
+ unsigned orig_usage_hint = pixmap->usage_hint;
+ int ret;
+
+ /*
+ * The actual difference between a sharable and non sharable buffer
+ * is decided 4 call levels deep in glamor_make_pixmap_exportable()
+ * based on pixmap->usage_hint == CREATE_PIXMAP_USAGE_SHARED
+ * 2 of those calls are also exported API, so we cannot just add a flag.
+ */
+ pixmap->usage_hint = CREATE_PIXMAP_USAGE_SHARED;
+ ret = glamor_fd_from_pixmap(screen, pixmap, stride, size);
+ pixmap->usage_hint = orig_usage_hint;
+
+ return ret;
+}
+
int
glamor_name_from_pixmap(PixmapPtr pixmap, CARD16 *stride, CARD32 *size)
{
diff --git a/glamor/glamor.h b/glamor/glamor.h
index 250dc83..e984092 100644
--- a/glamor/glamor.h
+++ b/glamor/glamor.h
@@ -187,6 +187,26 @@ extern _X_EXPORT int glamor_fd_from_pixmap(ScreenPtr screen,
PixmapPtr pixmap,
CARD16 *stride, CARD32 *size);
+/* @glamor_shareable_fd_from_pixmap: Get a dma-buf fd suitable for sharing
+ * with other GPUs from a pixmap.
+ *
+ * @screen: Current screen pointer.
+ * @pixmap: The pixmap from which we want the fd.
+ * @stride, @size: Pointers to fill the stride and size of the
+ * buffer associated to the fd.
+ *
+ * The returned fd will point to a buffer which is suitable for sharing
+ * across GPUs (not using GPU specific tiling).
+ * The pixmap and the buffer associated by the fd will share the same
+ * content.
+ * The pixmap's stride may be modified by this function.
+ * Returns the fd on success, -1 on error.
+ * */
+extern _X_EXPORT int glamor_shareable_fd_from_pixmap(ScreenPtr screen,
+ PixmapPtr pixmap,
+ CARD16 *stride,
+ CARD32 *size);
+
/**
* @glamor_name_from_pixmap: Gets a gem name from a pixmap.
*
--
2.9.3
From 63df9a26e04063667ab3a0da2fb7097b03605644 Mon Sep 17 00:00:00 2001
From: Hans de Goede <hdegoede@redhat.com>
Date: Wed, 17 Aug 2016 12:03:41 +0200
Subject: [PATCH v2 xserver 07/11] modesetting: Fix msSharePixmapBacking
returning a non-linear bo
glamor_fd_from_pixmap() may return a tiled bo, which is not suitable
for sharing with another GPU as tiling usually is GPU specific.
Switch to glamor_shareable_fd_from_pixmap(), which always returns a
linear bo. This fixes mis-rendering when running the mode setting
driver on the master gpu in a dual-gpu setup and running an opengl
app with DRI_PRIME=1.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Reviewed-by: Keith Packard <keithp@keithp.com>
---
hw/xfree86/drivers/modesetting/driver.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/hw/xfree86/drivers/modesetting/driver.c b/hw/xfree86/drivers/modesetting/driver.c
index 718966b..1e98c80 100644
--- a/hw/xfree86/drivers/modesetting/driver.c
+++ b/hw/xfree86/drivers/modesetting/driver.c
@@ -1087,7 +1087,8 @@ msSharePixmapBacking(PixmapPtr ppix, ScreenPtr screen, void **handle)
int ret;
CARD16 stride;
CARD32 size;
- ret = glamor_fd_from_pixmap(ppix->drawable.pScreen, ppix, &stride, &size);
+ ret = glamor_shareable_fd_from_pixmap(ppix->drawable.pScreen, ppix,
+ &stride, &size);
if (ret == -1)
return FALSE;
--
2.9.3
From 4365b170822c8acefa36eb42378a9e87ae552042 Mon Sep 17 00:00:00 2001
From: Hans de Goede <hdegoede@redhat.com>
Date: Wed, 24 Aug 2016 14:13:19 +0200
Subject: [PATCH v2 xserver 08/11] modesetting: ms_covering_crtc: Remove unused
arguments, make static
Remove unused arguments from ms_covering_crtc, make it static as it is
only used in vblank.c.
While at it also change its first argument from a ScrnInfoPtr to a
ScreenPtr, this makes the next patch in this patch-set cleaner.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
hw/xfree86/drivers/modesetting/driver.h | 2 --
hw/xfree86/drivers/modesetting/vblank.c | 20 +++++---------------
2 files changed, 5 insertions(+), 17 deletions(-)
diff --git a/hw/xfree86/drivers/modesetting/driver.h b/hw/xfree86/drivers/modesetting/driver.h
index 5e1c5d9..747e4e7 100644
--- a/hw/xfree86/drivers/modesetting/driver.h
+++ b/hw/xfree86/drivers/modesetting/driver.h
@@ -136,8 +136,6 @@ void ms_drm_abort_seq(ScrnInfoPtr scrn, uint32_t seq);
Bool ms_crtc_on(xf86CrtcPtr crtc);
xf86CrtcPtr ms_dri2_crtc_covering_drawable(DrawablePtr pDraw);
-xf86CrtcPtr ms_covering_crtc(ScrnInfoPtr scrn, BoxPtr box,
- xf86CrtcPtr desired, BoxPtr crtc_box_ret);
int ms_get_crtc_ust_msc(xf86CrtcPtr crtc, CARD64 *ust, CARD64 *msc);
diff --git a/hw/xfree86/drivers/modesetting/vblank.c b/hw/xfree86/drivers/modesetting/vblank.c
index 77e0848..c2cb70c 100644
--- a/hw/xfree86/drivers/modesetting/vblank.c
+++ b/hw/xfree86/drivers/modesetting/vblank.c
@@ -97,10 +97,10 @@ ms_crtc_on(xf86CrtcPtr crtc)
* with greater coverage
*/
-xf86CrtcPtr
-ms_covering_crtc(ScrnInfoPtr scrn,
- BoxPtr box, xf86CrtcPtr desired, BoxPtr crtc_box_ret)
+static xf86CrtcPtr
+ms_covering_crtc(ScreenPtr pScreen, BoxPtr box)
{
+ ScrnInfoPtr scrn = xf86ScreenToScrn(pScreen);
xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
xf86CrtcPtr crtc, best_crtc;
int coverage, best_coverage;
@@ -109,10 +109,6 @@ ms_covering_crtc(ScrnInfoPtr scrn,
best_crtc = NULL;
best_coverage = 0;
- crtc_box_ret->x1 = 0;
- crtc_box_ret->x2 = 0;
- crtc_box_ret->y1 = 0;
- crtc_box_ret->y2 = 0;
for (c = 0; c < xf86_config->num_crtc; c++) {
crtc = xf86_config->crtc[c];
@@ -123,12 +119,7 @@ ms_covering_crtc(ScrnInfoPtr scrn,
ms_crtc_box(crtc, &crtc_box);
ms_box_intersect(&cover_box, &crtc_box, box);
coverage = ms_box_area(&cover_box);
- if (coverage && crtc == desired) {
- *crtc_box_ret = crtc_box;
- return crtc;
- }
if (coverage > best_coverage) {
- *crtc_box_ret = crtc_box;
best_crtc = crtc;
best_coverage = coverage;
}
@@ -140,15 +131,14 @@ xf86CrtcPtr
ms_dri2_crtc_covering_drawable(DrawablePtr pDraw)
{
ScreenPtr pScreen = pDraw->pScreen;
- ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
- BoxRec box, crtcbox;
+ BoxRec box;
box.x1 = pDraw->x;
box.y1 = pDraw->y;
box.x2 = box.x1 + pDraw->width;
box.y2 = box.y1 + pDraw->height;
- return ms_covering_crtc(pScrn, &box, NULL, &crtcbox);
+ return ms_covering_crtc(pScreen, &box);
}
static Bool
--
2.9.3
From 2feea233731855cbb4ec6021a287145b25c45f6d Mon Sep 17 00:00:00 2001
From: Hans de Goede <hdegoede@redhat.com>
Date: Wed, 24 Aug 2016 14:55:27 +0200
Subject: [PATCH v2 xserver 09/11] modesetting: ms_covering_crtc: Allow calling
on non modesetting Screens
99% of the code in ms_covering_crtc is video-driver agnostic. Add a
screen_is_ms parameter when when FALSE skips the one ms specific check,
this will allow calling ms_covering_crtc on slave GPUs.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
hw/xfree86/drivers/modesetting/vblank.c | 12 +++++++++---
1 file changed, 9 insertions(+), 3 deletions(-)
diff --git a/hw/xfree86/drivers/modesetting/vblank.c b/hw/xfree86/drivers/modesetting/vblank.c
index c2cb70c..0b1abb0 100644
--- a/hw/xfree86/drivers/modesetting/vblank.c
+++ b/hw/xfree86/drivers/modesetting/vblank.c
@@ -98,7 +98,7 @@ ms_crtc_on(xf86CrtcPtr crtc)
*/
static xf86CrtcPtr
-ms_covering_crtc(ScreenPtr pScreen, BoxPtr box)
+ms_covering_crtc(ScreenPtr pScreen, BoxPtr box, Bool screen_is_ms)
{
ScrnInfoPtr scrn = xf86ScreenToScrn(pScreen);
xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn);
@@ -106,14 +106,20 @@ ms_covering_crtc(ScreenPtr pScreen, BoxPtr box)
int coverage, best_coverage;
int c;
BoxRec crtc_box, cover_box;
+ Bool crtc_on;
best_crtc = NULL;
best_coverage = 0;
for (c = 0; c < xf86_config->num_crtc; c++) {
crtc = xf86_config->crtc[c];
+ if (screen_is_ms)
+ crtc_on = ms_crtc_on(crtc);
+ else
+ crtc_on = crtc->enabled;
+
/* If the CRTC is off, treat it as not covering */
- if (!ms_crtc_on(crtc))
+ if (!crtc_on)
continue;
ms_crtc_box(crtc, &crtc_box);
@@ -138,7 +144,7 @@ ms_dri2_crtc_covering_drawable(DrawablePtr pDraw)
box.x2 = box.x1 + pDraw->width;
box.y2 = box.y1 + pDraw->height;
- return ms_covering_crtc(pScreen, &box);
+ return ms_covering_crtc(pScreen, &box, TRUE);
}
static Bool
--
2.9.3
From d5783818bc567a4d0645decb7352f0f8bbcf8d44 Mon Sep 17 00:00:00 2001
From: Hans de Goede <hdegoede@redhat.com>
Date: Wed, 24 Aug 2016 15:00:13 +0200
Subject: [PATCH v2 xserver 10/11] modesetting: Fall back to primary crtc for
vblank for drawables on slave outputs
This fixes glxgears running at 1 fps when fully covering a slave-output
and the modesetting driver is used for the master gpu.
Reported-by: Peter Wu <peter@lekensteyn.nl>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
Changes in v2:
-Only fallback to primary crtc if it is in DPMSModeOn
---
hw/xfree86/drivers/modesetting/vblank.c | 23 +++++++++++++++++++++++
1 file changed, 23 insertions(+)
diff --git a/hw/xfree86/drivers/modesetting/vblank.c b/hw/xfree86/drivers/modesetting/vblank.c
index 0b1abb0..99100ec 100644
--- a/hw/xfree86/drivers/modesetting/vblank.c
+++ b/hw/xfree86/drivers/modesetting/vblank.c
@@ -130,6 +130,29 @@ ms_covering_crtc(ScreenPtr pScreen, BoxPtr box, Bool screen_is_ms)
best_coverage = coverage;
}
}
+
+ /* Fallback to primary crtc for drawable's on slave outputs */
+ if (best_crtc == NULL && !pScreen->isGPU) {
+ RROutputPtr primary_output = NULL;
+ ScreenPtr slave;
+
+ if (dixPrivateKeyRegistered(rrPrivKey))
+ primary_output = RRFirstOutput(scrn->pScreen);
+ if (!primary_output || !primary_output->crtc)
+ return NULL;
+
+ crtc = primary_output->crtc->devPrivate;
+ if (!ms_crtc_on(crtc))
+ return NULL;
+
+ xorg_list_for_each_entry(slave, &pScreen->output_slave_list, output_head) {
+ if (ms_covering_crtc(slave, box, FALSE)) {
+ /* The drawable is on a slave output, return primary crtc */
+ return crtc;
+ }
+ }
+ }
+
return best_crtc;
}
--
2.9.3