-44
@@ -1,44 +0,0 @@
|
||||
From cd1962b7f9c14bc67e22c07cb9a9cd3a4a119506 Mon Sep 17 00:00:00 2001
|
||||
From: Gaetan Nadon <memsize-XzQKRVe1yT0V+D8aMU/kSg@public.gmane.org>
|
||||
Date: Sat, 28 Nov 2009 21:32:47 -0500
|
||||
Subject: [PATCH] configure.ac: error while checking for XDMXCONFIG_DEP
|
||||
|
||||
Introduced in commit 9998105a387e0294054502331a56e1e020cd93e4
|
||||
The replacement third parameters to PKG_CHECK_MODULES([DMXMODULES]
|
||||
was not quoted.
|
||||
|
||||
Signed-off-by: Gaetan Nadon <memsize-XzQKRVe1yT0V+D8aMU/kSg@public.gmane.org>
|
||||
Reviewed-by: Dan Nicholson <dbn.lists-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
|
||||
Tested-by: Julien Cristau <jcristau at debian.org>
|
||||
---
|
||||
configure.ac | 14 +++++++++-----
|
||||
1 files changed, 9 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/configure.ac b/configure.ac
|
||||
index 8500db4..1038734 100644
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -1808,11 +1808,15 @@ AM_CONDITIONAL(XQUARTZ_SPARKLE, [test "x$XQUARTZ_SPARKLE" != "xno"])
|
||||
AM_CONDITIONAL(STANDALONE_XPBPROXY, [test "x$STANDALONE_XPBPROXY" = xyes])
|
||||
|
||||
dnl DMX DDX
|
||||
-PKG_CHECK_MODULES([DMXMODULES],
|
||||
- [xmuu $LIBXEXT x11 xrender xfixes xfont $LIBXI $DMXPROTO xau $XDMCP_MODULES],
|
||||
- PKG_CHECK_MODULES([XDMXCONFIG_DEP], [xaw7 xmu xt xpm x11], [have_dmx=yes],
|
||||
- [have_dmx=no]),
|
||||
- [have_dmx=no])
|
||||
+PKG_CHECK_MODULES(
|
||||
+ [DMXMODULES],
|
||||
+ [xmuu $LIBXEXT x11 xrender xfixes xfont $LIBXI $DMXPROTO xau $XDMCP_MODULES],
|
||||
+ [PKG_CHECK_MODULES(
|
||||
+ [XDMXCONFIG_DEP],
|
||||
+ [xaw7 xmu xt xpm x11],
|
||||
+ [have_dmx=yes],
|
||||
+ [have_dmx=no])],
|
||||
+ [have_dmx=no])
|
||||
AC_MSG_CHECKING([whether to build Xdmx DDX])
|
||||
if test "x$DMX" = xauto; then
|
||||
DMX="$have_dmx"
|
||||
--
|
||||
1.6.0.4
|
||||
|
||||
-210
@@ -1,210 +0,0 @@
|
||||
From e1a7f4bb5333b0271d29f785eb55f1c3273e626a Mon Sep 17 00:00:00 2001
|
||||
From: Peter Hutterer <peter.hutterer@who-t.net>
|
||||
Date: Tue, 5 May 2015 14:18:54 +1000
|
||||
Subject: [PATCH] dix: Add unaccelerated valuators to the ValuatorMask
|
||||
|
||||
Allows a mask to carry both accelerated and unaccelerated motion at the same
|
||||
time.
|
||||
|
||||
This is required for xf86-input-libinput where the pointer acceleration
|
||||
happens in libinput already, but parts of the server, specifically raw events
|
||||
and DGA rely on device-specific unaccelerated data.
|
||||
|
||||
To ease integration add this as a second set to the ValuatorMask rather than
|
||||
extending all APIs to carry a second, possibly NULL set of valuators.
|
||||
|
||||
Note that a valuator mask should only be used in either accel/unaccel or
|
||||
standard mode at any time. Switching requires either a valuator_mask_zero()
|
||||
call or unsetting all valuators one-by-one. Trying to mix the two will produce
|
||||
a warning.
|
||||
|
||||
The server has a shortcut for changing a mask with the
|
||||
valuator_mask_drop_unaccelerated() call. This saves us from having to loop
|
||||
through all valuators on every event, we can just drop the bits we know we
|
||||
don't want.
|
||||
|
||||
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
|
||||
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
|
||||
---
|
||||
dix/inpututils.c | 82 +++++++++++++++++++++++++++++++++++++++---
|
||||
hw/xfree86/common/xf86Module.h | 2 +-
|
||||
include/input.h | 15 ++++++++
|
||||
include/inpututils.h | 2 ++
|
||||
4 files changed, 95 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/dix/inpututils.c b/dix/inpututils.c
|
||||
index 5c2a32d..1363988 100644
|
||||
--- a/dix/inpututils.c
|
||||
+++ b/dix/inpututils.c
|
||||
@@ -505,11 +505,8 @@ valuator_mask_isset(const ValuatorMask *mask, int valuator)
|
||||
return mask->last_bit >= valuator && BitIsOn(mask->mask, valuator);
|
||||
}
|
||||
|
||||
-/**
|
||||
- * Set the valuator to the given floating-point data.
|
||||
- */
|
||||
-void
|
||||
-valuator_mask_set_double(ValuatorMask *mask, int valuator, double data)
|
||||
+static inline void
|
||||
+_valuator_mask_set_double(ValuatorMask *mask, int valuator, double data)
|
||||
{
|
||||
mask->last_bit = max(valuator, mask->last_bit);
|
||||
SetBit(mask->mask, valuator);
|
||||
@@ -517,6 +514,17 @@ valuator_mask_set_double(ValuatorMask *mask, int valuator, double data)
|
||||
}
|
||||
|
||||
/**
|
||||
+ * Set the valuator to the given floating-point data.
|
||||
+ */
|
||||
+void
|
||||
+valuator_mask_set_double(ValuatorMask *mask, int valuator, double data)
|
||||
+{
|
||||
+ BUG_WARN_MSG(mask->has_unaccelerated,
|
||||
+ "Do not mix valuator types, zero mask first\n");
|
||||
+ _valuator_mask_set_double(mask, valuator, data);
|
||||
+}
|
||||
+
|
||||
+/**
|
||||
* Set the valuator to the given integer data.
|
||||
*/
|
||||
void
|
||||
@@ -594,11 +602,15 @@ valuator_mask_unset(ValuatorMask *mask, int valuator)
|
||||
|
||||
ClearBit(mask->mask, valuator);
|
||||
mask->valuators[valuator] = 0.0;
|
||||
+ mask->unaccelerated[valuator] = 0.0;
|
||||
|
||||
for (i = 0; i <= mask->last_bit; i++)
|
||||
if (valuator_mask_isset(mask, i))
|
||||
lastbit = max(lastbit, i);
|
||||
mask->last_bit = lastbit;
|
||||
+
|
||||
+ if (mask->last_bit == -1)
|
||||
+ mask->has_unaccelerated = FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -611,6 +623,66 @@ valuator_mask_copy(ValuatorMask *dest, const ValuatorMask *src)
|
||||
valuator_mask_zero(dest);
|
||||
}
|
||||
|
||||
+Bool
|
||||
+valuator_mask_has_unaccelerated(const ValuatorMask *mask)
|
||||
+{
|
||||
+ return mask->has_unaccelerated;
|
||||
+}
|
||||
+
|
||||
+void
|
||||
+valuator_mask_drop_unaccelerated(ValuatorMask *mask)
|
||||
+{
|
||||
+ memset(mask->unaccelerated, 0, sizeof(mask->unaccelerated));
|
||||
+ mask->has_unaccelerated = FALSE;
|
||||
+}
|
||||
+
|
||||
+/**
|
||||
+ * Set both accelerated and unaccelerated value for this mask.
|
||||
+ */
|
||||
+void
|
||||
+valuator_mask_set_unaccelerated(ValuatorMask *mask,
|
||||
+ int valuator,
|
||||
+ double accel,
|
||||
+ double unaccel)
|
||||
+{
|
||||
+ BUG_WARN_MSG(mask->last_bit != -1 && !mask->has_unaccelerated,
|
||||
+ "Do not mix valuator types, zero mask first\n");
|
||||
+ _valuator_mask_set_double(mask, valuator, accel);
|
||||
+ mask->has_unaccelerated = TRUE;
|
||||
+ mask->unaccelerated[valuator] = unaccel;
|
||||
+}
|
||||
+
|
||||
+double
|
||||
+valuator_mask_get_accelerated(const ValuatorMask *mask,
|
||||
+ int valuator)
|
||||
+{
|
||||
+ return valuator_mask_get_double(mask, valuator);
|
||||
+}
|
||||
+
|
||||
+double
|
||||
+valuator_mask_get_unaccelerated(const ValuatorMask *mask,
|
||||
+ int valuator)
|
||||
+{
|
||||
+ return mask->unaccelerated[valuator];
|
||||
+}
|
||||
+
|
||||
+Bool
|
||||
+valuator_mask_fetch_unaccelerated(const ValuatorMask *mask,
|
||||
+ int valuator,
|
||||
+ double *accel,
|
||||
+ double *unaccel)
|
||||
+{
|
||||
+ if (valuator_mask_isset(mask, valuator)) {
|
||||
+ if (accel)
|
||||
+ *accel = valuator_mask_get_accelerated(mask, valuator);
|
||||
+ if (unaccel)
|
||||
+ *unaccel = valuator_mask_get_unaccelerated(mask, valuator);
|
||||
+ return TRUE;
|
||||
+ }
|
||||
+ else
|
||||
+ return FALSE;
|
||||
+}
|
||||
+
|
||||
int
|
||||
CountBits(const uint8_t * mask, int len)
|
||||
{
|
||||
diff --git a/hw/xfree86/common/xf86Module.h b/hw/xfree86/common/xf86Module.h
|
||||
index e68fe9c..6133641 100644
|
||||
--- a/hw/xfree86/common/xf86Module.h
|
||||
+++ b/hw/xfree86/common/xf86Module.h
|
||||
@@ -81,7 +81,7 @@ typedef enum {
|
||||
*/
|
||||
#define ABI_ANSIC_VERSION SET_ABI_VERSION(0, 4)
|
||||
#define ABI_VIDEODRV_VERSION SET_ABI_VERSION(19, 0)
|
||||
-#define ABI_XINPUT_VERSION SET_ABI_VERSION(21, 0)
|
||||
+#define ABI_XINPUT_VERSION SET_ABI_VERSION(21, 1)
|
||||
#define ABI_EXTENSION_VERSION SET_ABI_VERSION(9, 0)
|
||||
#define ABI_FONT_VERSION SET_ABI_VERSION(0, 6)
|
||||
|
||||
diff --git a/include/input.h b/include/input.h
|
||||
index bf22dc7..0a4c4f7 100644
|
||||
--- a/include/input.h
|
||||
+++ b/include/input.h
|
||||
@@ -674,6 +674,21 @@ extern _X_EXPORT Bool valuator_mask_fetch(const ValuatorMask *mask,
|
||||
extern _X_EXPORT Bool valuator_mask_fetch_double(const ValuatorMask *mask,
|
||||
int valnum, double *val);
|
||||
|
||||
+extern _X_EXPORT Bool valuator_mask_has_unaccelerated(const ValuatorMask *mask);
|
||||
+extern _X_EXPORT void valuator_mask_set_unaccelerated(ValuatorMask *mask,
|
||||
+ int valuator,
|
||||
+ double accel,
|
||||
+ double unaccel);
|
||||
+extern _X_EXPORT double valuator_mask_get_accelerated(const ValuatorMask *mask,
|
||||
+ int valuator);
|
||||
+extern _X_EXPORT double valuator_mask_get_unaccelerated(const ValuatorMask *mask,
|
||||
+ int valuator);
|
||||
+extern _X_EXPORT Bool valuator_mask_fetch_unaccelerated(const ValuatorMask *mask,
|
||||
+ int valuator,
|
||||
+ double *accel,
|
||||
+ double *unaccel);
|
||||
+extern _X_HIDDEN void valuator_mask_drop_unaccelerated(ValuatorMask *mask);
|
||||
+
|
||||
/* InputOption handling interface */
|
||||
extern _X_EXPORT InputOption *input_option_new(InputOption *list,
|
||||
const char *key,
|
||||
diff --git a/include/inpututils.h b/include/inpututils.h
|
||||
index 53c96ba..4e90815 100644
|
||||
--- a/include/inpututils.h
|
||||
+++ b/include/inpututils.h
|
||||
@@ -36,8 +36,10 @@ extern Mask event_filters[MAXDEVICES][MAXEVENTS];
|
||||
|
||||
struct _ValuatorMask {
|
||||
int8_t last_bit; /* highest bit set in mask */
|
||||
+ int8_t has_unaccelerated;
|
||||
uint8_t mask[(MAX_VALUATORS + 7) / 8];
|
||||
double valuators[MAX_VALUATORS]; /* valuator data */
|
||||
+ double unaccelerated[MAX_VALUATORS]; /* valuator data */
|
||||
};
|
||||
|
||||
extern void verify_internal_event(const InternalEvent *ev);
|
||||
--
|
||||
2.4.1
|
||||
|
||||
-34
@@ -1,34 +0,0 @@
|
||||
From 919f1f46fc67dae93b2b3f278fcbfc77af34ec58 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Michel=20D=C3=A4nzer?= <mdaenzer@redhat.com>
|
||||
Date: Mon, 31 Aug 2020 12:10:43 +0200
|
||||
Subject: [PATCH] xfree86: Take second reference for SavedCursor in
|
||||
xf86CursorSetCursor
|
||||
|
||||
The same pointer is kept in CurrentCursor as well, therefore two
|
||||
RefCursor calls are needed.
|
||||
|
||||
Fixes use-after-free after switching VTs.
|
||||
|
||||
Closes: https://gitlab.freedesktop.org/xorg/xserver/-/issues/1067
|
||||
Signed-off-by: Laurent Carlier <lordheavym@gmail.com>
|
||||
---
|
||||
hw/xfree86/ramdac/xf86CursorRD.c | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
diff --git a/hw/xfree86/ramdac/xf86CursorRD.c b/hw/xfree86/ramdac/xf86CursorRD.c
|
||||
index 9aa3de97b..c8362d169 100644
|
||||
--- a/hw/xfree86/ramdac/xf86CursorRD.c
|
||||
+++ b/hw/xfree86/ramdac/xf86CursorRD.c
|
||||
@@ -334,6 +334,9 @@ xf86CursorSetCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCurs,
|
||||
ScreenPriv->HotY = cursor->bits->yhot;
|
||||
|
||||
if (!infoPtr->pScrn->vtSema) {
|
||||
+ cursor = RefCursor(cursor);
|
||||
+ if (ScreenPriv->SavedCursor)
|
||||
+ FreeCursor(ScreenPriv->SavedCursor, None);
|
||||
ScreenPriv->SavedCursor = cursor;
|
||||
return;
|
||||
}
|
||||
--
|
||||
2.28.0
|
||||
|
||||
+87
@@ -0,0 +1,87 @@
|
||||
From 0217cc6e0cf5013366105a90f5f91ccc4bab5425 Mon Sep 17 00:00:00 2001
|
||||
From: Samuel Thibault <samuel.thibault@ens-lyon.org>
|
||||
Date: Wed, 26 Jan 2022 00:05:55 +0100
|
||||
Subject: [PATCH] xkb: fix XkbSetMap when changing a keysym without changing a
|
||||
keytype
|
||||
|
||||
As the comment says:
|
||||
|
||||
"symsPerKey/mapWidths must be filled regardless of client-side flags"
|
||||
|
||||
so we always have to call CheckKeyTypes which will notably fill mapWidths
|
||||
and nTypes. That is needed for CheckKeySyms to work since it checks the
|
||||
width. Without it, any request with XkbKeySymsMask but not
|
||||
XkbKeyTypesMask will fail because of the missing width information, for
|
||||
instance this:
|
||||
|
||||
XkbDescPtr xkb;
|
||||
if (!(xkb = XkbGetMap (dpy, XkbKeyTypesMask|XkbKeySymsMask, XkbUseCoreKbd))) {
|
||||
fprintf (stderr, "ERROR getting map\n");
|
||||
exit(1);
|
||||
}
|
||||
XFlush (dpy);
|
||||
XSync (dpy, False);
|
||||
|
||||
XkbMapChangesRec changes = { .changed = 0 };
|
||||
int oneGroupType[XkbNumKbdGroups] = { XkbOneLevelIndex };
|
||||
|
||||
if (XkbChangeTypesOfKey(xkb, keycode, 1, XkbGroup1Mask, oneGroupType, &changes)) {
|
||||
fprintf(stderr, "ERROR changing type of key\n");
|
||||
exit(1);
|
||||
}
|
||||
XkbKeySymEntry(xkb,keycode,0,0) = keysym;
|
||||
|
||||
if (!XkbChangeMap(dpy,xkb,&changes)) {
|
||||
fprintf(stderr, "ERROR changing map\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
XkbFreeKeyboard (xkb, 0, TRUE);
|
||||
XFlush (dpy);
|
||||
XSync (dpy, False);
|
||||
|
||||
This had being going under the radar since about ever until commit
|
||||
de940e06f8733d87bbb857aef85d830053442cfe ("xkb: fix key type index check
|
||||
in _XkbSetMapChecks") fixed checking the values of kt_index, which was
|
||||
previously erroneously ignoring errors and ignoring all other checks, just
|
||||
because nTypes was not set, precisely because CheckKeyTypes was not called.
|
||||
|
||||
Note: yes, CheckKeyTypes is meant to be callable without XkbKeyTypesMask, it
|
||||
does properly check for that and just fills nTypes and mapWidths in that
|
||||
case.
|
||||
|
||||
Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
|
||||
Signed-off-by: Laurent Carlier <lordheavym@gmail.com>
|
||||
---
|
||||
xkb/xkb.c | 11 +++++------
|
||||
1 file changed, 5 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/xkb/xkb.c b/xkb/xkb.c
|
||||
index bfc21de00..820cd7166 100644
|
||||
--- a/xkb/xkb.c
|
||||
+++ b/xkb/xkb.c
|
||||
@@ -2511,16 +2511,15 @@ _XkbSetMapChecks(ClientPtr client, DeviceIntPtr dev, xkbSetMapReq * req,
|
||||
}
|
||||
}
|
||||
|
||||
- if (!(req->present & XkbKeyTypesMask)) {
|
||||
- nTypes = xkb->map->num_types;
|
||||
- }
|
||||
- else if (!CheckKeyTypes(client, xkb, req, (xkbKeyTypeWireDesc **) &values,
|
||||
- &nTypes, mapWidths, doswap)) {
|
||||
+ /* nTypes/mapWidths/symsPerKey must be filled for further tests below,
|
||||
+ * regardless of client-side flags */
|
||||
+
|
||||
+ if (!CheckKeyTypes(client, xkb, req, (xkbKeyTypeWireDesc **) &values,
|
||||
+ &nTypes, mapWidths, doswap)) {
|
||||
client->errorValue = nTypes;
|
||||
return BadValue;
|
||||
}
|
||||
|
||||
- /* symsPerKey/mapWidths must be filled regardless of client-side flags */
|
||||
map = &xkb->map->key_sym_map[xkb->min_key_code];
|
||||
for (i = xkb->min_key_code; i < xkb->max_key_code; i++, map++) {
|
||||
register int g, ng, w;
|
||||
--
|
||||
2.35.1
|
||||
|
||||
@@ -1,134 +0,0 @@
|
||||
From 7504fbd2239257f1a00a1a15d02862eea81f167c Mon Sep 17 00:00:00 2001
|
||||
From: Peter Hutterer <peter.hutterer@who-t.net>
|
||||
Date: Tue, 5 May 2015 14:48:41 +1000
|
||||
Subject: [PATCH] dix: hook up the unaccelerated valuator masks
|
||||
|
||||
If present, access the unaccelerated valuator mask values for DGA and XI2 raw
|
||||
events.
|
||||
|
||||
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
|
||||
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
|
||||
---
|
||||
dix/getevents.c | 31 ++++++++++++++++++++++---------
|
||||
hw/xfree86/common/xf86Xinput.c | 4 ++++
|
||||
2 files changed, 26 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/dix/getevents.c b/dix/getevents.c
|
||||
index 6fb12c5..64bf76e 100644
|
||||
--- a/dix/getevents.c
|
||||
+++ b/dix/getevents.c
|
||||
@@ -213,14 +213,25 @@ init_raw(DeviceIntPtr dev, RawDeviceEvent *event, Time ms, int type, int detail)
|
||||
}
|
||||
|
||||
static void
|
||||
-set_raw_valuators(RawDeviceEvent *event, ValuatorMask *mask, double *data)
|
||||
+set_raw_valuators(RawDeviceEvent *event, ValuatorMask *mask,
|
||||
+ BOOL use_unaccel, double *data)
|
||||
{
|
||||
int i;
|
||||
|
||||
+ use_unaccel = use_unaccel && valuator_mask_has_unaccelerated(mask);
|
||||
+
|
||||
for (i = 0; i < valuator_mask_size(mask); i++) {
|
||||
if (valuator_mask_isset(mask, i)) {
|
||||
+ double v;
|
||||
+
|
||||
SetBit(event->valuators.mask, i);
|
||||
- data[i] = valuator_mask_get_double(mask, i);
|
||||
+
|
||||
+ if (use_unaccel)
|
||||
+ v = valuator_mask_get_unaccelerated(mask, i);
|
||||
+ else
|
||||
+ v = valuator_mask_get_double(mask, i);
|
||||
+
|
||||
+ data[i] = v;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1138,11 +1149,11 @@ GetKeyboardEvents(InternalEvent *events, DeviceIntPtr pDev, int type,
|
||||
valuator_mask_copy(&mask, mask_in);
|
||||
|
||||
init_raw(pDev, raw, ms, type, key_code);
|
||||
- set_raw_valuators(raw, &mask, raw->valuators.data_raw);
|
||||
+ set_raw_valuators(raw, &mask, TRUE, raw->valuators.data_raw);
|
||||
|
||||
clipValuators(pDev, &mask);
|
||||
|
||||
- set_raw_valuators(raw, &mask, raw->valuators.data);
|
||||
+ set_raw_valuators(raw, &mask, FALSE, raw->valuators.data);
|
||||
|
||||
event = &events->device_event;
|
||||
init_device_event(event, pDev, ms);
|
||||
@@ -1423,9 +1434,11 @@ fill_pointer_events(InternalEvent *events, DeviceIntPtr pDev, int type,
|
||||
num_events++;
|
||||
|
||||
init_raw(pDev, raw, ms, type, buttons);
|
||||
- set_raw_valuators(raw, &mask, raw->valuators.data_raw);
|
||||
+ set_raw_valuators(raw, &mask, TRUE, raw->valuators.data_raw);
|
||||
}
|
||||
|
||||
+ valuator_mask_drop_unaccelerated(&mask);
|
||||
+
|
||||
/* valuators are in driver-native format (rel or abs) */
|
||||
|
||||
if (flags & POINTER_ABSOLUTE) {
|
||||
@@ -1438,7 +1451,7 @@ fill_pointer_events(InternalEvent *events, DeviceIntPtr pDev, int type,
|
||||
transformAbsolute(pDev, &mask);
|
||||
clipAbsolute(pDev, &mask);
|
||||
if ((flags & POINTER_NORAW) == 0 && raw)
|
||||
- set_raw_valuators(raw, &mask, raw->valuators.data);
|
||||
+ set_raw_valuators(raw, &mask, FALSE, raw->valuators.data);
|
||||
}
|
||||
else {
|
||||
transformRelative(pDev, &mask);
|
||||
@@ -1446,7 +1459,7 @@ fill_pointer_events(InternalEvent *events, DeviceIntPtr pDev, int type,
|
||||
if (flags & POINTER_ACCELERATE)
|
||||
accelPointer(pDev, &mask, ms);
|
||||
if ((flags & POINTER_NORAW) == 0 && raw)
|
||||
- set_raw_valuators(raw, &mask, raw->valuators.data);
|
||||
+ set_raw_valuators(raw, &mask, FALSE, raw->valuators.data);
|
||||
|
||||
moveRelative(pDev, flags, &mask);
|
||||
}
|
||||
@@ -1951,7 +1964,7 @@ GetTouchEvents(InternalEvent *events, DeviceIntPtr dev, uint32_t ddx_touchid,
|
||||
events++;
|
||||
num_events++;
|
||||
init_raw(dev, raw, ms, type, client_id);
|
||||
- set_raw_valuators(raw, &mask, raw->valuators.data_raw);
|
||||
+ set_raw_valuators(raw, &mask, TRUE, raw->valuators.data_raw);
|
||||
}
|
||||
|
||||
event = &events->device_event;
|
||||
@@ -2013,7 +2026,7 @@ GetTouchEvents(InternalEvent *events, DeviceIntPtr dev, uint32_t ddx_touchid,
|
||||
screeny = dev->spriteInfo->sprite->hotPhys.y;
|
||||
}
|
||||
if (need_rawevent)
|
||||
- set_raw_valuators(raw, &mask, raw->valuators.data);
|
||||
+ set_raw_valuators(raw, &mask, FALSE, raw->valuators.data);
|
||||
|
||||
/* Indirect device touch coordinates are not used for cursor positioning.
|
||||
* They are merely informational, and are provided in device coordinates.
|
||||
diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c
|
||||
index 1fb5b16..5ce4c71 100644
|
||||
--- a/hw/xfree86/common/xf86Xinput.c
|
||||
+++ b/hw/xfree86/common/xf86Xinput.c
|
||||
@@ -1137,12 +1137,16 @@ xf86CheckMotionEvent4DGA(DeviceIntPtr device, int is_absolute,
|
||||
dx = valuator_mask_get(mask, 0);
|
||||
if (is_absolute)
|
||||
dx -= device->last.valuators[0];
|
||||
+ else if (valuator_mask_has_unaccelerated(mask))
|
||||
+ dx = valuator_mask_get_unaccelerated(mask, 0);
|
||||
}
|
||||
|
||||
if (valuator_mask_isset(mask, 1)) {
|
||||
dy = valuator_mask_get(mask, 1);
|
||||
if (is_absolute)
|
||||
dy -= device->last.valuators[1];
|
||||
+ else if (valuator_mask_has_unaccelerated(mask))
|
||||
+ dy = valuator_mask_get_unaccelerated(mask, 1);
|
||||
}
|
||||
|
||||
if (DGAStealMotionEvent(device, idx, dx, dy))
|
||||
--
|
||||
2.4.1
|
||||
|
||||
@@ -0,0 +1,63 @@
|
||||
From 4c03b67d334b05b814239420776f2fdd4c4a98ac Mon Sep 17 00:00:00 2001
|
||||
From: nerdopolis <bluescreen_avenger@verizon.net>
|
||||
Date: Tue, 11 Jan 2022 18:41:42 -0500
|
||||
Subject: [PATCH] xephyr: Don't check for SeatId anymore
|
||||
|
||||
After a change for the xserver to automatically determine the seat
|
||||
based on the XDG_SEAT variable, xephyr stopped working. This was
|
||||
because of an old feature where xephyr used to handle evdev
|
||||
directly. This was dropped some time ago, and now this check is
|
||||
not needed
|
||||
---
|
||||
hw/kdrive/ephyr/ephyrinit.c | 34 ++++++++++++++++------------------
|
||||
1 file changed, 16 insertions(+), 18 deletions(-)
|
||||
|
||||
diff --git a/hw/kdrive/ephyr/ephyrinit.c b/hw/kdrive/ephyr/ephyrinit.c
|
||||
index 020461db2..09cd28cb3 100644
|
||||
--- a/hw/kdrive/ephyr/ephyrinit.c
|
||||
+++ b/hw/kdrive/ephyr/ephyrinit.c
|
||||
@@ -70,25 +70,23 @@ InitInput(int argc, char **argv)
|
||||
KdKeyboardInfo *ki;
|
||||
KdPointerInfo *pi;
|
||||
|
||||
- if (!SeatId) {
|
||||
- KdAddKeyboardDriver(&EphyrKeyboardDriver);
|
||||
- KdAddPointerDriver(&EphyrMouseDriver);
|
||||
-
|
||||
- if (!kdHasKbd) {
|
||||
- ki = KdNewKeyboard();
|
||||
- if (!ki)
|
||||
- FatalError("Couldn't create Xephyr keyboard\n");
|
||||
- ki->driver = &EphyrKeyboardDriver;
|
||||
- KdAddKeyboard(ki);
|
||||
- }
|
||||
+ KdAddKeyboardDriver(&EphyrKeyboardDriver);
|
||||
+ KdAddPointerDriver(&EphyrMouseDriver);
|
||||
+
|
||||
+ if (!kdHasKbd) {
|
||||
+ ki = KdNewKeyboard();
|
||||
+ if (!ki)
|
||||
+ FatalError("Couldn't create Xephyr keyboard\n");
|
||||
+ ki->driver = &EphyrKeyboardDriver;
|
||||
+ KdAddKeyboard(ki);
|
||||
+ }
|
||||
|
||||
- if (!kdHasPointer) {
|
||||
- pi = KdNewPointer();
|
||||
- if (!pi)
|
||||
- FatalError("Couldn't create Xephyr pointer\n");
|
||||
- pi->driver = &EphyrMouseDriver;
|
||||
- KdAddPointer(pi);
|
||||
- }
|
||||
+ if (!kdHasPointer) {
|
||||
+ pi = KdNewPointer();
|
||||
+ if (!pi)
|
||||
+ FatalError("Couldn't create Xephyr pointer\n");
|
||||
+ pi->driver = &EphyrMouseDriver;
|
||||
+ KdAddPointer(pi);
|
||||
}
|
||||
|
||||
KdInitInput();
|
||||
--
|
||||
GitLab
|
||||
|
||||
+98
@@ -0,0 +1,98 @@
|
||||
From 6ef5c05728f8b18170fbc8415d7502495a08670b Mon Sep 17 00:00:00 2001
|
||||
From: Povilas Kanapickas <povilas@radix.lt>
|
||||
Date: Sun, 23 Jan 2022 22:18:52 +0200
|
||||
Subject: [PATCH] dix: Correctly save replayed event into GrabInfoRec
|
||||
|
||||
When processing events we operate on InternalEvent pointers. They may
|
||||
actually refer to a an instance of DeviceEvent, GestureEvent or any
|
||||
other event that comprises the InternalEvent union. This works well in
|
||||
practice because we always look into event type before doing anything,
|
||||
except in the case of copying the event.
|
||||
|
||||
*dst_event = *src_event would copy whole InternalEvent event and would
|
||||
cause out of bounds read in case the pointed to event was not
|
||||
InternalEvent but e.g. DeviceEvent.
|
||||
|
||||
This regression has been introduced in
|
||||
23a8b62d34344575f9df9d057fb74bfefa94a77b.
|
||||
|
||||
Fixes https://gitlab.freedesktop.org/xorg/xserver/-/issues/1261
|
||||
|
||||
Signed-off-by: Povilas Kanapickas <povilas@radix.lt>
|
||||
---
|
||||
Xi/exevents.c | 2 +-
|
||||
dix/events.c | 18 ++++++++++++++++--
|
||||
include/input.h | 1 +
|
||||
3 files changed, 18 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/Xi/exevents.c b/Xi/exevents.c
|
||||
index 94b9983bd..217baa956 100644
|
||||
--- a/Xi/exevents.c
|
||||
+++ b/Xi/exevents.c
|
||||
@@ -1524,7 +1524,7 @@ DeliverTouchEmulatedEvent(DeviceIntPtr dev, TouchPointInfoPtr ti,
|
||||
g = AllocGrab(devgrab);
|
||||
BUG_WARN(!g);
|
||||
|
||||
- *dev->deviceGrab.sync.event = *ev;
|
||||
+ CopyPartialInternalEvent(dev->deviceGrab.sync.event, ev);
|
||||
|
||||
/* The listener array has a sequence of grabs and then one event
|
||||
* selection. Implicit grab activation occurs through delivering an
|
||||
diff --git a/dix/events.c b/dix/events.c
|
||||
index 341c746d4..28d7d177c 100644
|
||||
--- a/dix/events.c
|
||||
+++ b/dix/events.c
|
||||
@@ -467,6 +467,20 @@ WindowXI2MaskIsset(DeviceIntPtr dev, WindowPtr win, xEvent *ev)
|
||||
return xi2mask_isset(inputMasks->xi2mask, dev, evtype);
|
||||
}
|
||||
|
||||
+/**
|
||||
+ * When processing events we operate on InternalEvent pointers. They may actually refer to a
|
||||
+ * an instance of DeviceEvent, GestureEvent or any other event that comprises the InternalEvent
|
||||
+ * union. This works well in practice because we always look into event type before doing anything,
|
||||
+ * except in the case of copying the event. Any copying of InternalEvent should use this function
|
||||
+ * instead of doing *dst_event = *src_event whenever it's not clear whether source event actually
|
||||
+ * points to full InternalEvent instance.
|
||||
+ */
|
||||
+void
|
||||
+CopyPartialInternalEvent(InternalEvent* dst_event, const InternalEvent* src_event)
|
||||
+{
|
||||
+ memcpy(dst_event, src_event, src_event->any.length);
|
||||
+}
|
||||
+
|
||||
Mask
|
||||
GetEventMask(DeviceIntPtr dev, xEvent *event, InputClients * other)
|
||||
{
|
||||
@@ -3873,7 +3887,7 @@ void ActivateGrabNoDelivery(DeviceIntPtr dev, GrabPtr grab,
|
||||
|
||||
if (grabinfo->sync.state == FROZEN_NO_EVENT)
|
||||
grabinfo->sync.state = FROZEN_WITH_EVENT;
|
||||
- *grabinfo->sync.event = *real_event;
|
||||
+ CopyPartialInternalEvent(grabinfo->sync.event, real_event);
|
||||
}
|
||||
|
||||
static BOOL
|
||||
@@ -4455,7 +4469,7 @@ FreezeThisEventIfNeededForSyncGrab(DeviceIntPtr thisDev, InternalEvent *event)
|
||||
case FREEZE_NEXT_EVENT:
|
||||
grabinfo->sync.state = FROZEN_WITH_EVENT;
|
||||
FreezeThaw(thisDev, TRUE);
|
||||
- *grabinfo->sync.event = *event;
|
||||
+ CopyPartialInternalEvent(grabinfo->sync.event, event);
|
||||
break;
|
||||
}
|
||||
}
|
||||
diff --git a/include/input.h b/include/input.h
|
||||
index b1aef3663..cdb5d5a90 100644
|
||||
--- a/include/input.h
|
||||
+++ b/include/input.h
|
||||
@@ -676,6 +676,7 @@ extern void GestureEmitGestureEndToOwner(DeviceIntPtr dev, GestureInfoPtr gi);
|
||||
extern void ProcessGestureEvent(InternalEvent *ev, DeviceIntPtr dev);
|
||||
|
||||
/* misc event helpers */
|
||||
+extern void CopyPartialInternalEvent(InternalEvent* dst_event, const InternalEvent* src_event);
|
||||
extern Mask GetEventMask(DeviceIntPtr dev, xEvent *ev, InputClientsPtr clients);
|
||||
extern Mask GetEventFilter(DeviceIntPtr dev, xEvent *event);
|
||||
extern Bool WindowXI2MaskIsset(DeviceIntPtr dev, WindowPtr win, xEvent *ev);
|
||||
--
|
||||
GitLab
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
From 69774044716039fa70655b3bc6dd6a4ff4535cfd Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?B=C5=82a=C5=BCej=20Szczygie=C5=82?= <spaz16@wp.pl>
|
||||
Date: Thu, 13 Jan 2022 00:47:27 +0100
|
||||
Subject: [PATCH] present: Check for NULL to prevent crash
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Closes: https://gitlab.freedesktop.org/xorg/xserver/-/issues/1275
|
||||
Signed-off-by: Błażej Szczygieł <spaz16@wp.pl>
|
||||
Tested-by: Aaron Plattner <aplattner@nvidia.com>
|
||||
(cherry picked from commit 22d5818851967408bb7c903cb345b7ca8766094c)
|
||||
---
|
||||
present/present_scmd.c | 6 ++++++
|
||||
1 file changed, 6 insertions(+)
|
||||
|
||||
diff --git a/present/present_scmd.c b/present/present_scmd.c
|
||||
index da836ea6b..239055bc1 100644
|
||||
--- a/present/present_scmd.c
|
||||
+++ b/present/present_scmd.c
|
||||
@@ -158,6 +158,9 @@ present_scmd_get_crtc(present_screen_priv_ptr screen_priv, WindowPtr window)
|
||||
if (!screen_priv->info)
|
||||
return NULL;
|
||||
|
||||
+ if (!screen_priv->info->get_crtc)
|
||||
+ return NULL;
|
||||
+
|
||||
return (*screen_priv->info->get_crtc)(window);
|
||||
}
|
||||
|
||||
@@ -196,6 +199,9 @@ present_flush(WindowPtr window)
|
||||
if (!screen_priv->info)
|
||||
return;
|
||||
|
||||
+ if (!screen_priv->info->flush)
|
||||
+ return;
|
||||
+
|
||||
(*screen_priv->info->flush) (window);
|
||||
}
|
||||
|
||||
--
|
||||
GitLab
|
||||
|
||||
@@ -1,21 +0,0 @@
|
||||
--- hw/xfree86/common/xf86pciBus.c.orig 2011-09-24 10:53:45.421697668 +0000
|
||||
+++ hw/xfree86/common/xf86pciBus.c 2011-09-24 10:55:56.416250708 +0000
|
||||
@@ -1200,9 +1200,15 @@
|
||||
break;
|
||||
}
|
||||
break;
|
||||
- case 0x1039:
|
||||
- driverList[0] = "sis";
|
||||
- break;
|
||||
+ case 0x1039:
|
||||
+ switch (dev->device_id)
|
||||
+ {
|
||||
+ case 0x6350: case 0x6351:
|
||||
+ driverList[0] = "sisimedia"; driverList[1] = "sis"; break;
|
||||
+ default:
|
||||
+ driverList[0] = "sis"; break;
|
||||
+ }
|
||||
+ break;
|
||||
case 0x126f:
|
||||
driverList[0] = "siliconmotion";
|
||||
break;
|
||||
@@ -1,162 +0,0 @@
|
||||
From 7198a6d4e74f684cb383b3e0f70dd2bae405e6e7 Mon Sep 17 00:00:00 2001
|
||||
From: Chris Wilson <chris@chris-wilson.co.uk>
|
||||
Date: Mon, 16 Jan 2017 22:17:36 +0000
|
||||
Subject: xfree86: Take the input lock for xf86RecolorCursor
|
||||
|
||||
xf86RecolorCursor() may be called directly from XRecolorCursor as well
|
||||
as from xf86ScreenSetCursor(). In the latter case, the input lock is
|
||||
already held, but not for the former and so we need to add a wrapper
|
||||
function that acquires the input lock before performing
|
||||
xf86RecolorCursor()
|
||||
|
||||
References: https://bugs.freedesktop.org/show_bug.cgi?id=99358
|
||||
|
||||
diff --git a/hw/xfree86/ramdac/xf86HWCurs.c b/hw/xfree86/ramdac/xf86HWCurs.c
|
||||
index 4481320..55d5861 100644
|
||||
--- a/hw/xfree86/ramdac/xf86HWCurs.c
|
||||
+++ b/hw/xfree86/ramdac/xf86HWCurs.c
|
||||
@@ -22,6 +22,9 @@
|
||||
|
||||
#include "servermd.h"
|
||||
|
||||
+static void
|
||||
+xf86RecolorCursor_locked(xf86CursorScreenPtr ScreenPriv, CursorPtr pCurs);
|
||||
+
|
||||
static CARD32
|
||||
xf86ReverseBitOrder(CARD32 v)
|
||||
{
|
||||
@@ -204,7 +207,7 @@ xf86ScreenSetCursor(ScreenPtr pScreen, CursorPtr pCurs, int x, int y)
|
||||
if (!xf86DriverLoadCursorImage (infoPtr, bits))
|
||||
return FALSE;
|
||||
|
||||
- xf86RecolorCursor(pScreen, pCurs, 1);
|
||||
+ xf86RecolorCursor_locked (ScreenPriv, pCurs);
|
||||
|
||||
(*infoPtr->SetCursorPosition) (infoPtr->pScrn, x, y);
|
||||
|
||||
@@ -312,12 +315,9 @@ xf86MoveCursor(ScreenPtr pScreen, int x, int y)
|
||||
input_unlock();
|
||||
}
|
||||
|
||||
-void
|
||||
-xf86RecolorCursor(ScreenPtr pScreen, CursorPtr pCurs, Bool displayed)
|
||||
+static void
|
||||
+xf86RecolorCursor_locked(xf86CursorScreenPtr ScreenPriv, CursorPtr pCurs)
|
||||
{
|
||||
- xf86CursorScreenPtr ScreenPriv =
|
||||
- (xf86CursorScreenPtr) dixLookupPrivate(&pScreen->devPrivates,
|
||||
- xf86CursorScreenKey);
|
||||
xf86CursorInfoPtr infoPtr = ScreenPriv->CursorInfoPtr;
|
||||
|
||||
/* recoloring isn't applicable to ARGB cursors and drivers
|
||||
@@ -357,6 +357,18 @@ xf86RecolorCursor(ScreenPtr pScreen, CursorPtr pCurs, Bool displayed)
|
||||
}
|
||||
}
|
||||
|
||||
+void
|
||||
+xf86RecolorCursor(ScreenPtr pScreen, CursorPtr pCurs, Bool displayed)
|
||||
+{
|
||||
+ xf86CursorScreenPtr ScreenPriv =
|
||||
+ (xf86CursorScreenPtr) dixLookupPrivate(&pScreen->devPrivates,
|
||||
+ xf86CursorScreenKey);
|
||||
+
|
||||
+ input_lock();
|
||||
+ xf86RecolorCursor_locked (ScreenPriv, pCurs);
|
||||
+ input_unlock();
|
||||
+}
|
||||
+
|
||||
/* These functions assume that MaxWidth is a multiple of 32 */
|
||||
static unsigned char *
|
||||
RealizeCursorInterleave0(xf86CursorInfoPtr infoPtr, CursorPtr pCurs)
|
||||
--
|
||||
cgit v0.10.2
|
||||
|
||||
From cfddd919cce4178baba07959e5e862d02e166522 Mon Sep 17 00:00:00 2001
|
||||
From: Chris Wilson <chris@chris-wilson.co.uk>
|
||||
Date: Mon, 16 Jan 2017 22:36:34 +0000
|
||||
Subject: xfree86: Take input lock for xf86TransparentCursor
|
||||
|
||||
|
||||
diff --git a/hw/xfree86/ramdac/xf86HWCurs.c b/hw/xfree86/ramdac/xf86HWCurs.c
|
||||
index 55d5861..26dc7e5 100644
|
||||
--- a/hw/xfree86/ramdac/xf86HWCurs.c
|
||||
+++ b/hw/xfree86/ramdac/xf86HWCurs.c
|
||||
@@ -261,6 +261,8 @@ xf86SetTransparentCursor(ScreenPtr pScreen)
|
||||
xf86CursorScreenKey);
|
||||
xf86CursorInfoPtr infoPtr = ScreenPriv->CursorInfoPtr;
|
||||
|
||||
+ input_lock();
|
||||
+
|
||||
if (!ScreenPriv->transparentData)
|
||||
ScreenPriv->transparentData =
|
||||
(*infoPtr->RealizeCursor) (infoPtr, NullCursor);
|
||||
@@ -273,6 +275,8 @@ xf86SetTransparentCursor(ScreenPtr pScreen)
|
||||
ScreenPriv->transparentData);
|
||||
|
||||
(*infoPtr->ShowCursor) (infoPtr->pScrn);
|
||||
+
|
||||
+ input_unlock();
|
||||
}
|
||||
|
||||
static void
|
||||
--
|
||||
cgit v0.10.2
|
||||
|
||||
From 3eb964e25243056dd998f52d3b00171b71c89189 Mon Sep 17 00:00:00 2001
|
||||
From: Chris Wilson <chris@chris-wilson.co.uk>
|
||||
Date: Fri, 20 Jan 2017 09:49:19 +0000
|
||||
Subject: xfree86: Take input_lock() for xf86ScreenCheckHWCursor
|
||||
|
||||
|
||||
diff --git a/hw/xfree86/ramdac/xf86HWCurs.c b/hw/xfree86/ramdac/xf86HWCurs.c
|
||||
index 26dc7e5..7043a9c 100644
|
||||
--- a/hw/xfree86/ramdac/xf86HWCurs.c
|
||||
+++ b/hw/xfree86/ramdac/xf86HWCurs.c
|
||||
@@ -139,9 +139,14 @@ Bool
|
||||
xf86CheckHWCursor(ScreenPtr pScreen, CursorPtr cursor, xf86CursorInfoPtr infoPtr)
|
||||
{
|
||||
ScreenPtr pSlave;
|
||||
+ Bool use_hw_cursor = TRUE;
|
||||
|
||||
- if (!xf86ScreenCheckHWCursor(pScreen, cursor, infoPtr))
|
||||
- return FALSE;
|
||||
+ input_lock();
|
||||
+
|
||||
+ if (!xf86ScreenCheckHWCursor(pScreen, cursor, infoPtr)) {
|
||||
+ use_hw_cursor = FALSE;
|
||||
+ goto unlock;
|
||||
+ }
|
||||
|
||||
/* ask each driver consuming a pixmap if it can support HW cursor */
|
||||
xorg_list_for_each_entry(pSlave, &pScreen->slave_list, slave_head) {
|
||||
@@ -151,14 +156,22 @@ xf86CheckHWCursor(ScreenPtr pScreen, CursorPtr cursor, xf86CursorInfoPtr infoPtr
|
||||
continue;
|
||||
|
||||
sPriv = dixLookupPrivate(&pSlave->devPrivates, xf86CursorScreenKey);
|
||||
- if (!sPriv) /* NULL if Option "SWCursor", possibly other conditions */
|
||||
- return FALSE;
|
||||
+ if (!sPriv) { /* NULL if Option "SWCursor", possibly other conditions */
|
||||
+ use_hw_cursor = FALSE;
|
||||
+ break;
|
||||
+ }
|
||||
|
||||
/* FALSE if HWCursor not supported by slave */
|
||||
- if (!xf86ScreenCheckHWCursor(pSlave, cursor, sPriv->CursorInfoPtr))
|
||||
- return FALSE;
|
||||
+ if (!xf86ScreenCheckHWCursor(pSlave, cursor, sPriv->CursorInfoPtr)) {
|
||||
+ use_hw_cursor = FALSE;
|
||||
+ break;
|
||||
+ }
|
||||
}
|
||||
- return TRUE;
|
||||
+
|
||||
+unlock:
|
||||
+ input_unlock();
|
||||
+
|
||||
+ return use_hw_cursor;
|
||||
}
|
||||
|
||||
static Bool
|
||||
--
|
||||
cgit v0.10.2
|
||||
|
||||
@@ -1,13 +0,0 @@
|
||||
Index: xorg-server-1.9.0/hw/xfree86/common/xf86Globals.c
|
||||
===================================================================
|
||||
--- xorg-server-1.9.0.orig/hw/xfree86/common/xf86Globals.c
|
||||
+++ xorg-server-1.9.0/hw/xfree86/common/xf86Globals.c
|
||||
@@ -140,7 +140,7 @@ xf86InfoRec xf86Info = {
|
||||
};
|
||||
const char *xf86ConfigFile = NULL;
|
||||
const char *xf86ConfigDir = NULL;
|
||||
-const char *xf86ModulePath = DEFAULT_MODULE_PATH;
|
||||
+const char *xf86ModulePath = DEFAULT_MODULE_PATH "/updates," DEFAULT_MODULE_PATH "/volatile," DEFAULT_MODULE_PATH;
|
||||
MessageType xf86ModPathFrom = X_DEFAULT;
|
||||
const char *xf86LogFile = DEFAULT_LOGPREFIX;
|
||||
MessageType xf86LogFileFrom = X_DEFAULT;
|
||||
@@ -1,851 +0,0 @@
|
||||
From c17e544b271ced65483692103d39ed1188d4ca25 Mon Sep 17 00:00:00 2001
|
||||
From: Hans de Goede <hdegoede@redhat.com>
|
||||
Date: Tue, 27 Sep 2016 14:30:10 +0200
|
||||
Subject: [PATCH xserver v2 5/7] xfree86: Remove redundant ServerIsNotSeat0
|
||||
check from xf86CallDriverProbe
|
||||
|
||||
If foundScreen is TRUE, then all the code below the removed if
|
||||
will not execute until we reach the return foundScreen; at the
|
||||
end, so this entire if block is redundant.
|
||||
|
||||
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||
---
|
||||
hw/xfree86/common/xf86Bus.c | 2 --
|
||||
1 file changed, 2 deletions(-)
|
||||
|
||||
diff --git a/hw/xfree86/common/xf86Bus.c b/hw/xfree86/common/xf86Bus.c
|
||||
index 5b93940..27c6b1b 100644
|
||||
--- a/hw/xfree86/common/xf86Bus.c
|
||||
+++ b/hw/xfree86/common/xf86Bus.c
|
||||
@@ -82,8 +82,6 @@ xf86CallDriverProbe(DriverPtr drv, Bool detect_only)
|
||||
if (!xf86DoConfigure && drv->platformProbe != NULL) {
|
||||
foundScreen = xf86platformProbeDev(drv);
|
||||
}
|
||||
- if (ServerIsNotSeat0() && foundScreen)
|
||||
- return foundScreen;
|
||||
#endif
|
||||
|
||||
#ifdef XSERVER_LIBPCIACCESS
|
||||
--
|
||||
2.9.3
|
||||
|
||||
From 74bc0fff3a6ca233e56b3fb2971bca97b5a4f8b5 Mon Sep 17 00:00:00 2001
|
||||
From: Hans de Goede <hdegoede@redhat.com>
|
||||
Date: Fri, 30 Sep 2016 11:59:04 +0200
|
||||
Subject: [PATCH xserver v2 6/7] xfree86: Make adding unclaimed devices as GPU
|
||||
devices a separate step
|
||||
|
||||
This is primarily a preparation patch for fixing the xserver exiting with
|
||||
a "no screens found" error even though there are supported video cards,
|
||||
due to the server not recognizing any card as the primary card.
|
||||
|
||||
This also fixes the (mostly theoretical) case of a platformBus capable
|
||||
driver adding a device as GPUscreen before a driver which only supports
|
||||
the old PCI probe method gets a chance to claim it as a normal screen.
|
||||
|
||||
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||
---
|
||||
hw/xfree86/common/xf86Bus.c | 4 ++++
|
||||
hw/xfree86/common/xf86platformBus.c | 15 +++++++++++++++
|
||||
hw/xfree86/common/xf86platformBus.h | 6 ++++++
|
||||
3 files changed, 25 insertions(+)
|
||||
|
||||
diff --git a/hw/xfree86/common/xf86Bus.c b/hw/xfree86/common/xf86Bus.c
|
||||
index 27c6b1b..a3a9898 100644
|
||||
--- a/hw/xfree86/common/xf86Bus.c
|
||||
+++ b/hw/xfree86/common/xf86Bus.c
|
||||
@@ -125,6 +125,10 @@ xf86BusConfig(void)
|
||||
xf86CallDriverProbe(xf86DriverList[i], FALSE);
|
||||
}
|
||||
|
||||
+ for (i = 0; i < xf86NumDrivers; i++) {
|
||||
+ xf86platformAddGPUDevices(xf86DriverList[i]);
|
||||
+ }
|
||||
+
|
||||
/* If nothing was detected, return now */
|
||||
if (xf86NumScreens == 0) {
|
||||
xf86Msg(X_ERROR, "No devices detected.\n");
|
||||
diff --git a/hw/xfree86/common/xf86platformBus.c b/hw/xfree86/common/xf86platformBus.c
|
||||
index 39fb1dd..8dd0d5d 100644
|
||||
--- a/hw/xfree86/common/xf86platformBus.c
|
||||
+++ b/hw/xfree86/common/xf86platformBus.c
|
||||
@@ -475,6 +475,21 @@ xf86platformProbeDev(DriverPtr drvp)
|
||||
isGPUDevice(devList[i]) ? PLATFORM_PROBE_GPU_SCREEN : 0);
|
||||
}
|
||||
|
||||
+ return foundScreen;
|
||||
+}
|
||||
+
|
||||
+int
|
||||
+xf86platformAddGPUDevices(DriverPtr drvp)
|
||||
+{
|
||||
+ Bool foundScreen = FALSE;
|
||||
+ GDevPtr *devList;
|
||||
+ int j;
|
||||
+
|
||||
+ if (!drvp->platformProbe)
|
||||
+ return FALSE;
|
||||
+
|
||||
+ xf86MatchDevice(drvp->driverName, &devList);
|
||||
+
|
||||
/* if autoaddgpu devices is enabled then go find any unclaimed platform
|
||||
* devices and add them as GPU screens */
|
||||
if (xf86Info.autoAddGPU) {
|
||||
diff --git a/hw/xfree86/common/xf86platformBus.h b/hw/xfree86/common/xf86platformBus.h
|
||||
index a7335b9..0f5c0ef 100644
|
||||
--- a/hw/xfree86/common/xf86platformBus.h
|
||||
+++ b/hw/xfree86/common/xf86platformBus.h
|
||||
@@ -41,6 +41,7 @@ struct xf86_platform_device {
|
||||
#ifdef XSERVER_PLATFORM_BUS
|
||||
int xf86platformProbe(void);
|
||||
int xf86platformProbeDev(DriverPtr drvp);
|
||||
+int xf86platformAddGPUDevices(DriverPtr drvp);
|
||||
|
||||
extern int xf86_num_platform_devices;
|
||||
extern struct xf86_platform_device *xf86_platform_devices;
|
||||
@@ -156,6 +157,11 @@ xf86PlatformMatchDriver(char *matches[], int nmatches);
|
||||
|
||||
extern void xf86platformVTProbe(void);
|
||||
extern void xf86platformPrimary(void);
|
||||
+
|
||||
+#else
|
||||
+
|
||||
+static inline int xf86platformAddGPUDevices(DriverPtr drvp) { return FALSE; }
|
||||
+
|
||||
#endif
|
||||
|
||||
#endif
|
||||
--
|
||||
2.9.3
|
||||
|
||||
From 02bcb6f189c4ad8b2e73ce99cfa3c10f0c244a88 Mon Sep 17 00:00:00 2001
|
||||
From: Hans de Goede <hdegoede@redhat.com>
|
||||
Date: Fri, 30 Sep 2016 12:29:09 +0200
|
||||
Subject: [PATCH xserver v2 7/7] xfree86: Try harder to find atleast 1 non GPU
|
||||
Screen
|
||||
|
||||
If we did not find any non GPU Screens, try again ignoring the notion
|
||||
of any video devices being the primary device. This fixes Xorg exiting
|
||||
with a "no screens found" error when using virtio-vga in a
|
||||
virtual-machine and when using a device driven by simpledrm.
|
||||
|
||||
This is a somewhat ugly solution, but it is the best I can come up with
|
||||
without major surgery to the bus and probe code.
|
||||
|
||||
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||
---
|
||||
hw/xfree86/common/xf86.h | 1 +
|
||||
hw/xfree86/common/xf86Bus.c | 26 +++++++++++++++++++++++---
|
||||
hw/xfree86/common/xf86Globals.c | 1 +
|
||||
hw/xfree86/common/xf86pciBus.c | 4 ++++
|
||||
hw/xfree86/common/xf86platformBus.c | 4 ++++
|
||||
5 files changed, 33 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/hw/xfree86/common/xf86.h b/hw/xfree86/common/xf86.h
|
||||
index e54c811..f724688 100644
|
||||
--- a/hw/xfree86/common/xf86.h
|
||||
+++ b/hw/xfree86/common/xf86.h
|
||||
@@ -55,6 +55,7 @@
|
||||
extern _X_EXPORT int xf86DoConfigure;
|
||||
extern _X_EXPORT int xf86DoShowOptions;
|
||||
extern _X_EXPORT Bool xf86DoConfigurePass1;
|
||||
+extern _X_EXPORT Bool xf86ProbeIgnorePrimary;
|
||||
extern _X_EXPORT Bool xorgHWAccess;
|
||||
|
||||
extern _X_EXPORT DevPrivateKeyRec xf86ScreenKeyRec;
|
||||
diff --git a/hw/xfree86/common/xf86Bus.c b/hw/xfree86/common/xf86Bus.c
|
||||
index a3a9898..9836803 100644
|
||||
--- a/hw/xfree86/common/xf86Bus.c
|
||||
+++ b/hw/xfree86/common/xf86Bus.c
|
||||
@@ -117,14 +117,34 @@ xf86BusConfig(void)
|
||||
int i, j;
|
||||
|
||||
/*
|
||||
- * Now call each of the Probe functions. Each successful probe will
|
||||
- * result in an extra entry added to the xf86Screens[] list for each
|
||||
- * instance of the hardware found.
|
||||
+ * 3 step probe to (hopefully) ensure that we always find at least 1
|
||||
+ * (non GPU) screen:
|
||||
+ *
|
||||
+ * 1. Call each drivers probe function normally,
|
||||
+ * Each successful probe will result in an extra entry added to the
|
||||
+ * xf86Screens[] list for each instance of the hardware found.
|
||||
*/
|
||||
for (i = 0; i < xf86NumDrivers; i++) {
|
||||
xf86CallDriverProbe(xf86DriverList[i], FALSE);
|
||||
}
|
||||
|
||||
+ /*
|
||||
+ * 2. If no Screens were found, call each drivers probe function with
|
||||
+ * ignorePrimary = TRUE, to ensure that we do actually get a
|
||||
+ * Screen if there is atleast one supported video card.
|
||||
+ */
|
||||
+ if (xf86NumScreens == 0) {
|
||||
+ xf86ProbeIgnorePrimary = TRUE;
|
||||
+ for (i = 0; i < xf86NumDrivers && xf86NumScreens == 0; i++) {
|
||||
+ xf86CallDriverProbe(xf86DriverList[i], FALSE);
|
||||
+ }
|
||||
+ xf86ProbeIgnorePrimary = FALSE;
|
||||
+ }
|
||||
+
|
||||
+ /*
|
||||
+ * 3. Call xf86platformAddGPUDevices() to add any additional video cards as
|
||||
+ * GPUScreens (GPUScreens are only supported by platformBus drivers).
|
||||
+ */
|
||||
for (i = 0; i < xf86NumDrivers; i++) {
|
||||
xf86platformAddGPUDevices(xf86DriverList[i]);
|
||||
}
|
||||
diff --git a/hw/xfree86/common/xf86Globals.c b/hw/xfree86/common/xf86Globals.c
|
||||
index 07cfabf..e962b75 100644
|
||||
--- a/hw/xfree86/common/xf86Globals.c
|
||||
+++ b/hw/xfree86/common/xf86Globals.c
|
||||
@@ -152,6 +152,7 @@ XF86ConfigPtr xf86configptr = NULL;
|
||||
Bool xf86Resetting = FALSE;
|
||||
Bool xf86Initialising = FALSE;
|
||||
Bool xf86DoConfigure = FALSE;
|
||||
+Bool xf86ProbeIgnorePrimary = FALSE;
|
||||
Bool xf86DoShowOptions = FALSE;
|
||||
DriverPtr *xf86DriverList = NULL;
|
||||
int xf86NumDrivers = 0;
|
||||
diff --git a/hw/xfree86/common/xf86pciBus.c b/hw/xfree86/common/xf86pciBus.c
|
||||
index 8158c2b..9adfee5 100644
|
||||
--- a/hw/xfree86/common/xf86pciBus.c
|
||||
+++ b/hw/xfree86/common/xf86pciBus.c
|
||||
@@ -352,6 +352,10 @@ xf86ComparePciBusString(const char *busID, int bus, int device, int func)
|
||||
Bool
|
||||
xf86IsPrimaryPci(struct pci_device *pPci)
|
||||
{
|
||||
+ /* Add max. 1 screen for the IgnorePrimary fallback path */
|
||||
+ if (xf86ProbeIgnorePrimary && xf86NumScreens == 0)
|
||||
+ return TRUE;
|
||||
+
|
||||
if (primaryBus.type == BUS_PCI)
|
||||
return pPci == primaryBus.id.pci;
|
||||
#ifdef XSERVER_PLATFORM_BUS
|
||||
diff --git a/hw/xfree86/common/xf86platformBus.c b/hw/xfree86/common/xf86platformBus.c
|
||||
index 8dd0d5d..063e81c 100644
|
||||
--- a/hw/xfree86/common/xf86platformBus.c
|
||||
+++ b/hw/xfree86/common/xf86platformBus.c
|
||||
@@ -114,6 +114,10 @@ xf86_find_platform_device_by_devnum(int major, int minor)
|
||||
static Bool
|
||||
xf86IsPrimaryPlatform(struct xf86_platform_device *plat)
|
||||
{
|
||||
+ /* Add max. 1 screen for the IgnorePrimary fallback path */
|
||||
+ if (xf86ProbeIgnorePrimary && xf86NumScreens == 0)
|
||||
+ return TRUE;
|
||||
+
|
||||
if (primaryBus.type == BUS_PLATFORM)
|
||||
return plat == primaryBus.id.plat;
|
||||
#ifdef XSERVER_LIBPCIACCESS
|
||||
--
|
||||
2.9.3
|
||||
|
||||
From c57c1e53ea3d76ebba5b2a23b7260817d3e6b921 Mon Sep 17 00:00:00 2001
|
||||
From: Hans De Goede <hdegoede@redhat.com>
|
||||
Date: Mon, 12 Dec 2016 17:03:12 +0100
|
||||
Subject: [PATCH xserver 1/6] xfree86: Free devlist returned by xf86MatchDevice
|
||||
|
||||
xf86MatchDevice returns a dynamically allocated list of GDevPtr-s,
|
||||
free this when we're done with it.
|
||||
|
||||
Reviewed-by: Adam Jackson <ajax@redhat.com>
|
||||
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||
---
|
||||
hw/xfree86/common/xf86platformBus.c | 4 ++++
|
||||
1 file changed, 4 insertions(+)
|
||||
|
||||
diff --git a/hw/xfree86/common/xf86platformBus.c b/hw/xfree86/common/xf86platformBus.c
|
||||
index 063e81c..16d934f 100644
|
||||
--- a/hw/xfree86/common/xf86platformBus.c
|
||||
+++ b/hw/xfree86/common/xf86platformBus.c
|
||||
@@ -479,6 +479,8 @@ xf86platformProbeDev(DriverPtr drvp)
|
||||
isGPUDevice(devList[i]) ? PLATFORM_PROBE_GPU_SCREEN : 0);
|
||||
}
|
||||
|
||||
+ free(devList);
|
||||
+
|
||||
return foundScreen;
|
||||
}
|
||||
|
||||
@@ -505,6 +507,8 @@ xf86platformAddGPUDevices(DriverPtr drvp)
|
||||
}
|
||||
}
|
||||
|
||||
+ free(devList);
|
||||
+
|
||||
return foundScreen;
|
||||
}
|
||||
|
||||
--
|
||||
2.9.3
|
||||
|
||||
From 08b84d72878e43401e99059c3c926dfa42a360c3 Mon Sep 17 00:00:00 2001
|
||||
From: Hans De Goede <hdegoede@redhat.com>
|
||||
Date: Mon, 12 Dec 2016 17:03:13 +0100
|
||||
Subject: [PATCH xserver 2/6] xfree86: Make OutputClassMatches take a
|
||||
xf86_platform_device
|
||||
|
||||
Make OutputClassMatches directly take a xf86_platform_device as argument,
|
||||
rather then an index into xf86_platform_devices. This makes things
|
||||
easier for callers which already have a xf86_platform_device pointer.
|
||||
|
||||
Reviewed-by: Adam Jackson <ajax@redhat.com>
|
||||
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||
---
|
||||
hw/xfree86/common/xf86platformBus.c | 7 ++++---
|
||||
1 file changed, 4 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/hw/xfree86/common/xf86platformBus.c b/hw/xfree86/common/xf86platformBus.c
|
||||
index 16d934f..25a9040 100644
|
||||
--- a/hw/xfree86/common/xf86platformBus.c
|
||||
+++ b/hw/xfree86/common/xf86platformBus.c
|
||||
@@ -214,9 +214,10 @@ MatchToken(const char *value, struct xorg_list *patterns,
|
||||
}
|
||||
|
||||
static Bool
|
||||
-OutputClassMatches(const XF86ConfOutputClassPtr oclass, int index)
|
||||
+OutputClassMatches(const XF86ConfOutputClassPtr oclass,
|
||||
+ struct xf86_platform_device *dev)
|
||||
{
|
||||
- char *driver = xf86_platform_odev_attributes(index)->driver;
|
||||
+ char *driver = dev->attribs->driver;
|
||||
|
||||
if (!MatchToken(driver, &oclass->match_driver, strcmp))
|
||||
return FALSE;
|
||||
@@ -234,7 +235,7 @@ xf86OutputClassDriverList(int index, char *matches[], int nmatches)
|
||||
return 0;
|
||||
|
||||
for (cl = xf86configptr->conf_outputclass_lst; cl; cl = cl->list.next) {
|
||||
- if (OutputClassMatches(cl, index)) {
|
||||
+ if (OutputClassMatches(cl, &xf86_platform_devices[index])) {
|
||||
char *path = xf86_platform_odev_attributes(index)->path;
|
||||
|
||||
xf86Msg(X_INFO, "Applying OutputClass \"%s\" to %s\n",
|
||||
--
|
||||
2.9.3
|
||||
|
||||
From 9cd3cc75269d9196898487b5712ee47b8291e077 Mon Sep 17 00:00:00 2001
|
||||
From: Hans De Goede <hdegoede@redhat.com>
|
||||
Date: Mon, 12 Dec 2016 17:03:14 +0100
|
||||
Subject: [PATCH xserver 3/6] xfree86: Add options support for OutputClass
|
||||
Options
|
||||
|
||||
Add support for setting options in OutputClass Sections and having these
|
||||
applied to any matching output devices.
|
||||
|
||||
Reviewed-by: Adam Jackson <ajax@redhat.com>
|
||||
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||
---
|
||||
hw/xfree86/common/xf86Option.c | 5 ++++-
|
||||
hw/xfree86/common/xf86platformBus.c | 42 +++++++++++++++++++++++++++++++++++++
|
||||
hw/xfree86/common/xf86platformBus.h | 2 ++
|
||||
hw/xfree86/man/xorg.conf.man | 10 +++++++++
|
||||
hw/xfree86/parser/OutputClass.c | 6 ++++++
|
||||
hw/xfree86/parser/xf86Parser.h | 1 +
|
||||
6 files changed, 65 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/hw/xfree86/common/xf86Option.c b/hw/xfree86/common/xf86Option.c
|
||||
index 0e8bc1f..929724d 100644
|
||||
--- a/hw/xfree86/common/xf86Option.c
|
||||
+++ b/hw/xfree86/common/xf86Option.c
|
||||
@@ -44,6 +44,7 @@
|
||||
#include "xf86Xinput.h"
|
||||
#include "xf86Optrec.h"
|
||||
#include "xf86Parser.h"
|
||||
+#include "xf86platformBus.h" /* For OutputClass functions */
|
||||
#include "optionstr.h"
|
||||
|
||||
static Bool ParseOptionValue(int scrnIndex, XF86OptionPtr options,
|
||||
@@ -64,7 +65,7 @@ static Bool ParseOptionValue(int scrnIndex, XF86OptionPtr options,
|
||||
*
|
||||
* The order of precedence for options is:
|
||||
*
|
||||
- * extraOpts, display, confScreen, monitor, device
|
||||
+ * extraOpts, display, confScreen, monitor, device, outputClassOptions
|
||||
*/
|
||||
|
||||
void
|
||||
@@ -79,6 +80,8 @@ xf86CollectOptions(ScrnInfoPtr pScrn, XF86OptionPtr extraOpts)
|
||||
pScrn->options = NULL;
|
||||
|
||||
for (i = pScrn->numEntities - 1; i >= 0; i--) {
|
||||
+ xf86MergeOutputClassOptions(pScrn->entityList[i], &pScrn->options);
|
||||
+
|
||||
device = xf86GetDevFromEntity(pScrn->entityList[i],
|
||||
pScrn->entityInstanceList[i]);
|
||||
if (device && device->options) {
|
||||
diff --git a/hw/xfree86/common/xf86platformBus.c b/hw/xfree86/common/xf86platformBus.c
|
||||
index 25a9040..a698c6c 100644
|
||||
--- a/hw/xfree86/common/xf86platformBus.c
|
||||
+++ b/hw/xfree86/common/xf86platformBus.c
|
||||
@@ -310,6 +310,48 @@ xf86platformProbe(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
+void
|
||||
+xf86MergeOutputClassOptions(int entityIndex, void **options)
|
||||
+{
|
||||
+ const EntityPtr entity = xf86Entities[entityIndex];
|
||||
+ struct xf86_platform_device *dev = NULL;
|
||||
+ XF86ConfOutputClassPtr cl;
|
||||
+ XF86OptionPtr classopts;
|
||||
+ int i = 0;
|
||||
+
|
||||
+ switch (entity->bus.type) {
|
||||
+ case BUS_PLATFORM:
|
||||
+ dev = entity->bus.id.plat;
|
||||
+ break;
|
||||
+ case BUS_PCI:
|
||||
+ for (i = 0; i < xf86_num_platform_devices; i++) {
|
||||
+ if (MATCH_PCI_DEVICES(xf86_platform_devices[i].pdev,
|
||||
+ entity->bus.id.pci)) {
|
||||
+ dev = &xf86_platform_devices[i];
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+ break;
|
||||
+ default:
|
||||
+ xf86Msg(X_DEBUG, "xf86MergeOutputClassOptions unsupported bus type %d\n",
|
||||
+ entity->bus.type);
|
||||
+ }
|
||||
+
|
||||
+ if (!dev)
|
||||
+ return;
|
||||
+
|
||||
+ for (cl = xf86configptr->conf_outputclass_lst; cl; cl = cl->list.next) {
|
||||
+ if (!OutputClassMatches(cl, dev) || !cl->option_lst)
|
||||
+ continue;
|
||||
+
|
||||
+ xf86Msg(X_INFO, "Applying OutputClass \"%s\" options to %s\n",
|
||||
+ cl->identifier, dev->attribs->path);
|
||||
+
|
||||
+ classopts = xf86optionListDup(cl->option_lst);
|
||||
+ *options = xf86optionListMerge(*options, classopts);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
static int
|
||||
xf86ClaimPlatformSlot(struct xf86_platform_device * d, DriverPtr drvp,
|
||||
int chipset, GDevPtr dev, Bool active)
|
||||
diff --git a/hw/xfree86/common/xf86platformBus.h b/hw/xfree86/common/xf86platformBus.h
|
||||
index 0f5c0ef..70d9ec8 100644
|
||||
--- a/hw/xfree86/common/xf86platformBus.h
|
||||
+++ b/hw/xfree86/common/xf86platformBus.h
|
||||
@@ -42,6 +42,7 @@ struct xf86_platform_device {
|
||||
int xf86platformProbe(void);
|
||||
int xf86platformProbeDev(DriverPtr drvp);
|
||||
int xf86platformAddGPUDevices(DriverPtr drvp);
|
||||
+void xf86MergeOutputClassOptions(int entityIndex, void **options);
|
||||
|
||||
extern int xf86_num_platform_devices;
|
||||
extern struct xf86_platform_device *xf86_platform_devices;
|
||||
@@ -161,6 +162,7 @@ extern void xf86platformPrimary(void);
|
||||
#else
|
||||
|
||||
static inline int xf86platformAddGPUDevices(DriverPtr drvp) { return FALSE; }
|
||||
+static inline void xf86MergeOutputClassOptions(int index, void **options) {}
|
||||
|
||||
#endif
|
||||
|
||||
diff --git a/hw/xfree86/man/xorg.conf.man b/hw/xfree86/man/xorg.conf.man
|
||||
index 7d0c524..8928a53 100644
|
||||
--- a/hw/xfree86/man/xorg.conf.man
|
||||
+++ b/hw/xfree86/man/xorg.conf.man
|
||||
@@ -1280,6 +1280,16 @@ For example:
|
||||
Check the case-sensitive string
|
||||
.RI \*q matchdriver \*q
|
||||
against the kernel driver of the device.
|
||||
+.PP
|
||||
+When an output device has been matched to the
|
||||
+.B OutputClass
|
||||
+section, any
|
||||
+.B Option
|
||||
+entries are applied to the device. See the
|
||||
+.B Device
|
||||
+section below for a description of the remaining
|
||||
+.B Option
|
||||
+entries.
|
||||
.SH "DEVICE SECTION"
|
||||
The config file may have multiple
|
||||
.B Device
|
||||
diff --git a/hw/xfree86/parser/OutputClass.c b/hw/xfree86/parser/OutputClass.c
|
||||
index 8064e0c..f813ee6 100644
|
||||
--- a/hw/xfree86/parser/OutputClass.c
|
||||
+++ b/hw/xfree86/parser/OutputClass.c
|
||||
@@ -36,6 +36,7 @@ static const xf86ConfigSymTabRec OutputClassTab[] = {
|
||||
{ENDSECTION, "endsection"},
|
||||
{IDENTIFIER, "identifier"},
|
||||
{DRIVER, "driver"},
|
||||
+ {OPTION, "option"},
|
||||
{MATCH_DRIVER, "matchdriver"},
|
||||
{-1, ""},
|
||||
};
|
||||
@@ -60,6 +61,8 @@ xf86freeOutputClassList(XF86ConfOutputClassPtr ptr)
|
||||
free(group);
|
||||
}
|
||||
|
||||
+ xf86optionListFree(ptr->option_lst);
|
||||
+
|
||||
prev = ptr;
|
||||
ptr = ptr->list.next;
|
||||
free(prev);
|
||||
@@ -112,6 +115,9 @@ xf86parseOutputClassSection(void)
|
||||
else
|
||||
ptr->driver = xf86_lex_val.str;
|
||||
break;
|
||||
+ case OPTION:
|
||||
+ ptr->option_lst = xf86parseOption(ptr->option_lst);
|
||||
+ break;
|
||||
case MATCH_DRIVER:
|
||||
if (xf86getSubToken(&(ptr->comment)) != STRING)
|
||||
Error(QUOTE_MSG, "MatchDriver");
|
||||
diff --git a/hw/xfree86/parser/xf86Parser.h b/hw/xfree86/parser/xf86Parser.h
|
||||
index 9c4b403..897edab 100644
|
||||
--- a/hw/xfree86/parser/xf86Parser.h
|
||||
+++ b/hw/xfree86/parser/xf86Parser.h
|
||||
@@ -338,6 +338,7 @@ typedef struct {
|
||||
char *identifier;
|
||||
char *driver;
|
||||
struct xorg_list match_driver;
|
||||
+ XF86OptionPtr option_lst;
|
||||
char *comment;
|
||||
} XF86ConfOutputClassRec, *XF86ConfOutputClassPtr;
|
||||
|
||||
--
|
||||
2.9.3
|
||||
|
||||
From ab1a65b7755d081b41188104b21f4d21eaa3187b Mon Sep 17 00:00:00 2001
|
||||
From: Hans De Goede <hdegoede@redhat.com>
|
||||
Date: Mon, 12 Dec 2016 17:03:15 +0100
|
||||
Subject: [PATCH xserver 4/6] xfree86: xf86platformProbe: split finding
|
||||
pci-info and setting primary GPU
|
||||
|
||||
This is a preparation patch for allowing an OutputClass section to
|
||||
override the default primary GPU device selection.
|
||||
|
||||
Reviewed-by: Adam Jackson <ajax@redhat.com>
|
||||
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||
---
|
||||
hw/xfree86/common/xf86platformBus.c | 23 +++++++++++++++--------
|
||||
1 file changed, 15 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/hw/xfree86/common/xf86platformBus.c b/hw/xfree86/common/xf86platformBus.c
|
||||
index a698c6c..39b3248 100644
|
||||
--- a/hw/xfree86/common/xf86platformBus.c
|
||||
+++ b/hw/xfree86/common/xf86platformBus.c
|
||||
@@ -145,16 +145,9 @@ platform_find_pci_info(struct xf86_platform_device *pd, char *busid)
|
||||
|
||||
iter = pci_slot_match_iterator_create(&devmatch);
|
||||
info = pci_device_next(iter);
|
||||
- if (info) {
|
||||
+ if (info)
|
||||
pd->pdev = info;
|
||||
- pci_device_probe(info);
|
||||
- if (pci_device_is_boot_vga(info)) {
|
||||
- primaryBus.type = BUS_PLATFORM;
|
||||
- primaryBus.id.plat = pd;
|
||||
- }
|
||||
- }
|
||||
pci_iterator_destroy(iter);
|
||||
-
|
||||
}
|
||||
|
||||
static Bool
|
||||
@@ -307,6 +300,20 @@ xf86platformProbe(void)
|
||||
platform_find_pci_info(&xf86_platform_devices[i], busid);
|
||||
}
|
||||
}
|
||||
+
|
||||
+ for (i = 0; i < xf86_num_platform_devices; i++) {
|
||||
+ struct xf86_platform_device *dev = &xf86_platform_devices[i];
|
||||
+
|
||||
+ if (!dev->pdev)
|
||||
+ continue;
|
||||
+
|
||||
+ pci_device_probe(dev->pdev);
|
||||
+ if (pci_device_is_boot_vga(dev->pdev)) {
|
||||
+ primaryBus.type = BUS_PLATFORM;
|
||||
+ primaryBus.id.plat = dev;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
|
||||
--
|
||||
2.9.3
|
||||
|
||||
From d75ffcdbf8c1e3c8e0d46debcd533a9f2560f0a8 Mon Sep 17 00:00:00 2001
|
||||
From: Hans De Goede <hdegoede@redhat.com>
|
||||
Date: Mon, 12 Dec 2016 17:03:16 +0100
|
||||
Subject: [PATCH xserver 5/6] xfree86: Allow overriding primary GPU detection
|
||||
from an OutputClass section
|
||||
|
||||
Allow using:
|
||||
|
||||
Option "PrimaryGPU" "yes"
|
||||
|
||||
In an OutputClass section to override the default primary GPU device
|
||||
selection which selects the GPU used as output by the firmware.
|
||||
|
||||
If multiple output devices match an OutputClass section with
|
||||
the PrimaryGPU option set, the first one enumerated becomes the
|
||||
primary GPU.
|
||||
|
||||
Reviewed-by: Adam Jackson <ajax@redhat.com>
|
||||
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||
---
|
||||
hw/xfree86/common/xf86platformBus.c | 19 +++++++++++++++++++
|
||||
hw/xfree86/man/xorg.conf.man | 12 +++++++++++-
|
||||
2 files changed, 30 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/hw/xfree86/common/xf86platformBus.c b/hw/xfree86/common/xf86platformBus.c
|
||||
index 39b3248..fc17d15 100644
|
||||
--- a/hw/xfree86/common/xf86platformBus.c
|
||||
+++ b/hw/xfree86/common/xf86platformBus.c
|
||||
@@ -286,6 +286,7 @@ xf86platformProbe(void)
|
||||
{
|
||||
int i;
|
||||
Bool pci = TRUE;
|
||||
+ XF86ConfOutputClassPtr cl;
|
||||
|
||||
config_odev_probe(xf86PlatformDeviceProbe);
|
||||
|
||||
@@ -301,6 +302,24 @@ xf86platformProbe(void)
|
||||
}
|
||||
}
|
||||
|
||||
+ /* First see if there is an OutputClass match marking a device as primary */
|
||||
+ for (i = 0; i < xf86_num_platform_devices; i++) {
|
||||
+ struct xf86_platform_device *dev = &xf86_platform_devices[i];
|
||||
+ for (cl = xf86configptr->conf_outputclass_lst; cl; cl = cl->list.next) {
|
||||
+ if (!OutputClassMatches(cl, dev))
|
||||
+ continue;
|
||||
+
|
||||
+ if (xf86CheckBoolOption(cl->option_lst, "PrimaryGPU", FALSE)) {
|
||||
+ xf86Msg(X_CONFIG, "OutputClass \"%s\" setting %s as PrimaryGPU\n",
|
||||
+ cl->identifier, dev->attribs->path);
|
||||
+ primaryBus.type = BUS_PLATFORM;
|
||||
+ primaryBus.id.plat = dev;
|
||||
+ return 0;
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ /* Then check for pci_device_is_boot_vga() */
|
||||
for (i = 0; i < xf86_num_platform_devices; i++) {
|
||||
struct xf86_platform_device *dev = &xf86_platform_devices[i];
|
||||
|
||||
diff --git a/hw/xfree86/man/xorg.conf.man b/hw/xfree86/man/xorg.conf.man
|
||||
index 8928a53..79b71a8 100644
|
||||
--- a/hw/xfree86/man/xorg.conf.man
|
||||
+++ b/hw/xfree86/man/xorg.conf.man
|
||||
@@ -1285,11 +1285,21 @@ When an output device has been matched to the
|
||||
.B OutputClass
|
||||
section, any
|
||||
.B Option
|
||||
-entries are applied to the device. See the
|
||||
+entries are applied to the device. One
|
||||
+.B OutputClass
|
||||
+specific
|
||||
+.B Option
|
||||
+is recognized. See the
|
||||
.B Device
|
||||
section below for a description of the remaining
|
||||
.B Option
|
||||
entries.
|
||||
+.TP 7
|
||||
+.BI "Option \*qPrimaryGPU\*q \*q" boolean \*q
|
||||
+This option specifies that the matched device should be treated as the
|
||||
+primary GPU, replacing the selection of the GPU used as output by the
|
||||
+firmware. If multiple output devices match an OutputClass section with
|
||||
+the PrimaryGPU option set, the first one enumerated becomes the primary GPU.
|
||||
.SH "DEVICE SECTION"
|
||||
The config file may have multiple
|
||||
.B Device
|
||||
--
|
||||
2.9.3
|
||||
|
||||
From b5dffbbac193aa640ffcfa0a431c21b862854e53 Mon Sep 17 00:00:00 2001
|
||||
From: Hans De Goede <hdegoede@redhat.com>
|
||||
Date: Mon, 12 Dec 2016 17:03:17 +0100
|
||||
Subject: [PATCH xserver 6/6] xfree86: Add ModulePath support for OutputClass
|
||||
config Sections
|
||||
|
||||
Allow OutputClass config snippets to modify the module-path.
|
||||
|
||||
Note that any specified ModulePaths will be pre-pended to the normal
|
||||
ModulePath. The idea behind this is that any output hardware specific
|
||||
modules should have preference over the normal modules.
|
||||
|
||||
One use-case for this is the nvidia binary driver, this allows a
|
||||
config snippet like this:
|
||||
|
||||
Section "OutputClass"
|
||||
MatchDriver "nvidia"
|
||||
Modulepath "/usr/lib64/nvidia/modules"
|
||||
EndSection
|
||||
|
||||
To get the nvidia glx specific glx module loaded, but only when the
|
||||
nvidia kernel driver is loaded.
|
||||
|
||||
Together with the glvnd work done recently, this allows the nouveau
|
||||
+ mesa and nvidia-binary userspace stacks to co-exist on the same
|
||||
system without any ldconfig / xorg.conf tweaking and the xserver will
|
||||
automatically do the right thing depending on which kernel driver
|
||||
(nouveau or nvidia) is loaded.
|
||||
|
||||
Reviewed-by: Adam Jackson <ajax@redhat.com>
|
||||
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||
---
|
||||
hw/xfree86/common/xf86platformBus.c | 23 +++++++++++++++++++++++
|
||||
hw/xfree86/loader/loadmod.c | 1 +
|
||||
hw/xfree86/man/xorg.conf.man | 16 ++++++++++++++++
|
||||
hw/xfree86/parser/OutputClass.c | 15 +++++++++++++++
|
||||
hw/xfree86/parser/xf86Parser.h | 1 +
|
||||
5 files changed, 56 insertions(+)
|
||||
|
||||
diff --git a/hw/xfree86/common/xf86platformBus.c b/hw/xfree86/common/xf86platformBus.c
|
||||
index fc17d15..0b5795f 100644
|
||||
--- a/hw/xfree86/common/xf86platformBus.c
|
||||
+++ b/hw/xfree86/common/xf86platformBus.c
|
||||
@@ -40,6 +40,7 @@
|
||||
#include "hotplug.h"
|
||||
#include "systemd-logind.h"
|
||||
|
||||
+#include "loaderProcs.h"
|
||||
#include "xf86.h"
|
||||
#include "xf86_OSproc.h"
|
||||
#include "xf86Priv.h"
|
||||
@@ -287,6 +288,7 @@ xf86platformProbe(void)
|
||||
int i;
|
||||
Bool pci = TRUE;
|
||||
XF86ConfOutputClassPtr cl;
|
||||
+ char *old_path, *path = NULL;
|
||||
|
||||
config_odev_probe(xf86PlatformDeviceProbe);
|
||||
|
||||
@@ -300,8 +302,29 @@ xf86platformProbe(void)
|
||||
if (pci && (strncmp(busid, "pci:", 4) == 0)) {
|
||||
platform_find_pci_info(&xf86_platform_devices[i], busid);
|
||||
}
|
||||
+
|
||||
+ /*
|
||||
+ * Deal with OutputClass ModulePath directives, these must be
|
||||
+ * processed before we do any module loading.
|
||||
+ */
|
||||
+ for (cl = xf86configptr->conf_outputclass_lst; cl; cl = cl->list.next) {
|
||||
+ if (!OutputClassMatches(cl, &xf86_platform_devices[i]))
|
||||
+ continue;
|
||||
+
|
||||
+ if (cl->modulepath && xf86ModPathFrom != X_CMDLINE) {
|
||||
+ old_path = path;
|
||||
+ XNFasprintf(&path, "%s,%s", cl->modulepath,
|
||||
+ path ? path : xf86ModulePath);
|
||||
+ free(old_path);
|
||||
+ xf86Msg(X_CONFIG, "OutputClass \"%s\" ModulePath extended to \"%s\"\n",
|
||||
+ cl->identifier, path);
|
||||
+ LoaderSetPath(path);
|
||||
+ }
|
||||
+ }
|
||||
}
|
||||
|
||||
+ free(path);
|
||||
+
|
||||
/* First see if there is an OutputClass match marking a device as primary */
|
||||
for (i = 0; i < xf86_num_platform_devices; i++) {
|
||||
struct xf86_platform_device *dev = &xf86_platform_devices[i];
|
||||
diff --git a/hw/xfree86/loader/loadmod.c b/hw/xfree86/loader/loadmod.c
|
||||
index 8bf6836..940f5fc 100644
|
||||
--- a/hw/xfree86/loader/loadmod.c
|
||||
+++ b/hw/xfree86/loader/loadmod.c
|
||||
@@ -184,6 +184,7 @@ LoaderSetPath(const char *path)
|
||||
if (!path)
|
||||
return;
|
||||
|
||||
+ FreeStringList(defaultPathList);
|
||||
defaultPathList = InitPathList(path);
|
||||
}
|
||||
|
||||
diff --git a/hw/xfree86/man/xorg.conf.man b/hw/xfree86/man/xorg.conf.man
|
||||
index 79b71a8..00ebf56 100644
|
||||
--- a/hw/xfree86/man/xorg.conf.man
|
||||
+++ b/hw/xfree86/man/xorg.conf.man
|
||||
@@ -1300,6 +1300,22 @@ This option specifies that the matched device should be treated as the
|
||||
primary GPU, replacing the selection of the GPU used as output by the
|
||||
firmware. If multiple output devices match an OutputClass section with
|
||||
the PrimaryGPU option set, the first one enumerated becomes the primary GPU.
|
||||
+.PP
|
||||
+A
|
||||
+.B OutputClass
|
||||
+Section may contain
|
||||
+.B ModulePath
|
||||
+entries. When an output device matches an
|
||||
+.B OutputClass
|
||||
+section, any
|
||||
+.B ModulePath
|
||||
+entries in that
|
||||
+.B OutputClass
|
||||
+are pre-pended to the search path for loadable Xorg server modules. See
|
||||
+.B ModulePath
|
||||
+in the
|
||||
+.B Files
|
||||
+section for more info.
|
||||
.SH "DEVICE SECTION"
|
||||
The config file may have multiple
|
||||
.B Device
|
||||
diff --git a/hw/xfree86/parser/OutputClass.c b/hw/xfree86/parser/OutputClass.c
|
||||
index f813ee6..01b348f 100644
|
||||
--- a/hw/xfree86/parser/OutputClass.c
|
||||
+++ b/hw/xfree86/parser/OutputClass.c
|
||||
@@ -36,6 +36,7 @@ static const xf86ConfigSymTabRec OutputClassTab[] = {
|
||||
{ENDSECTION, "endsection"},
|
||||
{IDENTIFIER, "identifier"},
|
||||
{DRIVER, "driver"},
|
||||
+ {MODULEPATH, "modulepath"},
|
||||
{OPTION, "option"},
|
||||
{MATCH_DRIVER, "matchdriver"},
|
||||
{-1, ""},
|
||||
@@ -53,6 +54,7 @@ xf86freeOutputClassList(XF86ConfOutputClassPtr ptr)
|
||||
TestFree(ptr->identifier);
|
||||
TestFree(ptr->comment);
|
||||
TestFree(ptr->driver);
|
||||
+ TestFree(ptr->modulepath);
|
||||
|
||||
xorg_list_for_each_entry_safe(group, next, &ptr->match_driver, entry) {
|
||||
xorg_list_del(&group->entry);
|
||||
@@ -115,6 +117,19 @@ xf86parseOutputClassSection(void)
|
||||
else
|
||||
ptr->driver = xf86_lex_val.str;
|
||||
break;
|
||||
+ case MODULEPATH:
|
||||
+ if (xf86getSubToken(&(ptr->comment)) != STRING)
|
||||
+ Error(QUOTE_MSG, "ModulePath");
|
||||
+ if (ptr->modulepath) {
|
||||
+ char *path;
|
||||
+ XNFasprintf(&path, "%s,%s", ptr->modulepath, xf86_lex_val.str);
|
||||
+ free(xf86_lex_val.str);
|
||||
+ free(ptr->modulepath);
|
||||
+ ptr->modulepath = path;
|
||||
+ } else {
|
||||
+ ptr->modulepath = xf86_lex_val.str;
|
||||
+ }
|
||||
+ break;
|
||||
case OPTION:
|
||||
ptr->option_lst = xf86parseOption(ptr->option_lst);
|
||||
break;
|
||||
diff --git a/hw/xfree86/parser/xf86Parser.h b/hw/xfree86/parser/xf86Parser.h
|
||||
index 897edab..e014048 100644
|
||||
--- a/hw/xfree86/parser/xf86Parser.h
|
||||
+++ b/hw/xfree86/parser/xf86Parser.h
|
||||
@@ -337,6 +337,7 @@ typedef struct {
|
||||
GenericListRec list;
|
||||
char *identifier;
|
||||
char *driver;
|
||||
+ char *modulepath;
|
||||
struct xorg_list match_driver;
|
||||
XF86OptionPtr option_lst;
|
||||
char *comment;
|
||||
--
|
||||
2.9.3
|
||||
|
||||
@@ -1,88 +0,0 @@
|
||||
Submitted By: Armin K. <krejzi at email dot com>
|
||||
Date: 2012-12-30
|
||||
Initial Package Version: 1.13.1
|
||||
Upstream Status: Not submitted.
|
||||
Origin: Upstream mailing list.
|
||||
Description: Adds PRIME support to Xorg Server to make GPU offloading work.
|
||||
|
||||
--- xorg-server.orig/hw/xfree86/common/xf86Init.c 2012-10-14 01:38:50.000000000 +0200
|
||||
+++ xorg-server/hw/xfree86/common/xf86Init.c 2012-12-01 19:51:53.249922134 +0100
|
||||
@@ -361,6 +361,16 @@
|
||||
return ret;
|
||||
}
|
||||
|
||||
+extern void xf86AutoConfigOutputDevice(ScrnInfoPtr pScrn, ScrnInfoPtr master);
|
||||
+static void
|
||||
+xf86AutoConfigOutputDevices(void)
|
||||
+{
|
||||
+ int i;
|
||||
+
|
||||
+ for (i = 0; i < xf86NumGPUScreens; i++)
|
||||
+ xf86AutoConfigOutputDevice(xf86GPUScreens[i], xf86Screens[0]);
|
||||
+}
|
||||
+
|
||||
static void
|
||||
InstallSignalHandlers(void)
|
||||
{
|
||||
@@ -927,6 +937,8 @@
|
||||
for (i = 0; i < xf86NumGPUScreens; i++)
|
||||
AttachUnboundGPU(xf86Screens[0]->pScreen, xf86GPUScreens[i]->pScreen);
|
||||
|
||||
+ xf86AutoConfigOutputDevices();
|
||||
+
|
||||
xf86VGAarbiterWrapFunctions();
|
||||
if (sigio_blocked)
|
||||
OsReleaseSIGIO();
|
||||
--- xorg-server.orig/hw/xfree86/common/xf86platformBus.c 2012-11-02 05:17:59.000000000 +0100
|
||||
+++ xorg-server/hw/xfree86/common/xf86platformBus.c 2012-12-01 19:51:53.249922134 +0100
|
||||
@@ -387,6 +387,8 @@
|
||||
return foundScreen;
|
||||
}
|
||||
|
||||
+extern void xf86AutoConfigOutputDevice(ScrnInfoPtr pScrn, ScrnInfoPtr master);
|
||||
+
|
||||
int
|
||||
xf86platformAddDevice(int index)
|
||||
{
|
||||
@@ -446,6 +448,7 @@
|
||||
|
||||
/* attach unbound to 0 protocol screen */
|
||||
AttachUnboundGPU(xf86Screens[0]->pScreen, xf86GPUScreens[i]->pScreen);
|
||||
+ xf86AutoConfigOutputDevice(xf86GPUScreens[i], xf86Screens[0]);
|
||||
|
||||
return 0;
|
||||
}
|
||||
--- xorg-server.orig/hw/xfree86/modes/xf86Crtc.c 2012-10-14 01:38:50.000000000 +0200
|
||||
+++ xorg-server/hw/xfree86/modes/xf86Crtc.c 2012-12-01 19:51:53.250922153 +0100
|
||||
@@ -3258,3 +3258,31 @@
|
||||
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);
|
||||
+
|
||||
+ if (!config || !slave_config)
|
||||
+ return;
|
||||
+
|
||||
+ master_provider = config->randr_provider;
|
||||
+
|
||||
+ if ((master->capabilities & RR_Capability_SinkOffload) &&
|
||||
+ pScrn->capabilities & RR_Capability_SourceOffload) {
|
||||
+ /* source offload */
|
||||
+
|
||||
+ DetachUnboundGPU(pScrn->pScreen);
|
||||
+ AttachOffloadGPU(master->pScreen, pScrn->pScreen);
|
||||
+ slave_config->randr_provider->offload_sink = master_provider;
|
||||
+ } else if ((master->capabilities & RR_Capability_SourceOutput) &&
|
||||
+ pScrn->capabilities & RR_Capability_SinkOutput) {
|
||||
+ /* sink offload */
|
||||
+ DetachUnboundGPU(pScrn->pScreen);
|
||||
+ AttachOutputGPU(master->pScreen, pScrn->pScreen);
|
||||
+ slave_config->randr_provider->output_source = master_provider;
|
||||
+ }
|
||||
+}
|
||||
@@ -1,186 +0,0 @@
|
||||
Submitted By: Ken Moffat <ken at linuxfromscratch dot org>
|
||||
Date: 2014-08-18
|
||||
Initial Package Version: 1.16.0
|
||||
Upstream Status: Applied
|
||||
Origin: Upstream
|
||||
Description: Fixes bug in glamor.
|
||||
|
||||
From 3c0431b8911241552a15a43e4279c50658b50a18 Mon Sep 17 00:00:00 2001
|
||||
From: Keith Packard <keithp@keithp.com>
|
||||
Date: Wed, 16 Jul 2014 16:03:23 -0700
|
||||
Subject: glamor: Fix temp picture coordinates in
|
||||
glamor_composite_clipped_region
|
||||
|
||||
To understand this patch, let's start at the protocol interface where
|
||||
the relationship between the coordinate spaces is documented:
|
||||
|
||||
static Bool
|
||||
_glamor_composite(CARD8 op,
|
||||
PicturePtr source,
|
||||
PicturePtr mask,
|
||||
PicturePtr dest,
|
||||
INT16 x_source,
|
||||
INT16 y_source,
|
||||
INT16 x_mask,
|
||||
INT16 y_mask,
|
||||
INT16 x_dest, INT16 y_dest,
|
||||
CARD16 width, CARD16 height, Bool fallback)
|
||||
|
||||
The coordinates are passed to this function directly off the wire and
|
||||
are all relative to their respective drawables. For Windows, this means
|
||||
that they are relative to the upper left corner of the window, in
|
||||
whatever pixmap that window is getting drawn to.
|
||||
|
||||
_glamor_composite calls miComputeCompositeRegion to construct a clipped
|
||||
region to actually render to. In reality, miComputeCompositeRegion clips
|
||||
only to the destination these days; source clip region based clipping
|
||||
would have to respect the transform, which isn't really possible. The
|
||||
returned region is relative to the screen in which dest lives; offset by
|
||||
dest->drawable.x and dest->drawable.y.
|
||||
|
||||
What is important to realize here is that, because of clipping, the
|
||||
composite region may not have the same position within the destination
|
||||
drawable as x_dest, y_dest. The protocol coordinates now exist solely to
|
||||
'pin' the three objects together.
|
||||
|
||||
extents->x1,y1 Screen origin of clipped operation
|
||||
width,height Extents of the clipped operation
|
||||
x_dest,y_dest Unclipped destination-relative operation coordinate
|
||||
x_source,y_source Unclipped source-relative operation coordinate
|
||||
x_mask,y_mask Unclipped mask-relative operation coordinate
|
||||
|
||||
One thing we want to know is what the offset is from the original
|
||||
operation origin to the clipped origin
|
||||
|
||||
Destination drawable relative coordinates of the clipped operation:
|
||||
|
||||
x_dest_clipped = extents->x1 - dest->drawable.x
|
||||
y_dest_clipped = extents->y1 - dest->drawable.y
|
||||
|
||||
Offset from the original operation origin:
|
||||
|
||||
x_off_clipped = x_dest_clipped - x_dest
|
||||
y_off_clipped = y_dest_clipped - y_dest
|
||||
|
||||
Source drawable relative coordinates of the clipped operation:
|
||||
|
||||
x_source_clipped = x_source + x_off_clipped;
|
||||
y_source_clipped = y_source + y_off_clipped;
|
||||
|
||||
Mask drawable relative coordinates of the clipped operation:
|
||||
|
||||
x_mask_clipped = x_source + x_off_clipped;
|
||||
y_mask_clipped = y_source + y_off_clipped;
|
||||
|
||||
This is where the original code fails -- it doesn't subtract the
|
||||
destination drawable location when computing the distance that the
|
||||
operation has been moved by clipping. Here's what it does when
|
||||
constructing a temporary source picture:
|
||||
|
||||
temp_src =
|
||||
glamor_convert_gradient_picture(screen, source,
|
||||
extent->x1 + x_source - x_dest,
|
||||
extent->y1 + y_source - y_dest,
|
||||
width, height);
|
||||
...
|
||||
x_temp_src = -extent->x1 + x_dest;
|
||||
y_temp_src = -extent->y1 + y_dest;
|
||||
|
||||
glamor_convert_gradient_picture needs source drawable relative
|
||||
coordinates, but that is not what it's getting; it's getting
|
||||
screen-relative coordinates for the destination, adjusted by the
|
||||
distance between the provided source and destination operation
|
||||
coordinates. We want x_source_clipped and y_source_clipped:
|
||||
|
||||
x_source_clipped = x_source + x_off_clipped
|
||||
= x_source + x_dest_clipped - x_dest
|
||||
= x_source + extents->x1 - dest->drawable.x - x_dest
|
||||
|
||||
x_temp_src/y_temp_src are supposed to be the coordinates of the original
|
||||
operation translated to the temporary picture:
|
||||
|
||||
x_temp_src = x_source - x_source_clipped;
|
||||
y_temp_src = y_source - y_source_clipped;
|
||||
|
||||
Note that x_source_clipped/y_source_clipped will never be less than
|
||||
x_source/y_source because all we're doing is clipping. This means that
|
||||
x_temp_src/y_temp_src will always be non-positive; the original source
|
||||
coordinate can never be strictly *inside* the temporary image or we
|
||||
could have made the temporary image smaller.
|
||||
|
||||
x_temp_src = x_source - x_source_clipped
|
||||
= x_source - (x_source + x_off_clipped)
|
||||
= -x_off_clipped
|
||||
= x_dest - x_dest_clipped
|
||||
= x_dest - (extents->x1 - dest->drawable.x)
|
||||
|
||||
Again, this is off by the destination origin within the screen
|
||||
coordinate space.
|
||||
|
||||
The code should look like:
|
||||
|
||||
temp_src =
|
||||
glamor_convert_gradient_picture(screen, source,
|
||||
extent->x1 + x_source - x_dest - dest->pDrawable->x,
|
||||
extent->y1 + y_source - y_dest - dest->pDrawable->y,
|
||||
width, height);
|
||||
|
||||
x_temp_src = -extent->x1 + x_dest + dest->pDrawable->x;
|
||||
y_temp_src = -extent->y1 + y_dest + dest->pDrawable->y;
|
||||
|
||||
Signed-off-by: Keith Packard <keithp@keithp.com>
|
||||
Reviewed-by: Markus Wick <markus@selfnet.de>
|
||||
(cherry picked from commit 55f5bfb578e934319d1308cbb56c900c5ac7cfa7)
|
||||
Signed-off-by: Julien Cristau <jcristau@debian.org>
|
||||
|
||||
diff --git a/glamor/glamor_render.c b/glamor/glamor_render.c
|
||||
index 14ab738..e5d5d2c 100644
|
||||
--- a/glamor/glamor_render.c
|
||||
+++ b/glamor/glamor_render.c
|
||||
@@ -1450,8 +1450,8 @@ glamor_composite_clipped_region(CARD8 op,
|
||||
|| source_pixmap->drawable.height != height)))) {
|
||||
temp_src =
|
||||
glamor_convert_gradient_picture(screen, source,
|
||||
- extent->x1 + x_source - x_dest,
|
||||
- extent->y1 + y_source - y_dest,
|
||||
+ extent->x1 + x_source - x_dest - dest->pDrawable->x,
|
||||
+ extent->y1 + y_source - y_dest - dest->pDrawable->y,
|
||||
width, height);
|
||||
if (!temp_src) {
|
||||
temp_src = source;
|
||||
@@ -1459,8 +1459,8 @@ glamor_composite_clipped_region(CARD8 op,
|
||||
}
|
||||
temp_src_priv =
|
||||
glamor_get_pixmap_private((PixmapPtr) (temp_src->pDrawable));
|
||||
- x_temp_src = -extent->x1 + x_dest;
|
||||
- y_temp_src = -extent->y1 + y_dest;
|
||||
+ x_temp_src = -extent->x1 + x_dest + dest->pDrawable->x;
|
||||
+ y_temp_src = -extent->y1 + y_dest + dest->pDrawable->y;
|
||||
}
|
||||
|
||||
if (mask
|
||||
@@ -1474,8 +1474,8 @@ glamor_composite_clipped_region(CARD8 op,
|
||||
* to do reduce one convertion. */
|
||||
temp_mask =
|
||||
glamor_convert_gradient_picture(screen, mask,
|
||||
- extent->x1 + x_mask - x_dest,
|
||||
- extent->y1 + y_mask - y_dest,
|
||||
+ extent->x1 + x_mask - x_dest - dest->pDrawable->x,
|
||||
+ extent->y1 + y_mask - y_dest - dest->pDrawable->y,
|
||||
width, height);
|
||||
if (!temp_mask) {
|
||||
temp_mask = mask;
|
||||
@@ -1483,8 +1483,8 @@ glamor_composite_clipped_region(CARD8 op,
|
||||
}
|
||||
temp_mask_priv =
|
||||
glamor_get_pixmap_private((PixmapPtr) (temp_mask->pDrawable));
|
||||
- x_temp_mask = -extent->x1 + x_dest;
|
||||
- y_temp_mask = -extent->y1 + y_dest;
|
||||
+ x_temp_mask = -extent->x1 + x_dest + dest->pDrawable->x;
|
||||
+ y_temp_mask = -extent->y1 + y_dest + dest->pDrawable->y;
|
||||
}
|
||||
/* Do two-pass PictOpOver componentAlpha, until we enable
|
||||
* dual source color blending.
|
||||
--
|
||||
cgit v0.10.2
|
||||
|
||||
@@ -1,92 +0,0 @@
|
||||
Submitted By: Armin K. <krejzi at email dot com>
|
||||
Date: 2012-12-30
|
||||
Initial Package Version: 1.13.1
|
||||
Upstream Status: Not submitted.
|
||||
Origin: Upstream mailing list.
|
||||
Description: Adds PRIME support to Xorg Server to make GPU offloading work.
|
||||
|
||||
--- a/hw/xfree86/common/xf86Init.c 2014-06-04 12:49:11.000000000 +0200
|
||||
+++ b/hw/xfree86/common/xf86Init.c 2014-06-04 14:00:29.539324458 +0200
|
||||
@@ -363,6 +363,16 @@
|
||||
return ret;
|
||||
}
|
||||
|
||||
+extern void xf86AutoConfigOutputDevice(ScrnInfoPtr pScrn, ScrnInfoPtr master);
|
||||
+static void
|
||||
+xf86AutoConfigOutputDevices(void)
|
||||
+{
|
||||
+ int i;
|
||||
+
|
||||
+ for (i = 0; i < xf86NumGPUScreens; i++)
|
||||
+ xf86AutoConfigOutputDevice(xf86GPUScreens[i], xf86Screens[0]);
|
||||
+}
|
||||
+
|
||||
static void
|
||||
InstallSignalHandlers(void)
|
||||
{
|
||||
@@ -952,6 +962,8 @@
|
||||
for (i = 0; i < xf86NumGPUScreens; i++)
|
||||
AttachUnboundGPU(xf86Screens[0]->pScreen, xf86GPUScreens[i]->pScreen);
|
||||
|
||||
+ xf86AutoConfigOutputDevices();
|
||||
+
|
||||
xf86VGAarbiterWrapFunctions();
|
||||
if (sigio_blocked)
|
||||
OsReleaseSIGIO();
|
||||
--- a/hw/xfree86/common/xf86platformBus.c 2014-06-04 12:49:11.000000000 +0200
|
||||
+++ b/hw/xfree86/common/xf86platformBus.c 2014-06-04 14:00:29.539324458 +0200
|
||||
@@ -426,6 +426,8 @@
|
||||
return foundScreen;
|
||||
}
|
||||
|
||||
+extern void xf86AutoConfigOutputDevice(ScrnInfoPtr pScrn, ScrnInfoPtr master);
|
||||
+
|
||||
int
|
||||
xf86platformAddDevice(int index)
|
||||
{
|
||||
@@ -494,6 +496,7 @@
|
||||
}
|
||||
/* attach unbound to 0 protocol screen */
|
||||
AttachUnboundGPU(xf86Screens[0]->pScreen, xf86GPUScreens[i]->pScreen);
|
||||
+ xf86AutoConfigOutputDevice(xf86GPUScreens[i], xf86Screens[0]);
|
||||
|
||||
RRResourcesChanged(xf86Screens[0]->pScreen);
|
||||
RRTellChanged(xf86Screens[0]->pScreen);
|
||||
--- a/hw/xfree86/modes/xf86Crtc.c 2014-06-04 12:49:11.000000000 +0200
|
||||
+++ b/hw/xfree86/modes/xf86Crtc.c 2014-06-04 14:00:29.540324474 +0200
|
||||
@@ -3387,3 +3387,35 @@
|
||||
crtc->x = crtc->y = 0;
|
||||
}
|
||||
}
|
||||
+
|
||||
+
|
||||
+void xf86AutoConfigOutputDevice(ScrnInfoPtr pScrn, ScrnInfoPtr master)
|
||||
+{
|
||||
+ RRProviderPtr master_provider;
|
||||
+ xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(master);
|
||||
+ xf86CrtcConfigPtr slave_config = XF86_CRTC_CONFIG_PTR(pScrn);
|
||||
+ Bool unbound = FALSE;
|
||||
+
|
||||
+ if (!config || !slave_config)
|
||||
+ return;
|
||||
+
|
||||
+ master_provider = config->randr_provider;
|
||||
+
|
||||
+ if ((master->capabilities & RR_Capability_SinkOffload) &&
|
||||
+ pScrn->capabilities & RR_Capability_SourceOffload) {
|
||||
+ /* source offload */
|
||||
+
|
||||
+ DetachUnboundGPU(pScrn->pScreen);
|
||||
+ unbound = TRUE;
|
||||
+ AttachOffloadGPU(master->pScreen, pScrn->pScreen);
|
||||
+ slave_config->randr_provider->offload_sink = master_provider;
|
||||
+ }
|
||||
+ if ((master->capabilities & RR_Capability_SourceOutput) &&
|
||||
+ pScrn->capabilities & RR_Capability_SinkOutput) {
|
||||
+ /* sink offload */
|
||||
+ if (!unbound)
|
||||
+ DetachUnboundGPU(pScrn->pScreen);
|
||||
+ AttachOutputGPU(master->pScreen, pScrn->pScreen);
|
||||
+ slave_config->randr_provider->output_source = master_provider;
|
||||
+ }
|
||||
+}
|
||||
@@ -1,92 +0,0 @@
|
||||
Submitted By: Armin K. <krejzi at email dot com>
|
||||
Date: 2012-12-30
|
||||
Initial Package Version: 1.13.1
|
||||
Upstream Status: Not submitted.
|
||||
Origin: Upstream mailing list.
|
||||
Description: Adds PRIME support to Xorg Server to make GPU offloading work.
|
||||
|
||||
--- a/hw/xfree86/common/xf86Init.c 2014-06-04 12:49:11.000000000 +0200
|
||||
+++ b/hw/xfree86/common/xf86Init.c 2014-06-04 14:00:29.539324458 +0200
|
||||
@@ -363,6 +363,16 @@
|
||||
return ret;
|
||||
}
|
||||
|
||||
+extern void xf86AutoConfigOutputDevice(ScrnInfoPtr pScrn, ScrnInfoPtr master);
|
||||
+static void
|
||||
+xf86AutoConfigOutputDevices(void)
|
||||
+{
|
||||
+ int i;
|
||||
+
|
||||
+ for (i = 0; i < xf86NumGPUScreens; i++)
|
||||
+ xf86AutoConfigOutputDevice(xf86GPUScreens[i], xf86Screens[0]);
|
||||
+}
|
||||
+
|
||||
static void
|
||||
InstallSignalHandlers(void)
|
||||
{
|
||||
@@ -952,6 +962,8 @@
|
||||
for (i = 0; i < xf86NumGPUScreens; i++)
|
||||
AttachUnboundGPU(xf86Screens[0]->pScreen, xf86GPUScreens[i]->pScreen);
|
||||
|
||||
+ xf86AutoConfigOutputDevices();
|
||||
+
|
||||
xf86VGAarbiterWrapFunctions();
|
||||
if (sigio_blocked)
|
||||
OsReleaseSIGIO();
|
||||
--- a/hw/xfree86/common/xf86platformBus.c 2014-06-04 12:49:11.000000000 +0200
|
||||
+++ b/hw/xfree86/common/xf86platformBus.c 2014-06-04 14:00:29.539324458 +0200
|
||||
@@ -426,6 +426,8 @@
|
||||
return foundScreen;
|
||||
}
|
||||
|
||||
+extern void xf86AutoConfigOutputDevice(ScrnInfoPtr pScrn, ScrnInfoPtr master);
|
||||
+
|
||||
int
|
||||
xf86platformAddDevice(int index)
|
||||
{
|
||||
@@ -494,6 +496,7 @@
|
||||
}
|
||||
/* attach unbound to 0 protocol screen */
|
||||
AttachUnboundGPU(xf86Screens[0]->pScreen, xf86GPUScreens[i]->pScreen);
|
||||
+ xf86AutoConfigOutputDevice(xf86GPUScreens[i], xf86Screens[0]);
|
||||
|
||||
RRResourcesChanged(xf86Screens[0]->pScreen);
|
||||
RRTellChanged(xf86Screens[0]->pScreen);
|
||||
--- a/hw/xfree86/modes/xf86Crtc.c 2014-06-04 12:49:11.000000000 +0200
|
||||
+++ b/hw/xfree86/modes/xf86Crtc.c 2014-06-04 14:00:29.540324474 +0200
|
||||
@@ -3387,3 +3387,35 @@
|
||||
crtc->x = crtc->y = 0;
|
||||
}
|
||||
}
|
||||
+
|
||||
+
|
||||
+void xf86AutoConfigOutputDevice(ScrnInfoPtr pScrn, ScrnInfoPtr master)
|
||||
+{
|
||||
+ RRProviderPtr master_provider;
|
||||
+ xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(master);
|
||||
+ xf86CrtcConfigPtr slave_config = XF86_CRTC_CONFIG_PTR(pScrn);
|
||||
+ Bool unbound = FALSE;
|
||||
+
|
||||
+ if (!config || !slave_config)
|
||||
+ return;
|
||||
+
|
||||
+ master_provider = config->randr_provider;
|
||||
+
|
||||
+ if ((master->capabilities & RR_Capability_SinkOffload) &&
|
||||
+ pScrn->capabilities & RR_Capability_SourceOffload) {
|
||||
+ /* source offload */
|
||||
+
|
||||
+ DetachUnboundGPU(pScrn->pScreen);
|
||||
+ unbound = TRUE;
|
||||
+ AttachOffloadGPU(master->pScreen, pScrn->pScreen);
|
||||
+ slave_config->randr_provider->offload_sink = master_provider;
|
||||
+ }
|
||||
+ if ((master->capabilities & RR_Capability_SourceOutput) &&
|
||||
+ pScrn->capabilities & RR_Capability_SinkOutput) {
|
||||
+ /* sink offload */
|
||||
+ if (!unbound)
|
||||
+ DetachUnboundGPU(pScrn->pScreen);
|
||||
+ AttachOutputGPU(master->pScreen, pScrn->pScreen);
|
||||
+ slave_config->randr_provider->output_source = master_provider;
|
||||
+ }
|
||||
+}
|
||||
@@ -1,36 +0,0 @@
|
||||
From 7d097c0c38ab82115a1e56489bfe09f9f01b24de Mon Sep 17 00:00:00 2001
|
||||
From: Mart Raudsepp <leio@gentoo.org>
|
||||
Date: Wed, 11 Oct 2017 16:11:49 +0300
|
||||
Subject: [PATCH] config/udev: Add sys/sysmacros.h include for major/minor
|
||||
functions for new glibc
|
||||
|
||||
Commits d732c36597fa and 84e3b96b5313 added the include to some files, but
|
||||
missed config/udev.c, where the major and minor functions are used as well.
|
||||
This should be Linux-only, so we don't need the sys/mkdev.h case here for
|
||||
Solaris.
|
||||
|
||||
Signed-off-by: Mart Raudsepp <leio@gentoo.org>
|
||||
---
|
||||
https://bugs.gentoo.org/633530
|
||||
https://patchwork.freedesktop.org/patch/181800/
|
||||
|
||||
config/udev.c | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
diff --git a/config/udev.c b/config/udev.c
|
||||
index 932f230..b3b8d0f 100644
|
||||
--- a/config/udev.c
|
||||
+++ b/config/udev.c
|
||||
@@ -30,6 +30,9 @@
|
||||
#include <libudev.h>
|
||||
#include <ctype.h>
|
||||
#include <unistd.h>
|
||||
+#ifdef HAVE_SYS_SYSMACROS_H
|
||||
+#include <sys/sysmacros.h>
|
||||
+#endif
|
||||
|
||||
#include "input.h"
|
||||
#include "inputstr.h"
|
||||
--
|
||||
2.10.2
|
||||
|
||||
@@ -67,6 +67,10 @@
|
||||
<Patches>
|
||||
<Patch level="1">xorg-server-1.12-unloadsubmodule.patch</Patch>
|
||||
<Patch level="1">xorg-server-1.18-support-multiple-Files-sections.patch</Patch>
|
||||
<Patch level="1">0001-xkb-fix-XkbSetMap-when-changing-a-keysym-without-cha.patch</Patch>
|
||||
<Patch level="1">0002-xephyr_Dont_check_for_SeatId_anymore.patch</Patch>
|
||||
<Patch level="1">0003-dix_Correctly_save_replayed_event_into_GrabInfoRec.patch</Patch>
|
||||
<Patch level="1">0004-present_Check_for_NULL_to_prevent_crash.patch</Patch>
|
||||
</Patches>
|
||||
</Source>
|
||||
|
||||
@@ -299,6 +303,13 @@
|
||||
</Package>
|
||||
|
||||
<History>
|
||||
<Update release="26">
|
||||
<Date>2022-05-23</Date>
|
||||
<Version>21.1.3</Version>
|
||||
<Comment>Rebuild.</Comment>
|
||||
<Name>Mustafa Cinasal</Name>
|
||||
<Email>muscnsl@gmail.com</Email>
|
||||
</Update>
|
||||
<Update release="25">
|
||||
<Date>2022-01-11</Date>
|
||||
<Version>21.1.3</Version>
|
||||
|
||||
Reference in New Issue
Block a user