Hello community,
here is the log from the commit of package xorg-x11-server for openSUSE:Factory
checked in at 2020-12-09 22:11:39
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/xorg-x11-server (Old)
and /work/SRC/openSUSE:Factory/.xorg-x11-server.new.2328 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "xorg-x11-server"
Wed Dec 9 22:11:39 2020 rev:389 rq:853611 version:1.20.10
Changes:
--------
--- /work/SRC/openSUSE:Factory/xorg-x11-server/xorg-x11-server.changes
2020-12-03 18:43:05.690186707 +0100
+++
/work/SRC/openSUSE:Factory/.xorg-x11-server.new.2328/xorg-x11-server.changes
2020-12-09 22:11:41.903083890 +0100
@@ -1,0 +2,44 @@
+Mon Dec 07 13:48:26 UTC 2020 - [email protected]
+
+- Update to version 1.20.10:
+ * Check SetMap request length carefully.
+ * Fix XkbSetDeviceInfo() and SetDeviceIndicators() heap overflows
+ * present/wnmd: Translate update region to screen space
+ * modesetting: keep going if a modeset fails on EnterVT
+ * modesetting: check the kms state on EnterVT
+ * configure: Build hashtable for Xres and glvnd
+ * xwayland: Create an xwl_window for toplevel only
+ * xwayland: non-rootless requires the wl_shell protocol
+ * glamor: Update pixmap's devKind when making it exportable
+ * os: Fix instruction pointer written in xorg_backtrace
+ * present/wnmd: Execute copies at target_msc-1 already
+ * present/wnmd: Move up present_wnmd_queue_vblank
+ * present: Add present_vblank::exec_msc field
+ * present: Move flip target_msc adjustment out of present_vblank_create
+ * xwayland: Remove pending stream reference when freeing
+ * xwayland: use drmGetNodeTypeFromFd for checking if a node is a render one
+ * xwayland: Do not discard frame callbacks on allow commits
+ * present/wnmd: Remove dead check from present_wnmd_check_flip
+ * xwayland: Check window pixmap in xwl_present_check_flip2
+ * present/wnmd: Can't use page flipping for windows clipped by children
+ * xfree86: Take second reference for SavedCursor in xf86CursorSetCursor
+ * glamor: Fix glamor_poly_fill_rect_gl xRectangle::width/height handling
+ * include: Increase the number of max. input devices to 256.
+ * Revert "linux: Make platform device probe less fragile"
+ * Revert "linux: Fix platform device PCI detection for complex bus
topologies"
+ * Revert "linux: Fix platform device probe for DT-based PCI"
+- Remove included pachtes
+ * U_xfree86_take_second_ref_for_xcursor.patch
+ * U_Revert-linux-Fix-platform-device-probe-for-DT-based-.patch
+ * U_Revert-linux-Fix-platform-device-PCI-detection-for-c.patch
+ * U_Revert-linux-Make-platform-device-probe-less-fragile.patch
+ * U_Fix-XkbSetDeviceInfo-and-SetDeviceIndicators-heap-ov.patch
+ * U_Check-SetMap-request-length-carefully.patch
+
+-------------------------------------------------------------------
+Mon Dec 7 11:36:04 UTC 2020 - Stefan Dirsch <[email protected]>
+
+- remove unneeded python2 script 'fdi2iclass.py' from
+ xorg-x11-server-sources subpackage (boo#1179591)
+
+-------------------------------------------------------------------
Old:
----
U_Check-SetMap-request-length-carefully.patch
U_Fix-XkbSetDeviceInfo-and-SetDeviceIndicators-heap-ov.patch
U_Revert-linux-Fix-platform-device-PCI-detection-for-c.patch
U_Revert-linux-Fix-platform-device-probe-for-DT-based-.patch
U_Revert-linux-Make-platform-device-probe-less-fragile.patch
U_xfree86_take_second_ref_for_xcursor.patch
xserver-1.20.9.tar.xz
New:
----
xserver-1.20.10.tar.xz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ xorg-x11-server.spec ++++++
--- /var/tmp/diff_new_pack.vxSRf4/_old 2020-12-09 22:11:43.539085549 +0100
+++ /var/tmp/diff_new_pack.vxSRf4/_new 2020-12-09 22:11:43.539085549 +0100
@@ -41,7 +41,7 @@
%endif
Name: xorg-x11-server
-Version: 1.20.9
+Version: 1.20.10
Release: 0
URL: http://xorg.freedesktop.org/
BuildRoot: %{_tmppath}/%{name}-%{version}-build
@@ -251,15 +251,8 @@
Patch1505: U_xwayland-Allow-passing-a-fd.patch
Patch1600: U_glamor_egl-Reject-OpenGL-2.1-early-on.patch
-Patch1700: U_xfree86_take_second_ref_for_xcursor.patch
Patch1801: U_Fix-segfault-on-probing-a-non-PCI-platform-device-on.patch
-Patch1802: U_Revert-linux-Fix-platform-device-probe-for-DT-based-.patch
-Patch1803: U_Revert-linux-Fix-platform-device-PCI-detection-for-c.patch
-Patch1804: U_Revert-linux-Make-platform-device-probe-less-fragile.patch
-
-Patch1901: U_Fix-XkbSetDeviceInfo-and-SetDeviceIndicators-heap-ov.patch
-Patch1902: U_Check-SetMap-request-length-carefully.patch
%description
This package contains the X.Org Server.
@@ -410,13 +403,7 @@
%patch1503 -p1
%patch1505 -p1
%patch1600 -p1
-%patch1700 -p1
%patch1801 -p1
-%patch1802 -p1
-%patch1803 -p1
-%patch1804 -p1
-%patch1901 -p1
-%patch1902 -p1
%build
%define _lto_cflags %{nil}
@@ -549,6 +536,8 @@
mkdir -p %{buildroot}/usr/src/xserver
xargs cp --parents --target-directory=%{buildroot}/usr/src/xserver <
source-file-list
+# unneeded python2 script; simply remove it (boo#1179591)
+rm -f %{buildroot}/usr/src/xserver/config/fdi2iclass.py
%post
%tmpfiles_create xbb.conf
++++++ _service ++++++
--- /var/tmp/diff_new_pack.vxSRf4/_old 2020-12-09 22:11:43.635085646 +0100
+++ /var/tmp/diff_new_pack.vxSRf4/_new 2020-12-09 22:11:43.639085650 +0100
@@ -2,7 +2,7 @@
<service name="tar_scm" mode="disabled">
<param name="url">https://gitlab.freedesktop.org/xorg/xserver.git</param>
<param name="scm">git</param>
- <param name="revision">afb77415</param>
+ <param name="revision">bc111a2e</param>
<param name="versionformat">@PARENT_TAG@</param>
<param name="versionrewrite-pattern">xorgserver(.*)</param>
<param name="changesgenerate">enable</param>
++++++ _servicedata ++++++
--- /var/tmp/diff_new_pack.vxSRf4/_old 2020-12-09 22:11:43.659085670 +0100
+++ /var/tmp/diff_new_pack.vxSRf4/_new 2020-12-09 22:11:43.659085670 +0100
@@ -1,4 +1,4 @@
<servicedata>
<service name="tar_scm">
<param
name="url">https://gitlab.freedesktop.org/xorg/xserver.git</param>
- <param
name="changesrevision">afb77415e1fb862c322754230f63bb70fd596943</param></service></servicedata>
\ No newline at end of file
+ <param
name="changesrevision">bc111a2e67e16d4e6d4f3196ab86c22c1e278c45</param></service></servicedata>
\ No newline at end of file
++++++ xserver-1.20.9.tar.xz -> xserver-1.20.10.tar.xz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/xserver-1.20.9/Xext/Makefile.am
new/xserver-1.20.10/Xext/Makefile.am
--- old/xserver-1.20.9/Xext/Makefile.am 2020-08-25 17:23:42.000000000 +0200
+++ new/xserver-1.20.10/Xext/Makefile.am 2020-12-01 17:25:37.000000000
+0100
@@ -1,4 +1,4 @@
-noinst_LTLIBRARIES = libXext.la libXvidmode.la
+noinst_LTLIBRARIES = libXext.la libXvidmode.la libhashtable.la
AM_CFLAGS = $(DIX_CFLAGS)
@@ -35,7 +35,7 @@
endif
# XResource extension: lets clients get data about per-client resource usage
-RES_SRCS = hashtable.c hashtable.h xres.c
+RES_SRCS = xres.c
if RES
BUILTIN_SRCS += $(RES_SRCS)
endif
@@ -95,10 +95,16 @@
libXext_la_SOURCES = $(BUILTIN_SRCS)
libXext_la_LIBADD = $(BUILTIN_LIBS)
+if RES
+libXext_la_LIBADD += libhashtable.la
+endif
# XVidMode extension
libXvidmode_la_SOURCES = vidmode.c
+#Hashtable
+libhashtable_la_SOURCES = hashtable.c hashtable.h
+
EXTRA_DIST = \
$(MITSHM_SRCS) \
$(XV_SRCS) \
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/xserver-1.20.9/config/udev.c
new/xserver-1.20.10/config/udev.c
--- old/xserver-1.20.9/config/udev.c 2020-08-25 17:23:42.000000000 +0200
+++ new/xserver-1.20.10/config/udev.c 2020-12-01 17:25:37.000000000 +0100
@@ -56,7 +56,7 @@
#ifdef CONFIG_UDEV_KMS
static void
-config_udev_odev_setup_attribs(struct udev_device *udev_device, const char
*path, const char *syspath,
+config_udev_odev_setup_attribs(const char *path, const char *syspath,
int major, int minor,
config_odev_probe_proc_ptr probe_callback);
#endif
@@ -128,7 +128,7 @@
LogMessage(X_INFO, "config/udev: Adding drm device (%s)\n", path);
- config_udev_odev_setup_attribs(udev_device, path, syspath,
major(devnum),
+ config_udev_odev_setup_attribs(path, syspath, major(devnum),
minor(devnum), NewGPUDeviceRequest);
return;
}
@@ -322,7 +322,7 @@
LogMessage(X_INFO, "config/udev: removing GPU device %s %s\n",
syspath, path);
- config_udev_odev_setup_attribs(device, path, syspath, major(devnum),
+ config_udev_odev_setup_attribs(path, syspath, major(devnum),
minor(devnum), DeleteGPUDeviceRequest);
/* Retry vtenter after a drm node removal */
systemd_logind_vtenter();
@@ -464,50 +464,18 @@
#ifdef CONFIG_UDEV_KMS
-/* Find the last occurrence of the needle in haystack */
-static char *strrstr(const char *haystack, const char *needle)
-{
- char *prev, *last, *tmp;
-
- prev = strstr(haystack, needle);
- if (!prev)
- return NULL;
-
- last = prev;
- tmp = prev + 1;
-
- while (tmp) {
- last = strstr(tmp, needle);
- if (!last)
- return prev;
- else {
- prev = last;
- tmp = prev + 1;
- }
- }
-
- return last;
-}
-
static void
-config_udev_odev_setup_attribs(struct udev_device *udev_device, const char
*path, const char *syspath,
+config_udev_odev_setup_attribs(const char *path, const char *syspath,
int major, int minor,
config_odev_probe_proc_ptr probe_callback)
{
struct OdevAttributes *attribs = config_odev_allocate_attributes();
- const char *value, *str;
attribs->path = XNFstrdup(path);
attribs->syspath = XNFstrdup(syspath);
attribs->major = major;
attribs->minor = minor;
- value = udev_device_get_property_value(udev_device, "ID_PATH");
- if (value && (str = strrstr(value, "pci-"))) {
- attribs->busid = XNFstrdup(str);
- attribs->busid[3] = ':';
- }
-
/* ownership of attribs is passed to probe layer */
probe_callback(attribs);
}
@@ -548,7 +516,7 @@
else if (!check_seat(udev_device))
goto no_probe;
- config_udev_odev_setup_attribs(udev_device, path, syspath,
major(devnum),
+ config_udev_odev_setup_attribs(path, syspath, major(devnum),
minor(devnum), probe_callback);
no_probe:
udev_device_unref(udev_device);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/xserver-1.20.9/configure.ac
new/xserver-1.20.10/configure.ac
--- old/xserver-1.20.9/configure.ac 2020-08-25 17:23:42.000000000 +0200
+++ new/xserver-1.20.10/configure.ac 2020-12-01 17:25:37.000000000 +0100
@@ -26,9 +26,9 @@
dnl Process this file with autoconf to create configure.
AC_PREREQ(2.60)
-AC_INIT([xorg-server], 1.20.9,
[https://gitlab.freedesktop.org/xorg/xserver/issues], xorg-server)
-RELEASE_DATE="2020-08-25"
-RELEASE_NAME="Chicken Parmigiana"
+AC_INIT([xorg-server], 1.20.10,
[https://gitlab.freedesktop.org/xorg/xserver/issues], xorg-server)
+RELEASE_DATE="2020-12-01"
+RELEASE_NAME="Chicken Pot Pie"
AC_CONFIG_SRCDIR([Makefile.am])
AC_CONFIG_MACRO_DIR([m4])
AM_INIT_AUTOMAKE([foreign dist-bzip2])
@@ -1064,9 +1064,11 @@
SDK_REQUIRED_MODULES="$SDK_REQUIRED_MODULES $SCRNSAVERPROTO"
fi
+HASHTABLE=no
AM_CONDITIONAL(RES, [test "x$RES" = xyes])
if test "x$RES" = xyes; then
AC_DEFINE(RES, 1, [Support X resource extension])
+ HASHTABLE=yes
REQUIRED_MODULES="$REQUIRED_MODULES $RESOURCEPROTO"
SDK_REQUIRED_MODULES="$SDK_REQUIRED_MODULES $RESOURCEPROTO"
fi
@@ -1250,6 +1252,7 @@
PKG_CHECK_MODULES([GL], $GLPROTO $LIBGL)
AC_SUBST(XLIB_CFLAGS)
AC_DEFINE(GLXEXT, 1, [Build GLX extension])
+ HASHTABLE=yes
GLX_LIBS='$(top_builddir)/glx/libglx.la
$(top_builddir)/glx/libglxvnd.la'
GLX_SYS_LIBS="$GLX_SYS_LIBS $GL_LIBS"
else
@@ -1257,6 +1260,8 @@
fi
AM_CONDITIONAL(GLX, test "x$GLX" = xyes)
+AM_CONDITIONAL(HASHTABLE, test "x$HASHTABLE" = xyes)
+
AC_SUBST([GLX_DEFINES])
AC_SUBST([GLX_SYS_LIBS])
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/xserver-1.20.9/glamor/glamor_egl.c
new/xserver-1.20.10/glamor/glamor_egl.c
--- old/xserver-1.20.9/glamor/glamor_egl.c 2020-08-25 17:23:42.000000000
+0200
+++ new/xserver-1.20.10/glamor/glamor_egl.c 2020-12-01 17:25:37.000000000
+0100
@@ -350,6 +350,9 @@
*/
glamor_egl_exchange_buffers(pixmap, exported);
+ /* Swap the devKind into the original pixmap, reflecting the bo's stride */
+ screen->ModifyPixmapHeader(pixmap, 0, 0, 0, 0, exported->devKind, NULL);
+
screen->DestroyPixmap(exported);
return TRUE;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/xserver-1.20.9/glamor/glamor_rects.c
new/xserver-1.20.10/glamor/glamor_rects.c
--- old/xserver-1.20.9/glamor/glamor_rects.c 2020-08-25 17:23:42.000000000
+0200
+++ new/xserver-1.20.10/glamor/glamor_rects.c 2020-12-01 17:25:37.000000000
+0100
@@ -27,8 +27,10 @@
static const glamor_facet glamor_facet_polyfillrect_130 = {
.name = "poly_fill_rect",
.version = 130,
- .vs_vars = "attribute vec4 primitive;\n",
- .vs_exec = (" vec2 pos = primitive.zw * vec2(gl_VertexID&1,
(gl_VertexID&2)>>1);\n"
+ .source_name = "size",
+ .vs_vars = "attribute vec2 primitive;\n"
+ "attribute vec2 size;\n",
+ .vs_exec = (" vec2 pos = size * vec2(gl_VertexID&1,
(gl_VertexID&2)>>1);\n"
GLAMOR_POS(gl_Position, (primitive.xy + pos))),
};
@@ -81,9 +83,14 @@
glEnableVertexAttribArray(GLAMOR_VERTEX_POS);
glVertexAttribDivisor(GLAMOR_VERTEX_POS, 1);
- glVertexAttribPointer(GLAMOR_VERTEX_POS, 4, GL_SHORT, GL_FALSE,
+ glVertexAttribPointer(GLAMOR_VERTEX_POS, 2, GL_SHORT, GL_FALSE,
4 * sizeof (short), vbo_offset);
+ glEnableVertexAttribArray(GLAMOR_VERTEX_SOURCE);
+ glVertexAttribDivisor(GLAMOR_VERTEX_SOURCE, 1);
+ glVertexAttribPointer(GLAMOR_VERTEX_SOURCE, 2, GL_UNSIGNED_SHORT,
GL_FALSE,
+ 4 * sizeof (short), vbo_offset + 2 * sizeof
(short));
+
memcpy(v, prect, nrect * sizeof (xRectangle));
glamor_put_vbo_space(screen);
@@ -156,8 +163,11 @@
bail:
glDisable(GL_SCISSOR_TEST);
- if (glamor_priv->glsl_version >= 130)
+ if (glamor_priv->glsl_version >= 130) {
+ glVertexAttribDivisor(GLAMOR_VERTEX_SOURCE, 0);
+ glDisableVertexAttribArray(GLAMOR_VERTEX_SOURCE);
glVertexAttribDivisor(GLAMOR_VERTEX_POS, 0);
+ }
glDisableVertexAttribArray(GLAMOR_VERTEX_POS);
return ret;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/xserver-1.20.9/glx/Makefile.am
new/xserver-1.20.10/glx/Makefile.am
--- old/xserver-1.20.9/glx/Makefile.am 2020-08-25 17:23:42.000000000 +0200
+++ new/xserver-1.20.10/glx/Makefile.am 2020-12-01 17:25:37.000000000 +0100
@@ -81,7 +81,7 @@
unpack.h \
xfont.c
-libglx_la_LIBADD = $(DLOPEN_LIBS)
+libglx_la_LIBADD = $(DLOPEN_LIBS) $(top_builddir)/Xext/libhashtable.la
libglxvnd_la_SOURCES = \
vndcmds.c \
@@ -90,4 +90,6 @@
vndservervendor.h \
vndservervendor.c
+libglxvnd_la_LIBADD = $(top_builddir)/Xext/libhashtable.la
+
EXTRA_DIST = vnd_dispatch_stubs.c
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/xserver-1.20.9/hw/xfree86/drivers/modesetting/driver.c
new/xserver-1.20.10/hw/xfree86/drivers/modesetting/driver.c
--- old/xserver-1.20.9/hw/xfree86/drivers/modesetting/driver.c 2020-08-25
17:23:42.000000000 +0200
+++ new/xserver-1.20.10/hw/xfree86/drivers/modesetting/driver.c 2020-12-01
17:25:37.000000000 +0100
@@ -705,7 +705,7 @@
msBlockHandler(pScreen, pTimeout);
- drmmode_set_desired_modes(pScrn, &ms->drmmode, TRUE);
+ drmmode_set_desired_modes(pScrn, &ms->drmmode, TRUE, FALSE);
}
static void
@@ -1348,7 +1348,7 @@
ret = pScreen->CreateScreenResources(pScreen);
pScreen->CreateScreenResources = CreateScreenResources;
- if (!drmmode_set_desired_modes(pScrn, &ms->drmmode, pScrn->is_gpu))
+ if (!drmmode_set_desired_modes(pScrn, &ms->drmmode, pScrn->is_gpu, FALSE))
return FALSE;
if (!drmmode_glamor_handle_new_screen_pixmap(&ms->drmmode))
@@ -1820,8 +1820,25 @@
SetMaster(pScrn);
- if (!drmmode_set_desired_modes(pScrn, &ms->drmmode, TRUE))
- return FALSE;
+ drmmode_update_kms_state(&ms->drmmode);
+
+ /* allow not all modes to be set successfully since some events might have
+ * happened while not being master that could prevent the previous
+ * configuration from being re-applied.
+ */
+ if (!drmmode_set_desired_modes(pScrn, &ms->drmmode, TRUE, TRUE)) {
+ xf86DisableUnusedFunctions(pScrn);
+
+ /* TODO: check that at least one screen is on, to allow the user to fix
+ * their setup if all modeset failed...
+ */
+
+ /* Tell the desktop environment that something changed, so that they
+ * can hopefully correct the situation
+ */
+ RRSetChanged(xf86ScrnToScreen(pScrn));
+ RRTellChanged(xf86ScrnToScreen(pScrn));
+ }
return TRUE;
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/xserver-1.20.9/hw/xfree86/drivers/modesetting/drmmode_display.c
new/xserver-1.20.10/hw/xfree86/drivers/modesetting/drmmode_display.c
--- old/xserver-1.20.9/hw/xfree86/drivers/modesetting/drmmode_display.c
2020-08-25 17:23:42.000000000 +0200
+++ new/xserver-1.20.10/hw/xfree86/drivers/modesetting/drmmode_display.c
2020-12-01 17:25:37.000000000 +0100
@@ -3457,9 +3457,11 @@
}
Bool
-drmmode_set_desired_modes(ScrnInfoPtr pScrn, drmmode_ptr drmmode, Bool set_hw)
+drmmode_set_desired_modes(ScrnInfoPtr pScrn, drmmode_ptr drmmode, Bool set_hw,
+ Bool ign_err)
{
xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn);
+ Bool success = TRUE;
int c;
for (c = 0; c < config->num_crtc; c++) {
@@ -3507,8 +3509,17 @@
if (set_hw) {
if (!crtc->funcs->
set_mode_major(crtc, &crtc->desiredMode, crtc->desiredRotation,
- crtc->desiredX, crtc->desiredY))
- return FALSE;
+ crtc->desiredX, crtc->desiredY)) {
+ if (!ign_err)
+ return FALSE;
+ else {
+ success = FALSE;
+ crtc->enabled = FALSE;
+ xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
+ "Failed to set the desired mode on connector
%s\n",
+ output->name);
+ }
+ }
} else {
crtc->mode = crtc->desiredMode;
crtc->rotation = crtc->desiredRotation;
@@ -3522,7 +3533,7 @@
/* Validate leases on VT re-entry */
drmmode_validate_leases(pScrn);
- return TRUE;
+ return success;
}
static void
@@ -3607,30 +3618,19 @@
return TRUE;
}
-#ifdef CONFIG_UDEV_KMS
-
#define DRM_MODE_LINK_STATUS_GOOD 0
#define DRM_MODE_LINK_STATUS_BAD 1
-static void
-drmmode_handle_uevents(int fd, void *closure)
+void
+drmmode_update_kms_state(drmmode_ptr drmmode)
{
- drmmode_ptr drmmode = closure;
ScrnInfoPtr scrn = drmmode->scrn;
- struct udev_device *dev;
drmModeResPtr mode_res;
xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(scrn);
int i, j;
Bool found = FALSE;
Bool changed = FALSE;
- while ((dev = udev_monitor_receive_device(drmmode->uevent_monitor))) {
- udev_device_unref(dev);
- found = TRUE;
- }
- if (!found)
- return;
-
/* Try to re-set the mode on all the connectors with a BAD link-state:
* This may happen if a link degrades and a new modeset is necessary, using
* different link-training parameters. If the kernel found that the current
@@ -3745,6 +3745,25 @@
#undef DRM_MODE_LINK_STATUS_BAD
#undef DRM_MODE_LINK_STATUS_GOOD
+#ifdef CONFIG_UDEV_KMS
+
+static void
+drmmode_handle_uevents(int fd, void *closure)
+{
+ drmmode_ptr drmmode = closure;
+ struct udev_device *dev;
+ Bool found = FALSE;
+
+ while ((dev = udev_monitor_receive_device(drmmode->uevent_monitor))) {
+ udev_device_unref(dev);
+ found = TRUE;
+ }
+ if (!found)
+ return;
+
+ drmmode_update_kms_state(drmmode);
+}
+
#endif
void
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/xserver-1.20.9/hw/xfree86/drivers/modesetting/drmmode_display.h
new/xserver-1.20.10/hw/xfree86/drivers/modesetting/drmmode_display.h
--- old/xserver-1.20.9/hw/xfree86/drivers/modesetting/drmmode_display.h
2020-08-25 17:23:42.000000000 +0200
+++ new/xserver-1.20.10/hw/xfree86/drivers/modesetting/drmmode_display.h
2020-12-01 17:25:37.000000000 +0100
@@ -278,9 +278,11 @@
extern Bool drmmode_pre_init(ScrnInfoPtr pScrn, drmmode_ptr drmmode, int cpp);
extern Bool drmmode_init(ScrnInfoPtr pScrn, drmmode_ptr drmmode);
void drmmode_adjust_frame(ScrnInfoPtr pScrn, drmmode_ptr drmmode, int x, int
y);
-extern Bool drmmode_set_desired_modes(ScrnInfoPtr pScrn, drmmode_ptr drmmode,
Bool set_hw);
+extern Bool drmmode_set_desired_modes(ScrnInfoPtr pScrn, drmmode_ptr drmmode,
+ Bool set_hw, Bool ign_err);
extern Bool drmmode_setup_colormap(ScreenPtr pScreen, ScrnInfoPtr pScrn);
+extern void drmmode_update_kms_state(drmmode_ptr drmmode);
extern void drmmode_uevent_init(ScrnInfoPtr scrn, drmmode_ptr drmmode);
extern void drmmode_uevent_fini(ScrnInfoPtr scrn, drmmode_ptr drmmode);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/xserver-1.20.9/hw/xfree86/os-support/linux/lnx_platform.c
new/xserver-1.20.10/hw/xfree86/os-support/linux/lnx_platform.c
--- old/xserver-1.20.9/hw/xfree86/os-support/linux/lnx_platform.c
2020-08-25 17:23:42.000000000 +0200
+++ new/xserver-1.20.10/hw/xfree86/os-support/linux/lnx_platform.c
2020-12-01 17:25:37.000000000 +0100
@@ -23,13 +23,13 @@
static Bool
get_drm_info(struct OdevAttributes *attribs, char *path, int delayed_index)
{
+ drmSetVersion sv;
drmVersionPtr v;
+ char *buf;
int fd;
int err = 0;
Bool paused, server_fd = FALSE;
- LogMessage(X_INFO, "Platform probe for %s\n", attribs->syspath);
-
fd = systemd_logind_take_fd(attribs->major, attribs->minor, path, &paused);
if (fd != -1) {
if (paused) {
@@ -48,6 +48,18 @@
if (fd == -1)
return FALSE;
+ sv.drm_di_major = 1;
+ sv.drm_di_minor = 4;
+ sv.drm_dd_major = -1; /* Don't care */
+ sv.drm_dd_minor = -1; /* Don't care */
+
+ err = drmSetInterfaceVersion(fd, &sv);
+ if (err) {
+ xf86Msg(X_ERROR, "%s: failed to set DRM interface version 1.4: %s\n",
+ path, strerror(-err));
+ goto out;
+ }
+
/* for a delayed probe we've already added the device */
if (delayed_index == -1) {
xf86_add_platform_device(attribs, FALSE);
@@ -57,6 +69,10 @@
if (server_fd)
xf86_platform_devices[delayed_index].flags |= XF86_PDEV_SERVER_FD;
+ buf = drmGetBusid(fd);
+ xf86_platform_odev_attributes(delayed_index)->busid = XNFstrdup(buf);
+ drmFreeBusid(buf);
+
v = drmGetVersion(fd);
if (!v) {
xf86Msg(X_ERROR, "%s: failed to query DRM version\n", path);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/xserver-1.20.9/hw/xfree86/ramdac/xf86CursorRD.c
new/xserver-1.20.10/hw/xfree86/ramdac/xf86CursorRD.c
--- old/xserver-1.20.9/hw/xfree86/ramdac/xf86CursorRD.c 2020-08-25
17:23:42.000000000 +0200
+++ new/xserver-1.20.10/hw/xfree86/ramdac/xf86CursorRD.c 2020-12-01
17:25:37.000000000 +0100
@@ -334,6 +334,9 @@
ScreenPriv->HotY = cursor->bits->yhot;
if (!infoPtr->pScrn->vtSema) {
+ cursor = RefCursor(cursor);
+ if (ScreenPriv->SavedCursor)
+ FreeCursor(ScreenPriv->SavedCursor, None);
ScreenPriv->SavedCursor = cursor;
return;
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/xserver-1.20.9/hw/xwayland/xwayland-glamor-eglstream.c
new/xserver-1.20.10/hw/xwayland/xwayland-glamor-eglstream.c
--- old/xserver-1.20.9/hw/xwayland/xwayland-glamor-eglstream.c 2020-08-25
17:23:42.000000000 +0200
+++ new/xserver-1.20.10/hw/xwayland/xwayland-glamor-eglstream.c 2020-12-01
17:25:37.000000000 +0100
@@ -431,8 +431,8 @@
DebugF("eglstream: win %d completes eglstream for pixmap %p, congrats!\n",
pending->window->drawable.id, pending->pixmap);
- xwl_eglstream_window_set_pending(pending->window, NULL);
out:
+ xwl_eglstream_window_set_pending(pending->window, NULL);
xorg_list_del(&pending->link);
free(pending);
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/xserver-1.20.9/hw/xwayland/xwayland-glamor-gbm.c
new/xserver-1.20.10/hw/xwayland/xwayland-glamor-gbm.c
--- old/xserver-1.20.9/hw/xwayland/xwayland-glamor-gbm.c 2020-08-25
17:23:42.000000000 +0200
+++ new/xserver-1.20.10/hw/xwayland/xwayland-glamor-gbm.c 2020-12-01
17:25:37.000000000 +0100
@@ -111,21 +111,6 @@
}
static char
-is_fd_render_node(int fd)
-{
- struct stat render;
-
- if (fstat(fd, &render))
- return 0;
- if (!S_ISCHR(render.st_mode))
- return 0;
- if (render.st_rdev & 0x80)
- return 1;
-
- return 0;
-}
-
-static char
is_device_path_render_node (const char *device_path)
{
char is_render_node;
@@ -135,7 +120,7 @@
if (fd < 0)
return 0;
- is_render_node = is_fd_render_node(fd);
+ is_render_node = (drmGetNodeTypeFromFd(fd) == DRM_NODE_RENDER);
close(fd);
return is_render_node;
@@ -767,7 +752,7 @@
return;
}
- if (is_fd_render_node(xwl_gbm->drm_fd)) {
+ if (drmGetNodeTypeFromFd(xwl_gbm->drm_fd) == DRM_NODE_RENDER) {
xwl_gbm->fd_render_node = 1;
xwl_screen->expecting_event--;
} else {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/xserver-1.20.9/hw/xwayland/xwayland-present.c
new/xserver-1.20.10/hw/xwayland/xwayland-present.c
--- old/xserver-1.20.9/hw/xwayland/xwayland-present.c 2020-08-25
17:23:42.000000000 +0200
+++ new/xserver-1.20.10/hw/xwayland/xwayland-present.c 2020-12-01
17:25:37.000000000 +0100
@@ -421,10 +421,18 @@
PresentFlipReason *reason)
{
struct xwl_window *xwl_window = xwl_window_from_window(present_window);
+ ScreenPtr screen = pixmap->drawable.pScreen;
if (!xwl_window)
return FALSE;
+ /* Can't flip if the window pixmap doesn't match the xwl_window parent
+ * window's, e.g. because a client redirected this window or one of its
+ * parents.
+ */
+ if (screen->GetWindowPixmap(xwl_window->window) !=
screen->GetWindowPixmap(present_window))
+ return FALSE;
+
/*
* We currently only allow flips of windows, that have the same
* dimensions as their xwl_window parent window. For the case of
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/xserver-1.20.9/hw/xwayland/xwayland.c
new/xserver-1.20.10/hw/xwayland/xwayland.c
--- old/xserver-1.20.9/hw/xwayland/xwayland.c 2020-08-25 17:23:42.000000000
+0200
+++ new/xserver-1.20.10/hw/xwayland/xwayland.c 2020-12-01 17:25:37.000000000
+0100
@@ -193,8 +193,6 @@
xwl_window_property_allow_commits(struct xwl_window *xwl_window,
PropertyStateRec *propstate)
{
- Bool old_allow_commits = xwl_window->allow_commits;
-
switch (propstate->state) {
case PropertyNewValue:
xwl_window_set_allow_commits_from_property(xwl_window,
propstate->prop);
@@ -207,17 +205,6 @@
default:
break;
}
-
- /* If allow_commits turned from off to on, discard any frame
- * callback we might be waiting for so that a new buffer is posted
- * immediately through block_handler() if there is damage to post.
- */
- if (!old_allow_commits && xwl_window->allow_commits) {
- if (xwl_window->frame_callback) {
- wl_callback_destroy(xwl_window->frame_callback);
- xwl_window->frame_callback = NULL;
- }
- }
}
static void
@@ -540,7 +527,7 @@
struct xwl_window *xwl_window;
struct wl_region *region;
- if (xwl_window_get(window))
+ if (xwl_window_from_window(window))
return TRUE;
xwl_screen = xwl_screen_get(screen);
@@ -1215,6 +1202,11 @@
®istry_listener, xwl_screen);
xwl_screen_roundtrip(xwl_screen);
+ if (!xwl_screen->rootless && !xwl_screen->shell) {
+ ErrorF("missing wl_shell protocol\n");
+ return FALSE;
+ }
+
bpc = xwl_screen->depth / 3;
green_bpc = xwl_screen->depth - 2 * bpc;
blue_mask = (1 << bpc) - 1;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/xserver-1.20.9/include/misc.h
new/xserver-1.20.10/include/misc.h
--- old/xserver-1.20.9/include/misc.h 2020-08-25 17:23:42.000000000 +0200
+++ new/xserver-1.20.10/include/misc.h 2020-12-01 17:25:37.000000000 +0100
@@ -91,7 +91,7 @@
#define LIMITCLIENTS 256 /* Must be a power of 2 and <= MAXCLIENTS */
#define MAXEXTENSIONS 128
#define MAXFORMATS 8
-#define MAXDEVICES 40 /* input devices */
+#define MAXDEVICES 256 /* input devices */
#define GPU_SCREEN_OFFSET 256
/* 128 event opcodes for core + extension events, excluding GE */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/xserver-1.20.9/meson.build
new/xserver-1.20.10/meson.build
--- old/xserver-1.20.9/meson.build 2020-08-25 17:23:42.000000000 +0200
+++ new/xserver-1.20.10/meson.build 2020-12-01 17:25:37.000000000 +0100
@@ -3,7 +3,7 @@
'buildtype=debugoptimized',
'c_std=gnu99',
],
- version: '1.20.9',
+ version: '1.20.10',
meson_version: '>= 0.42.0',
)
add_project_arguments('-DHAVE_DIX_CONFIG_H', language: 'c')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/xserver-1.20.9/os/backtrace.c
new/xserver-1.20.10/os/backtrace.c
--- old/xserver-1.20.9/os/backtrace.c 2020-08-25 17:23:42.000000000 +0200
+++ new/xserver-1.20.10/os/backtrace.c 2020-12-01 17:25:37.000000000 +0100
@@ -45,6 +45,7 @@
{
unw_cursor_t cursor;
unw_context_t context;
+ unw_word_t ip;
unw_word_t off;
unw_proc_info_t pip;
int ret, i = 0;
@@ -88,7 +89,9 @@
procname[1] = 0;
}
- if (dladdr((void *)(uintptr_t)(pip.start_ip + off), &dlinfo) &&
dlinfo.dli_fname &&
+ if (unw_get_reg (&cursor, UNW_REG_IP, &ip) < 0)
+ ip = pip.start_ip + off;
+ if (dladdr((void *)(uintptr_t)(ip), &dlinfo) && dlinfo.dli_fname &&
*dlinfo.dli_fname)
filename = dlinfo.dli_fname;
else
@@ -96,7 +99,7 @@
ErrorFSigSafe("%u: %s (%s%s+0x%x) [%p]\n", i++, filename, procname,
ret == -UNW_ENOMEM ? "..." : "", (int)off,
- (void *)(uintptr_t)(pip.start_ip + off));
+ (void *)(uintptr_t)(ip));
ret = unw_step(&cursor);
if (ret < 0)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/xserver-1.20.9/present/present_execute.c
new/xserver-1.20.10/present/present_execute.c
--- old/xserver-1.20.9/present/present_execute.c 2020-08-25
17:23:42.000000000 +0200
+++ new/xserver-1.20.10/present/present_execute.c 2020-12-01
17:25:37.000000000 +0100
@@ -48,16 +48,13 @@
ScreenPtr screen = window->drawable.pScreen;
present_screen_priv_ptr screen_priv = present_screen_priv(screen);
- if (vblank->requeue) {
- vblank->requeue = FALSE;
- if (msc_is_after(vblank->target_msc, crtc_msc) &&
- Success == screen_priv->queue_vblank(screen,
- window,
- vblank->crtc,
- vblank->event_id,
- vblank->target_msc))
- return TRUE;
- }
+ /* We may have to requeue for the next MSC if check_flip_window prevented
+ * using a flip.
+ */
+ if (vblank->exec_msc == crtc_msc + 1 &&
+ screen_priv->queue_vblank(screen, window, vblank->crtc,
vblank->event_id,
+ vblank->exec_msc) == Success)
+ return TRUE;
if (vblank->wait_fence) {
if (!present_fence_check_triggered(vblank->wait_fence)) {
@@ -75,13 +72,13 @@
ScreenPtr screen = window->drawable.pScreen;
present_screen_priv_ptr screen_priv = present_screen_priv(screen);
- /* If present_flip failed, we may have to requeue for the target MSC */
- if (vblank->target_msc == crtc_msc + 1 &&
+ /* If present_flip failed, we may have to requeue for the next MSC */
+ if (vblank->exec_msc == crtc_msc + 1 &&
Success == screen_priv->queue_vblank(screen,
window,
vblank->crtc,
vblank->event_id,
- vblank->target_msc)) {
+ vblank->exec_msc)) {
vblank->queued = TRUE;
return;
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/xserver-1.20.9/present/present_priv.h
new/xserver-1.20.10/present/present_priv.h
--- old/xserver-1.20.9/present/present_priv.h 2020-08-25 17:23:42.000000000
+0200
+++ new/xserver-1.20.10/present/present_priv.h 2020-12-01 17:25:37.000000000
+0100
@@ -70,14 +70,14 @@
int16_t y_off;
CARD16 kind;
uint64_t event_id;
- uint64_t target_msc;
+ uint64_t target_msc; /* target MSC when present should
complete */
+ uint64_t exec_msc; /* MSC at which present can be
executed */
uint64_t msc_offset;
present_fence_ptr idle_fence;
present_fence_ptr wait_fence;
present_notify_ptr notifies;
int num_notifies;
Bool queued; /* on present_exec_queue */
- Bool requeue; /* on queue, but target_msc has
changed */
Bool flip; /* planning on using flip */
Bool flip_ready; /* wants to flip, but waiting for
previous flip or unflip */
Bool flip_idler; /* driver explicitly permitted idling
*/
@@ -469,7 +469,7 @@
const uint32_t *capabilities,
present_notify_ptr notifies,
int num_notifies,
- uint64_t *target_msc,
+ uint64_t target_msc,
uint64_t crtc_msc);
void
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/xserver-1.20.9/present/present_scmd.c
new/xserver-1.20.10/present/present_scmd.c
--- old/xserver-1.20.9/present/present_scmd.c 2020-08-25 17:23:42.000000000
+0200
+++ new/xserver-1.20.10/present/present_scmd.c 2020-12-01 17:25:37.000000000
+0100
@@ -361,8 +361,8 @@
ScreenPtr screen = vblank->screen;
present_screen_priv_ptr screen_priv = present_screen_priv(screen);
- DebugPresent(("\tn %" PRIu64 " %p %" PRIu64 ": %08" PRIx32 " -> %08"
PRIx32 "\n",
- vblank->event_id, vblank, vblank->target_msc,
+ DebugPresent(("\tn %" PRIu64 " %p %" PRIu64 " %" PRIu64 ": %08" PRIx32 "
-> %08" PRIx32 "\n",
+ vblank->event_id, vblank, vblank->exec_msc,
vblank->target_msc,
vblank->pixmap ? vblank->pixmap->drawable.id : 0,
vblank->window ? vblank->window->drawable.id : 0));
@@ -482,7 +482,7 @@
vblank->flip = FALSE;
vblank->reason = reason;
if (vblank->sync_flip)
- vblank->requeue = TRUE;
+ vblank->exec_msc = vblank->target_msc;
}
}
}
@@ -608,6 +608,7 @@
*/
screen_priv->flip_pending = NULL;
vblank->flip = FALSE;
+ vblank->exec_msc = vblank->target_msc;
}
DebugPresent(("\tc %p %" PRIu64 ": %08" PRIx32 " -> %08" PRIx32 "\n",
vblank, crtc_msc, vblank->pixmap->drawable.id,
vblank->window->drawable.id));
@@ -745,16 +746,19 @@
screen_priv->info ?
&screen_priv->info->capabilities : NULL,
notifies,
num_notifies,
- &target_msc,
+ target_msc,
crtc_msc);
if (!vblank)
return BadAlloc;
+ if (vblank->flip && vblank->sync_flip)
+ vblank->exec_msc--;
+
xorg_list_append(&vblank->event_queue, &present_exec_queue);
vblank->queued = TRUE;
- if (msc_is_after(target_msc, crtc_msc)) {
- ret = present_queue_vblank(screen, window, target_crtc,
vblank->event_id, target_msc);
+ if (msc_is_after(vblank->exec_msc, crtc_msc)) {
+ ret = present_queue_vblank(screen, window, target_crtc,
vblank->event_id, vblank->exec_msc);
if (ret == Success)
return Success;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/xserver-1.20.9/present/present_vblank.c
new/xserver-1.20.10/present/present_vblank.c
--- old/xserver-1.20.9/present/present_vblank.c 2020-08-25 17:23:42.000000000
+0200
+++ new/xserver-1.20.10/present/present_vblank.c 2020-12-01
17:25:37.000000000 +0100
@@ -57,7 +57,7 @@
const uint32_t *capabilities,
present_notify_ptr notifies,
int num_notifies,
- uint64_t *target_msc,
+ uint64_t target_msc,
uint64_t crtc_msc)
{
ScreenPtr screen = window->drawable.pScreen;
@@ -100,7 +100,8 @@
vblank->x_off = x_off;
vblank->y_off = y_off;
- vblank->target_msc = *target_msc;
+ vblank->target_msc = target_msc;
+ vblank->exec_msc = target_msc;
vblank->crtc = target_crtc;
vblank->msc_offset = window_priv->msc_offset;
vblank->notifies = notifies;
@@ -111,12 +112,11 @@
if (pixmap != NULL &&
!(options & PresentOptionCopy) &&
capabilities) {
- if (msc_is_after(*target_msc, crtc_msc) &&
+ if (msc_is_after(target_msc, crtc_msc) &&
screen_priv->check_flip (target_crtc, window, pixmap, TRUE, valid,
x_off, y_off, &reason))
{
vblank->flip = TRUE;
vblank->sync_flip = TRUE;
- *target_msc = *target_msc - 1;
} else if ((*capabilities & PresentCapabilityAsync) &&
screen_priv->check_flip (target_crtc, window, pixmap, FALSE,
valid, x_off, y_off, &reason))
{
@@ -139,7 +139,7 @@
if (pixmap)
DebugPresent(("q %" PRIu64 " %p %" PRIu64 ": %08" PRIx32 " -> %08"
PRIx32 " (crtc %p) flip %d vsync %d serial %d\n",
- vblank->event_id, vblank, *target_msc,
+ vblank->event_id, vblank, target_msc,
vblank->pixmap->drawable.id, vblank->window->drawable.id,
target_crtc, vblank->flip, vblank->sync_flip,
vblank->serial));
return vblank;
@@ -153,8 +153,8 @@
void
present_vblank_scrap(present_vblank_ptr vblank)
{
- DebugPresent(("\tx %" PRIu64 " %p %" PRIu64 ": %08" PRIx32 " -> %08"
PRIx32 " (crtc %p)\n",
- vblank->event_id, vblank, vblank->target_msc,
+ DebugPresent(("\tx %" PRIu64 " %p %" PRIu64 " %" PRIu64 ": %08" PRIx32 "
-> %08" PRIx32 " (crtc %p)\n",
+ vblank->event_id, vblank, vblank->exec_msc,
vblank->target_msc,
vblank->pixmap->drawable.id, vblank->window->drawable.id,
vblank->crtc));
@@ -175,8 +175,8 @@
/* Also make sure vblank is removed from event queue (wnmd) */
xorg_list_del(&vblank->event_queue);
- DebugPresent(("\td %" PRIu64 " %p %" PRIu64 ": %08" PRIx32 " -> %08"
PRIx32 "\n",
- vblank->event_id, vblank, vblank->target_msc,
+ DebugPresent(("\td %" PRIu64 " %p %" PRIu64 " %" PRIu64 ": %08" PRIx32 "
-> %08" PRIx32 "\n",
+ vblank->event_id, vblank, vblank->exec_msc,
vblank->target_msc,
vblank->pixmap ? vblank->pixmap->drawable.id : 0,
vblank->window ? vblank->window->drawable.id : 0));
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/xserver-1.20.9/present/present_wnmd.c
new/xserver-1.20.10/present/present_wnmd.c
--- old/xserver-1.20.9/present/present_wnmd.c 2020-08-25 17:23:42.000000000
+0200
+++ new/xserver-1.20.10/present/present_wnmd.c 2020-12-01 17:25:37.000000000
+0100
@@ -42,6 +42,17 @@
static void
present_wnmd_execute(present_vblank_ptr vblank, uint64_t ust, uint64_t
crtc_msc);
+static int
+present_wnmd_queue_vblank(ScreenPtr screen,
+ WindowPtr window,
+ RRCrtcPtr crtc,
+ uint64_t event_id,
+ uint64_t msc)
+{
+ present_screen_priv_ptr screen_priv = present_screen_priv(screen);
+ return (*screen_priv->wnmd_info->queue_vblank) (window, crtc, event_id,
msc);
+}
+
static void
present_wnmd_create_event_id(present_window_priv_ptr window_priv,
present_vblank_ptr vblank)
{
@@ -111,7 +122,8 @@
present_vblank_ptr vblank, tmp;
xorg_list_for_each_entry_safe(vblank, tmp, &window_priv->idle_queue,
event_queue) {
- present_wnmd_free_idle_vblank(vblank);
+ if (vblank->flip)
+ present_wnmd_free_idle_vblank(vblank);
}
if (window_priv->flip_active) {
@@ -168,8 +180,8 @@
WindowPtr window = vblank->window;
present_window_priv_ptr window_priv = present_window_priv(window);
- DebugPresent(("\tn %" PRIu64 " %p %" PRIu64 ": %08" PRIx32 " -> %08"
PRIx32 "\n",
- vblank->event_id, vblank, vblank->target_msc,
+ DebugPresent(("\tn %" PRIu64 " %p %" PRIu64 " %" PRIu64 ": %08" PRIx32 "
-> %08" PRIx32 "\n",
+ vblank->event_id, vblank, vblank->exec_msc,
vblank->target_msc,
vblank->pixmap ? vblank->pixmap->drawable.id : 0,
vblank->window ? vblank->window->drawable.id : 0));
@@ -234,7 +246,12 @@
xorg_list_for_each_entry(vblank, &window_priv->idle_queue, event_queue) {
if (vblank->event_id == event_id) {
- present_wnmd_free_idle_vblank(vblank);
+ if (vblank->flip)
+ present_wnmd_free_idle_vblank(vblank);
+ else
+ /* Copies which were executed but need their completion event
sent */
+ present_execute_post(vblank, ust, msc);
+
return;
}
}
@@ -270,10 +287,6 @@
if (!screen_priv->wnmd_info->flip)
return FALSE;
- /* Can't flip redirected child windows */
- if (screen->GetWindowPixmap(window) !=
screen->GetWindowPixmap(toplvl_window))
- return FALSE;
-
/* Source pixmap must align with window exactly */
if (x_off || y_off)
return FALSE;
@@ -291,6 +304,10 @@
if ( !RegionEqual(&window->winSize, &toplvl_window->winSize) )
return FALSE;
+ /* Can't flip if window clipped by children */
+ if (!RegionEqual(&window->clipList, &window->winSize))
+ return FALSE;
+
/* Ask the driver for permission */
if (screen_priv->wnmd_info->check_flip2) {
if (!(*screen_priv->wnmd_info->check_flip2) (crtc, window, pixmap,
sync_flip, reason)) {
@@ -342,8 +359,6 @@
vblank->sync_flip, vblank->valid, 0,
0, &reason)) {
vblank->flip = FALSE;
vblank->reason = reason;
- if (vblank->sync_flip)
- vblank->requeue = TRUE;
}
}
}
@@ -443,6 +458,7 @@
vblank->queued = FALSE;
if (vblank->pixmap && vblank->window) {
+ ScreenPtr screen = window->drawable.pScreen;
if (vblank->flip) {
RegionPtr damage;
@@ -457,10 +473,13 @@
/* Set update region as damaged */
if (vblank->update) {
- damage = vblank->update;
+ damage = RegionDuplicate(vblank->update);
+ /* Translate update region to screen space */
+ assert(vblank->x_off == 0 && vblank->y_off == 0);
+ RegionTranslate(damage, window->drawable.x,
window->drawable.y);
RegionIntersect(damage, damage, &window->clipList);
} else
- damage = &window->clipList;
+ damage = RegionDuplicate(&window->clipList);
/* Try to flip - the vblank is now pending
*/
@@ -468,7 +487,6 @@
// ask the driver
if (present_wnmd_flip(vblank->window, vblank->crtc,
vblank->event_id,
vblank->target_msc, vblank->pixmap,
vblank->sync_flip, damage)) {
- ScreenPtr screen = window->drawable.pScreen;
WindowPtr toplvl_window =
present_wnmd_toplvl_pixmap_window(vblank->window);
PixmapPtr old_pixmap = screen->GetWindowPixmap(window);
@@ -483,6 +501,7 @@
/* Report damage */
DamageDamageRegion(&vblank->window->drawable, damage);
+ RegionDestroy(damage);
return;
}
@@ -498,9 +517,12 @@
present_wnmd_cancel_flip(window);
present_execute_copy(vblank, crtc_msc);
+ assert(!vblank->queued);
- if (vblank->queued) {
- xorg_list_add(&vblank->event_queue, &window_priv->exec_queue);
+ if (present_wnmd_queue_vblank(screen, window, vblank->crtc,
+ vblank->event_id, crtc_msc + 1)
+ == Success) {
+ xorg_list_add(&vblank->event_queue, &window_priv->idle_queue);
xorg_list_append(&vblank->window_list, &window_priv->vblank);
return;
@@ -510,17 +532,6 @@
present_execute_post(vblank, ust, crtc_msc);
}
-static int
-present_wnmd_queue_vblank(ScreenPtr screen,
- WindowPtr window,
- RRCrtcPtr crtc,
- uint64_t event_id,
- uint64_t msc)
-{
- present_screen_priv_ptr screen_priv = present_screen_priv(screen);
- return (*screen_priv->wnmd_info->queue_vblank) (window, crtc, event_id,
msc);
-}
-
static uint64_t
present_wnmd_window_to_crtc_msc(WindowPtr window, RRCrtcPtr crtc, uint64_t
window_msc, uint64_t new_msc)
{
@@ -626,15 +637,20 @@
&screen_priv->wnmd_info->capabilities,
notifies,
num_notifies,
- &target_msc,
+ target_msc,
crtc_msc);
if (!vblank)
return BadAlloc;
+ /* WNMD presentations always complete (at least) one frame after they
+ * are executed
+ */
+ vblank->exec_msc = vblank->target_msc - 1;
+
xorg_list_append(&vblank->event_queue, &window_priv->exec_queue);
vblank->queued = TRUE;
- if (crtc_msc < target_msc) {
- if (present_wnmd_queue_vblank(screen, window, target_crtc,
vblank->event_id, target_msc) == Success) {
+ if (crtc_msc < vblank->exec_msc) {
+ if (present_wnmd_queue_vblank(screen, window, target_crtc,
vblank->event_id, vblank->exec_msc) == Success) {
return Success;
}
DebugPresent(("present_queue_vblank failed\n"));
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/xserver-1.20.9/xkb/xkb.c
new/xserver-1.20.10/xkb/xkb.c
--- old/xserver-1.20.9/xkb/xkb.c 2020-08-25 17:23:42.000000000 +0200
+++ new/xserver-1.20.10/xkb/xkb.c 2020-12-01 17:25:37.000000000 +0100
@@ -2382,6 +2382,93 @@
return (char *) wire;
}
+#define _add_check_len(new) \
+ if (len > UINT32_MAX - (new) || len > req_len - (new)) goto bad; \
+ else len += new
+
+/**
+ * Check the length of the SetMap request
+ */
+static int
+_XkbSetMapCheckLength(xkbSetMapReq *req)
+{
+ size_t len = sz_xkbSetMapReq, req_len = req->length << 2;
+ xkbKeyTypeWireDesc *keytype;
+ xkbSymMapWireDesc *symmap;
+ BOOL preserve;
+ int i, map_count, nSyms;
+
+ if (req_len < len)
+ goto bad;
+ /* types */
+ if (req->present & XkbKeyTypesMask) {
+ keytype = (xkbKeyTypeWireDesc *)(req + 1);
+ for (i = 0; i < req->nTypes; i++) {
+ _add_check_len(XkbPaddedSize(sz_xkbKeyTypeWireDesc));
+ if (req->flags & XkbSetMapResizeTypes) {
+ _add_check_len(keytype->nMapEntries
+ * sz_xkbKTSetMapEntryWireDesc);
+ preserve = keytype->preserve;
+ map_count = keytype->nMapEntries;
+ if (preserve) {
+ _add_check_len(map_count * sz_xkbModsWireDesc);
+ }
+ keytype += 1;
+ keytype = (xkbKeyTypeWireDesc *)
+ ((xkbKTSetMapEntryWireDesc *)keytype + map_count);
+ if (preserve)
+ keytype = (xkbKeyTypeWireDesc *)
+ ((xkbModsWireDesc *)keytype + map_count);
+ }
+ }
+ }
+ /* syms */
+ if (req->present & XkbKeySymsMask) {
+ symmap = (xkbSymMapWireDesc *)((char *)req + len);
+ for (i = 0; i < req->nKeySyms; i++) {
+ _add_check_len(sz_xkbSymMapWireDesc);
+ nSyms = symmap->nSyms;
+ _add_check_len(nSyms*sizeof(CARD32));
+ symmap += 1;
+ symmap = (xkbSymMapWireDesc *)((CARD32 *)symmap + nSyms);
+ }
+ }
+ /* actions */
+ if (req->present & XkbKeyActionsMask) {
+ _add_check_len(req->totalActs * sz_xkbActionWireDesc
+ + XkbPaddedSize(req->nKeyActs));
+ }
+ /* behaviours */
+ if (req->present & XkbKeyBehaviorsMask) {
+ _add_check_len(req->totalKeyBehaviors * sz_xkbBehaviorWireDesc);
+ }
+ /* vmods */
+ if (req->present & XkbVirtualModsMask) {
+ _add_check_len(XkbPaddedSize(Ones(req->virtualMods)));
+ }
+ /* explicit */
+ if (req->present & XkbExplicitComponentsMask) {
+ /* two bytes per non-zero explicit componen */
+ _add_check_len(XkbPaddedSize(req->totalKeyExplicit * sizeof(CARD16)));
+ }
+ /* modmap */
+ if (req->present & XkbModifierMapMask) {
+ /* two bytes per non-zero modmap component */
+ _add_check_len(XkbPaddedSize(req->totalModMapKeys * sizeof(CARD16)));
+ }
+ /* vmodmap */
+ if (req->present & XkbVirtualModMapMask) {
+ _add_check_len(req->totalVModMapKeys * sz_xkbVModMapWireDesc);
+ }
+ if (len == req_len)
+ return Success;
+bad:
+ ErrorF("[xkb] BOGUS LENGTH in SetMap: expected %ld got %ld\n",
+ len, req_len);
+ return BadLength;
+}
+
+
/**
* Check if the given request can be applied to the given device but don't
* actually do anything..
@@ -2639,6 +2726,11 @@
CHK_KBD_DEVICE(dev, stuff->deviceSpec, client, DixManageAccess);
CHK_MASK_LEGAL(0x01, stuff->present, XkbAllMapComponentsMask);
+ /* first verify the request length carefully */
+ rc = _XkbSetMapCheckLength(stuff);
+ if (rc != Success)
+ return rc;
+
tmp = (char *) &stuff[1];
/* Check if we can to the SetMap on the requested device. If this
@@ -6533,7 +6625,9 @@
unsigned changed,
int num,
int *status_rtrn,
- ClientPtr client, xkbExtensionDeviceNotify * ev)
+ ClientPtr client,
+ xkbExtensionDeviceNotify * ev,
+ xkbSetDeviceInfoReq * stuff)
{
xkbDeviceLedsWireDesc *ledWire;
int i;
@@ -6554,6 +6648,11 @@
xkbIndicatorMapWireDesc *mapWire;
XkbSrvLedInfoPtr sli;
+ if (!_XkbCheckRequestBounds(client, stuff, ledWire, ledWire + 1)) {
+ *status_rtrn = BadLength;
+ return (char *) ledWire;
+ }
+
namec = mapc = statec = 0;
sli = XkbFindSrvLedInfo(dev, ledWire->ledClass, ledWire->ledID,
XkbXI_IndicatorMapsMask);
@@ -6572,6 +6671,10 @@
memset((char *) sli->names, 0, XkbNumIndicators * sizeof(Atom));
for (n = 0, bit = 1; n < XkbNumIndicators; n++, bit <<= 1) {
if (ledWire->namesPresent & bit) {
+ if (!_XkbCheckRequestBounds(client, stuff, atomWire,
atomWire + 1)) {
+ *status_rtrn = BadLength;
+ return (char *) atomWire;
+ }
sli->names[n] = (Atom) *atomWire;
if (sli->names[n] == None)
ledWire->namesPresent &= ~bit;
@@ -6589,6 +6692,10 @@
if (ledWire->mapsPresent) {
for (n = 0, bit = 1; n < XkbNumIndicators; n++, bit <<= 1) {
if (ledWire->mapsPresent & bit) {
+ if (!_XkbCheckRequestBounds(client, stuff, mapWire,
mapWire + 1)) {
+ *status_rtrn = BadLength;
+ return (char *) mapWire;
+ }
sli->maps[n].flags = mapWire->flags;
sli->maps[n].which_groups = mapWire->whichGroups;
sli->maps[n].groups = mapWire->groups;
@@ -6668,7 +6775,7 @@
ed.deviceID = dev->id;
wire = (char *) &stuff[1];
if (stuff->change & XkbXI_ButtonActionsMask) {
- int nBtns, sz, i;
+ int nBtns, sz, i;
XkbAction *acts;
DeviceIntPtr kbd;
@@ -6680,7 +6787,11 @@
return BadAlloc;
dev->button->xkb_acts = acts;
}
+ if (stuff->firstBtn + stuff->nBtns > nBtns)
+ return BadValue;
sz = stuff->nBtns * SIZEOF(xkbActionWireDesc);
+ if (!_XkbCheckRequestBounds(client, stuff, wire, (char *) wire + sz))
+ return BadLength;
memcpy((char *) &acts[stuff->firstBtn], (char *) wire, sz);
wire += sz;
ed.reason |= XkbXI_ButtonActionsMask;
@@ -6701,7 +6812,8 @@
int status = Success;
wire = SetDeviceIndicators(wire, dev, stuff->change,
- stuff->nDeviceLedFBs, &status, client, &ed);
+ stuff->nDeviceLedFBs, &status, client, &ed,
+ stuff);
if (status != Success)
return status;
}
_______________________________________________
openSUSE Commits mailing list -- [email protected]
To unsubscribe, email [email protected]
List Netiquette: https://en.opensuse.org/openSUSE:Mailing_list_netiquette
List Archives:
https://lists.opensuse.org/archives/list/[email protected]