drm/msm/mdp5: negative x/y in cursor move

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

modesetting X11 driver may provide negative x/y cordinates in mdp5_crtc_cursor_move(...) call when rotation is enabled.

Because of

static int mdp5_crtc_cursor_move(struct drm_crtc *crtc, int x, int y)
{
...
mdp5_crtc->cursor.x = x = max(x, 0);
mdp5_crtc->cursor.y = y = max(y, 0);
...
}

x/y is calmped to 0/0 in those cases resulting that the cursor does not move anymore beyond mdp5_crtc->cursor.width, mdp5_crtc->cursor.height.

For e.g rotation of 180 degree that means that the upper left cursor point stays never reaches the region (0/0) to  (mdp5_crtc->cursor.width/mdp5_crtc->cursor.height).

I already asked the X men if this should be fixed in modesetting driver or in the kernel CRT
functions:

https://www.spinics.net/lists/xorg/msg58969.html

They told me to fix this in the kernel.

So, I suppose:

1.) cursor x should be rather clamped instead to

static int mdp5_crtc_cursor_move(struct drm_crtc *crtc, int x, int y) { 
...
mdp5_crtc->cursor.x = x = max(x, -mdp5_crtc->cursor.width);
mdp5_crtc->cursor.y = y = max(y, -mdp5_crtc->cursor.height);
...
}

 2.) The ROI calculation must be extendet to:

static void get_roi(struct drm_crtc *crtc, uint32_t *roi_w, uint32_t *roi_h)
{
...
if (x>=0)
        *roi_w = min(mdp5_crtc->cursor.width, xres -
        mdp5_crtc->cursor.x);
else
        *roi_w = mdp5_crtc->cursor.width - abs(mdp5_crtc->cursor.x);
if (y>=0)
        *roi_h = min(mdp5_crtc->cursor.height, yres -
        mdp5_crtc->cursor.y);
else
        *roi_h = mdp5_crtc->cursor.height - abs(mdp5_crtc->cursor.y);
...
}

3.) There has to be some kind of hotspot setup in mdp5_crtc_restore_cursor(...)

Since I have no MDP5 documentation, I don't know how to setup the hotspot and I can't
implement 3.)

Please help!

Best regards
-Carsten
_______________________________________________
dri-devel mailing list
dri-devel@xxxxxxxxxxxxxxxxxxxxx
https://lists.freedesktop.org/mailman/listinfo/dri-devel

[Index of Archives]     [Linux DRI Users]     [Linux Intel Graphics]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux