Hello Michael,

On 04/06/2016 02:40 AM, Michael Thayer wrote:
On 04.04.2016 22:09, Michael Thayer wrote:
Hello,

Please excuse the top posting.  Tested this in a dual-head non-mirrored
virtual machine and hit the following problem: xf86CursorSetCursor() in
hw/xfree86/ramdac/xf86Cursor.c calls xf86SetCursor() which fails because
the cursor is not visible on one of the two screens, and falls back to
software cursor rendering as a result.  Perhaps xf86_crtc_show_cursor()
should return TRUE if crtc->cursor_shown is FALSE?

I'm afraid I will be away from the computer again for a few weeks, so it
will be a while before I can test again.

I would suggest changing this function as follows:

static Bool
xf86_crtc_show_cursor(xf86CrtcPtr crtc)
{
     if (!crtc->cursor_shown && crtc->cursor_in_range) {
         crtc->cursor_shown = TRUE;
         if (crtc->funcs->show_cursor_check) {
             return crtc->funcs->show_cursor_check(crtc);
         } else {
             crtc->funcs->show_cursor(crtc);
         }
     }
     return TRUE;
}

As mentioned previously, crtc->cursor_shown will be FALSE if the cursor
is hidden on a particular crtc, and that is not an error. Also,
xf86_crtc_show_cursor() is called from xf86_crtc_set_cursor_position()
without checking the return value, sometimes with cursor_shown FALSE
when the cursor moves from one screen to another, and if we keep
cursor_shown FALSE we will get a call to the kernel driver every time
the position changes.

Thanks for catching that! Indeed I clearly overlooked the multi-head case.

Your proposed function looks fine, but maybe cursor_shown should not be set to TRUE if show_cursor_check fails? How about the following:

static Bool
xf86_crtc_show_cursor(xf86CrtcPtr crtc)
{
    if (!crtc->cursor_in_range)
        return TRUE;

    if (!crtc->cursor_shown) {
        if (crtc->funcs->show_cursor_check) {
            crtc->cursor_shown = crtc->funcs->show_cursor_check(crtc);
        } else {
            crtc->funcs->show_cursor(crtc);
            crtc->cursor_shown = TRUE;
        }
    }

    return crtc->cursor_shown;
}

Basically we want to return TRUE if the cursor is not supposed to be visible on this CRTC, which is what the first two lines do.

However, I also just realised that modesetting still does not implement
load_cursor_argb_check() - I really don't know how I forgot that.
Perhaps just implementing that would solve your problem?

Ah, we discussed this in a previous email actually (see https://patchwork.freedesktop.org/patch/77422/ ). IIRC the problem with relying on load_cursor_argb_check() is that drmmode_show_cursor()'s errors are still not caught, which is ultimately what we need to do to fix this issue.

I will send a v3 with the fixed xf86_crtc_show_cursor() function - thanks again!

Alex.

_______________________________________________
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

Reply via email to