On 12/09/16 05:24 PM, Hans de Goede wrote: > On 12-09-16 09:47, Michel Dänzer wrote: >> On 09/09/16 09:50 PM, Hans De Goede wrote: >>> When a slave-output is rotated the transformation is done on the blit >>> from master to slave GPU, so crtc->transform_in_use is not set, but we >>> still need to adjust the mouse position for things to work. >>> >>> This commit modifies xf86_crtc_transform_cursor_position to not rely >>> on crtc->f_framebuffer_to_crtc, so that it can be used with GPU screens >>> to and always calls it for cursors on GPU screens. >>> >>> Note not using crtc->f_framebuffer_to_crtc means that crtc->transform >>> will not be taken into account, that is ok, because when we've a >>> transform >>> active hw-cursors are not used and xf86_crtc_transform_cursor_position >>> will never get called. >>> >>> Signed-off-by: Hans de Goede <hdego...@redhat.com> >>> --- >>> Changes in v8: >>> -Fix reflection on rotated outputs (use xf86_crtc_rotate_coord_back >>> again) >>> -Only call xf86_crtc_transform_cursor_position when rotating or >>> reflecting >>> (instead of always calling it for GPU screens) >> >> [...] >> >>> + rotation = crtc->rotation & 0xf; >>> + if (rotation == RR_Rotate_90 || rotation == RR_Rotate_270) { >>> + width = crtc->mode.VDisplay; >>> + height = crtc->mode.HDisplay; >>> + } else { >>> + width = crtc->mode.HDisplay; >>> + height = crtc->mode.VDisplay; >>> + } >> >> [...] >> >>> + xf86_crtc_rotate_coord_back(crtc->rotation, width, height, *x, >>> *y, x, y); >> >> Instead of this, how about something like: >> >> xf86_crtc_rotate_coord(RR_Reflect_X - (crtc->rotation & 0xf), >> width, height, *x, *y, x, y); >> >> Though frankly, either of those seem a little dirty, shoehorning >> xf86_crtc_rotate_coord(_back) into doing something they're not intended >> for. But between two evils, I'd choose the simpler one. :) >> >> The cleaner alternative would be not using xf86_crtc_rotate_coord(_back) >> but open-coding the correct logic, basically like in v7 but with the >> reflection handling moved after the rotation handling. > > Actually we need to swap width/height on rotation before doing: > > if (rotation & RR_Reflect_X) > x_dst = width - x_dst - 1; > if (rotation & RR_Reflect_Y) > y_dst = height - y_dst - 1; > > To get reflection working on rotated outputs!
I don't think so. Reflection is a transform in CRTC space, so it should work with the rotated coordinates and crtc->mode.HDisplay for width and crtc->mode.VDisplay for height. If you tried that and it didn't seem to work, please let me see that patch. -- Earthling Michel Dänzer | http://www.amd.com Libre software enthusiast | Mesa and X developer _______________________________________________ xorg-devel@lists.x.org: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: https://lists.x.org/mailman/listinfo/xorg-devel