[PATCH xserver] randr: rrCheckPixmapBounding should only increase screen size
Alex Goins
agoins at nvidia.com
Wed Aug 15 16:58:58 UTC 2018
Thanks, Keith and Michel!
Yes, I'll test and review the change, and help where necessary. Thanks for
pointing it out.
-Alex
On Wed, 15 Aug 2018, Michel Dänzer wrote:
> On 2018-08-14 10:05 PM, Alex Goins wrote:
> > The purpose of rrCheckPixmapBounding() is to make sure that the fb is large
> > enough to accommodate the region scanned out by a GPU screen. Currently, however,
> > it will actually shrink the fb if it's larger than it needs to be.
> >
> > This is a problem when combining PRIME output slaving with arbitrary transforms
> > with xrandr.
> >
> > Although arbitrary transforms are not supposed to constrain the size of the fb
> > (https://lists.freedesktop.org/archives/xorg-devel/2018-January/055563.html),
> > xrandr will use RRSetScreenSize to resize the desktop to accommodate scaling
> > transforms, e.g. scaling a 1920x1080 display to 3840x2160 will result in a
> > desktop size of 3840x2160.
> >
> > In the case of PRIME, rrCheckPixmapBounding() will be called after
> > RRSetScreenSize() and it will resize the fb back down to what it would be
> > without the scaling transform, e.g. 1920x1080. This represents divergence in
> > behavior between PRIME and non-PRIME outputs.
> >
> > I had originally made rrCheckPixmapBounding() account for arbitrary transforms,
> > but realized that the fb being large enough to accommodate arbitrary transforms
> > is not a hard requirement enforced in the server. Instead, this change simply
> > makes it so that rrCheckPixmapBounding() will only resize the fb to be larger
> > than it already is, preventing it from stepping on prior requests to increase
> > the size of the fb.
> >
> > Signed-off-by: Alex Goins <agoins at nvidia.com>
> > ---
> > randr/rrcrtc.c | 4 ++--
> > 1 file changed, 2 insertions(+), 2 deletions(-)
> >
> > diff --git a/randr/rrcrtc.c b/randr/rrcrtc.c
> > index 74dc5a2..cdc7bed 100644
> > --- a/randr/rrcrtc.c
> > +++ b/randr/rrcrtc.c
> > @@ -702,8 +702,8 @@ rrCheckPixmapBounding(ScreenPtr pScreen,
> > if (new_height < screen_pixmap->drawable.height)
> > new_height = screen_pixmap->drawable.height;
> >
> > - if (new_width == screen_pixmap->drawable.width &&
> > - new_height == screen_pixmap->drawable.height) {
> > + if (new_width <= screen_pixmap->drawable.width &&
> > + new_height <= screen_pixmap->drawable.height) {
> > } else {
> > pScrPriv->rrScreenSetSize(pScreen, new_width, new_height, 0, 0);
> > }
> >
>
> Reviewed-by: Michel Dänzer <michel.daenzer at amd.com>
>
>
> P.S. Can you review https://patchwork.freedesktop.org/patch/242720/ ,
> and maybe work with Jim to sort out any remaining issues? Some of the
> PRIME synchronization related code in the modesetting driver is relying
> on the peer screen using the modesetting driver as well.
>
> --
> Earthling Michel Dänzer | http://www.amd.com
> Libre software enthusiast | Mesa and X developer
>
More information about the xorg-devel
mailing list