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
|
||
|
|