bdf207e6f8
- xserver 1.19.0 - Fix use after free of cursors in Xwayland (rhbz#1385258) - Fix an issue where some monitors would show only black, or partially black when secondary GPU outputs are used
57 lines
2.2 KiB
Diff
57 lines
2.2 KiB
Diff
From 10f3c8d6eab0af074d0371152ada543e4dfe7369 Mon Sep 17 00:00:00 2001
|
|
From: Hans De Goede <hdegoede@redhat.com>
|
|
Date: Tue, 22 Nov 2016 15:28:51 +0100
|
|
Subject: [PATCH xserver 1/2] randr: rrCheckPixmapBounding: Do not substract
|
|
crtc non 0 x, y from screen size
|
|
|
|
The purpose of rrCheckPixmapBounding is to make sure that the
|
|
screen_pixmap is large enough for the slave-output which crtc is
|
|
being configured.
|
|
|
|
This should include crtc->x and crtc->y, otherwise the crtc might
|
|
still end up scanning out an area outside of the screen-pixmap.
|
|
|
|
For example: Take a laptop with an external monitor on a slave-output at
|
|
1920x1080+0+0 and its internal-screen at 3840x2160+1920+0 and in
|
|
gnome-settings-daemon move the external monitor to be on the ri ght of
|
|
the internal screen rather then on the left. First g-s-d will do a
|
|
RRSetScreenSize to 5760*2160 (which is a nop), then it calls RRSetCrtc
|
|
to move the slave output to 1920x1080+3840+0, since this is a slave
|
|
output, rrCheckPixmapBounding gets called, since the 2 crtcs now overlap
|
|
the code before this commit would shrinks the screen_pixmap to 3180*2160.
|
|
Then g-s-d calls RRSetCrtc to move the internal screen to 3180*2160+0+0.
|
|
|
|
And we end up with the slave-output configured to scan-out an area
|
|
which completely falls outside of the screen-pixmap (and end up with
|
|
a black display on the external monitor).
|
|
|
|
This commit fixes this by not substracting the x1 and y1 coordinates
|
|
of the union-ed region when determining the new screen_pixmap size.
|
|
|
|
Cc: Nikhil Mahale <nmahale@nvidia.com>
|
|
Cc: Dave Airlie <airlied@redhat.com>
|
|
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
|
Reviewed-by: Dave Airlie <airlied@redhat.com>
|
|
---
|
|
randr/rrcrtc.c | 4 ++--
|
|
1 file changed, 2 insertions(+), 2 deletions(-)
|
|
|
|
diff --git a/randr/rrcrtc.c b/randr/rrcrtc.c
|
|
index 5d404e8..ac853ea 100644
|
|
--- a/randr/rrcrtc.c
|
|
+++ b/randr/rrcrtc.c
|
|
@@ -686,8 +686,8 @@ rrCheckPixmapBounding(ScreenPtr pScreen,
|
|
}
|
|
|
|
newsize = RegionExtents(&total_region);
|
|
- new_width = newsize->x2 - newsize->x1;
|
|
- new_height = newsize->y2 - newsize->y1;
|
|
+ new_width = newsize->x2;
|
|
+ new_height = newsize->y2;
|
|
|
|
if (new_width == screen_pixmap->drawable.width &&
|
|
new_height == screen_pixmap->drawable.height) {
|
|
--
|
|
2.9.3
|
|
|