[PATCH xserver] modesetting: always set a hardware cursor when requested to load one.
Hans de Goede
hdegoede at redhat.com
Tue Sep 27 10:06:01 UTC 2016
Hi,
On 23-09-16 10:20, Hans de Goede wrote:
> Hi All,
>
> On 09/16/2016 06:52 PM, Michael Thayer wrote:
>> When the X server asks us to load a hardware cursor, that request is always
>> followed up by a request to show it if we report success, or to hide it if
>> we report failure. Therefore it makes no sense to suppress the request if
>> the cursor is not currently visible.
>
> Ok, I've just spend the last half hour tracing (using grep) all callers of
> load_cursor_argb_check and you're right, either the cursor is already
> visible (XRecolorCursor does this), or it will get shown directly after
> the drmmode_load_cursor_argb_check() call.
And despite double checking I still missed a trouble-some scenario here.
If we've 2 monitors active, then as the cursor moves from one to
the other show()/hide() gets called on them.
If the cursor then changes load_cursor_argb_check() gets called on
all active crtc-s causing the cursor to now be shown on both monitors
at the same time, not good.
>
> So this patch is:
>
> Reviewed-by: Hans de Goede <hdegoede at redhat.com>
So I hereby withdraw my Reviewed-by, and have to NACK this in its
current form as it is causing regressions in multi-monitor
setups.
I'll send a v2 my pull-req with fixes for 1.19, dropping this one
and related follow-up patches.
Regards,
Hans
>>
>> Signed-off-by: Michael Thayer <michael.thayer at oracle.com>
>> ---
>> Tested that both hardware and software cursors still work after applying the
>> patch.
>>
>> hw/xfree86/drivers/modesetting/drmmode_display.c | 11 +----------
>> hw/xfree86/drivers/modesetting/drmmode_display.h | 2 --
>> 2 files changed, 1 insertion(+), 12 deletions(-)
>>
>> diff --git a/hw/xfree86/drivers/modesetting/drmmode_display.c b/hw/xfree86/drivers/modesetting/drmmode_display.c
>> index 41810d9..7d171a3 100644
>> --- a/hw/xfree86/drivers/modesetting/drmmode_display.c
>> +++ b/hw/xfree86/drivers/modesetting/drmmode_display.c
>> @@ -813,14 +813,7 @@ drmmode_load_cursor_argb_check(xf86CrtcPtr crtc, CARD32 *image)
>> for (i = 0; i < ms->cursor_width * ms->cursor_height; i++)
>> ptr[i] = image[i]; // cpu_to_le32(image[i]);
>>
>> - if (drmmode_crtc->cursor_up || !drmmode_crtc->first_cursor_load_done) {
>> - Bool ret = drmmode_set_cursor(crtc);
>> - if (!drmmode_crtc->cursor_up)
>> - drmmode_hide_cursor(crtc);
>> - drmmode_crtc->first_cursor_load_done = TRUE;
>> - return ret;
>> - }
>> - return TRUE;
>> + return drmmode_set_cursor(crtc);
>> }
>>
>> static void
>> @@ -830,7 +823,6 @@ drmmode_hide_cursor(xf86CrtcPtr crtc)
>> drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
>> drmmode_ptr drmmode = drmmode_crtc->drmmode;
>>
>> - drmmode_crtc->cursor_up = FALSE;
>> drmModeSetCursor(drmmode->fd, drmmode_crtc->mode_crtc->crtc_id, 0,
>> ms->cursor_width, ms->cursor_height);
>> }
>> @@ -839,7 +831,6 @@ static void
>> drmmode_show_cursor(xf86CrtcPtr crtc)
>> {
>> drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
>> - drmmode_crtc->cursor_up = TRUE;
>> drmmode_set_cursor(crtc);
>> }
>>
>> diff --git a/hw/xfree86/drivers/modesetting/drmmode_display.h b/hw/xfree86/drivers/modesetting/drmmode_display.h
>> index 50976b8..bd82968 100644
>> --- a/hw/xfree86/drivers/modesetting/drmmode_display.h
>> +++ b/hw/xfree86/drivers/modesetting/drmmode_display.h
>> @@ -91,9 +91,7 @@ typedef struct {
>> uint32_t vblank_pipe;
>> int dpms_mode;
>> struct dumb_bo *cursor_bo;
>> - Bool cursor_up;
>> Bool set_cursor2_failed;
>> - Bool first_cursor_load_done;
>> uint16_t lut_r[256], lut_g[256], lut_b[256];
>>
>> drmmode_bo rotate_bo;
>>
More information about the xorg-devel
mailing list