[PATCH v5 xserver 5/7] xf86Cursor: Fix xf86_crtc_rotate_coord_back using width/height wrongly

Hans de Goede hdegoede at redhat.com
Thu Sep 8 05:32:47 UTC 2016


Hi,

On 08-09-16 03:10, Michel Dänzer wrote:
> On 08/09/16 12:43 AM, Hans de Goede wrote:
>>
>> /*
>>  * Given a screen coordinate, rotate back to a cursor source coordinate
>>  */
>> xf86_crtc_rotate_coord(...)
>>
>> /*
>>  * Given a cursor source  coordinate, rotate to a screen coordinate
>>  */
>> xf86_crtc_rotate_coord_back(...)
>>
>> Looking at the comments, these 2 are meant to be each-others inverse
>> operation, so if I call them both succession I should get back the same
>> end result as before, but as explained in detail in my previous mail
>> for 90 / 270 degree rotation they are not each-others inverse, showing
>> that something is wrong.
>
> I've come to agree with that, but the problem you describe is actually
> in xf86_crtc_rotate_coord, not in xf86_crtc_rotate_coord_back. ASCII art
> time!
>
> First of all, I'm afraid xf86_crtc_rotate_coord(_back) talking about
> "screen coordinate" is a little confusing. They really convert between
> cursor space and CRTC space, not screen space (in the X screen sense).
> Cursor space and screen space always have the same orientation.
>
> +--------------------------- CRTC space x axis ------------------------+
> |                                                                      |
> | +- cursor space y axis -+                                            |
> | |                       |                                            |
> | c                       |
> | u                       |                                            C
> | r                       |                                            R
> | s                       |                                            T
> | o                       |                                            C
> | r                       |
> |                         |                                            s
> | s                       |                                            p
> | p                       |                                            a
> | a                       |                                            c
> | c                       |                                            e
> | e                       |
> |                         |                                            y
> | x                       |
> |                         |                                            a
> | a                       |                                            x
> | x                       |                                            i
> | i                       |                                            s
> | s                       |
> | |                       |                                            |
> | +-----------------------+                                            |
> |                                                                      |
> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> |                                                                      |
> +----------------------------------------------------------------------+
>
> Keep in mind that the width and height passed to both functions are in
> cursor space.
>
> When transforming from cursor space to CRTC space by 90/270 degrees, it
> becomes clear that the CRTC space x depends on the cursor space height,
> and the CRTC space y depends on the cursor space width, just as it's
> done in xf86_crtc_rotate_coord_back.
>
> However, for the reverse transform, the cursor space x depends on the
> cursor space width, and the cursor space y depends on the cursor space
> height, so xf86_crtc_rotate_coord has it backwards.
>
>
>>>>>> This was likely not noticed before since xf86_crtc_rotate_coord_back
>>>>>> until now was only used with cursor_info->MaxWidth and
>>>>>> cursor_info->MaxHeight, which are usally the same.
>>>>>
>>>>> I'd say it's kind of the other way around:
>>>>> xf86_crtc_transform_cursor_position just happens to still work with
>>>>> your
>>>>> change because usually cursor_info->MaxWidth ==
>>>>> cursor_info->MaxHeight .
>>>>
>>>> I could be wrong, but I don't think so, see above.
>>>
>>> My analysis stands.
>>
>> And I still believe your analysis is wrong.
>>
>>> You're trying to use xf86_crtc_rotate_coord_back for
>>> something else than what it's being used for now,
>>
>> xf86_crtc_rotate_coord_back() is described as "Given a cursor source
>> coordinate, rotate to a screen coordinate" which is exactly what we
>> need to properly position the cursor on a slave output, we start with
>> cursor coordinates and need to adjust those for the screen's rotation.
>
> No, transform_(gpu_)cursor_position[0] take screen space coordinates and
> transform them to CRTC space.

Ah, ok. I'm not all that familiar with this code, so I'm going to take your
word for this. I'll do a new patch fixing xf86_crtc_rotate_coord instead of
xf86_crtc_rotate_coord_back, and also fix patch 6/7 to do things differently.

> Which means that neither xf86_crtc_rotate_coord_back nor
> xf86_crtc_rotate_coord are a perfect fit for
> xf86_crtc_transform_gpu_cursor_position. The fixed
> xf86_crtc_rotate_coord might kind of work, but might require inverting
> the rotation sense.
>
>
> [0] BTW, do we really need two functions? The method used in
> xf86_crtc_transform_gpu_cursor_position should work for non-GPU screens
> as well, doesn't it?

That uses crtc->f_framebuffer_to_crtc which gets setup by xf86CrtcRotate(),
which at the very top has:

     if (pScreen->isGPU)
         return TRUE;

Which is why I went the route I went. I'll see if instead I can safely modify
xf86CrtcRotate() to still setup crtc->f_framebuffer_to_crtc, without
it having any side-effects.

Regards,

Hans


More information about the xorg-devel mailing list