modesetting: [v2] Don't re-enable the cursor when loading the image
Hidden cursors also have their image updated; re-enabling the cursor each time the image is set will cause it to re-appear. * Unifies the code that was in drmmode_load_cursor_argb and drm_mode_show_cursor and moves it to a new drmmode_set_cursor * Add a new boolean, 'cursor_up', to the per-crtc private data to track whether the cursor should be displayed. * Call drmmode_set_cursor from drm_mode_show_cursor and, if the cursor should be displayed, from drm_mode_load_cursor_argb. v2: Call drmModeSetCursor2 when loading a new cursor image if the cursor should be displayed. Signed-off-by: Keith Packard <keithp@keithp.com> Reviewed-by: Michel Dänzer <michel.daenzer@amd.com>
This commit is contained in:
parent
0f5fdaf600
commit
5a541bd5e7
|
@ -394,60 +394,18 @@ drmmode_set_cursor_position(xf86CrtcPtr crtc, int x, int y)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
drmmode_load_cursor_argb(xf86CrtcPtr crtc, CARD32 *image)
|
drmmode_set_cursor(xf86CrtcPtr crtc)
|
||||||
{
|
{
|
||||||
modesettingPtr ms = modesettingPTR(crtc->scrn);
|
|
||||||
drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
|
|
||||||
int i;
|
|
||||||
uint32_t *ptr;
|
|
||||||
uint32_t handle = drmmode_crtc->cursor_bo->handle;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
/* cursor should be mapped already */
|
|
||||||
ptr = (uint32_t *) (drmmode_crtc->cursor_bo->ptr);
|
|
||||||
|
|
||||||
for (i = 0; i < ms->cursor_width * ms->cursor_height; i++)
|
|
||||||
ptr[i] = image[i]; // cpu_to_le32(image[i]);
|
|
||||||
|
|
||||||
ret =
|
|
||||||
drmModeSetCursor(drmmode_crtc->drmmode->fd,
|
|
||||||
drmmode_crtc->mode_crtc->crtc_id, handle,
|
|
||||||
ms->cursor_width, ms->cursor_height);
|
|
||||||
if (ret) {
|
|
||||||
xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(crtc->scrn);
|
|
||||||
xf86CursorInfoPtr cursor_info = xf86_config->cursor_info;
|
|
||||||
|
|
||||||
cursor_info->MaxWidth = cursor_info->MaxHeight = 0;
|
|
||||||
drmmode_crtc->drmmode->sw_cursor = TRUE;
|
|
||||||
/* fallback to swcursor */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
drmmode_hide_cursor(xf86CrtcPtr crtc)
|
|
||||||
{
|
|
||||||
modesettingPtr ms = modesettingPTR(crtc->scrn);
|
|
||||||
drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
|
|
||||||
drmmode_ptr drmmode = drmmode_crtc->drmmode;
|
|
||||||
|
|
||||||
drmModeSetCursor(drmmode->fd, drmmode_crtc->mode_crtc->crtc_id, 0,
|
|
||||||
ms->cursor_width, ms->cursor_height);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
drmmode_show_cursor(xf86CrtcPtr crtc)
|
|
||||||
{
|
|
||||||
modesettingPtr ms = modesettingPTR(crtc->scrn);
|
|
||||||
drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
|
drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
|
||||||
drmmode_ptr drmmode = drmmode_crtc->drmmode;
|
drmmode_ptr drmmode = drmmode_crtc->drmmode;
|
||||||
uint32_t handle = drmmode_crtc->cursor_bo->handle;
|
uint32_t handle = drmmode_crtc->cursor_bo->handle;
|
||||||
|
modesettingPtr ms = modesettingPTR(crtc->scrn);
|
||||||
static Bool use_set_cursor2 = TRUE;
|
static Bool use_set_cursor2 = TRUE;
|
||||||
|
int ret;
|
||||||
|
|
||||||
if (use_set_cursor2) {
|
if (use_set_cursor2) {
|
||||||
xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(crtc->scrn);
|
xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(crtc->scrn);
|
||||||
CursorPtr cursor = xf86_config->cursor;
|
CursorPtr cursor = xf86_config->cursor;
|
||||||
int ret;
|
|
||||||
|
|
||||||
ret =
|
ret =
|
||||||
drmModeSetCursor2(drmmode->fd, drmmode_crtc->mode_crtc->crtc_id,
|
drmModeSetCursor2(drmmode->fd, drmmode_crtc->mode_crtc->crtc_id,
|
||||||
|
@ -459,10 +417,57 @@ drmmode_show_cursor(xf86CrtcPtr crtc)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
drmModeSetCursor(drmmode->fd, drmmode_crtc->mode_crtc->crtc_id, handle,
|
ret = drmModeSetCursor(drmmode->fd, drmmode_crtc->mode_crtc->crtc_id, handle,
|
||||||
|
ms->cursor_width, ms->cursor_height);
|
||||||
|
|
||||||
|
if (ret) {
|
||||||
|
xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(crtc->scrn);
|
||||||
|
xf86CursorInfoPtr cursor_info = xf86_config->cursor_info;
|
||||||
|
|
||||||
|
cursor_info->MaxWidth = cursor_info->MaxHeight = 0;
|
||||||
|
drmmode_crtc->drmmode->sw_cursor = TRUE;
|
||||||
|
/* fallback to swcursor */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
drmmode_load_cursor_argb(xf86CrtcPtr crtc, CARD32 *image)
|
||||||
|
{
|
||||||
|
modesettingPtr ms = modesettingPTR(crtc->scrn);
|
||||||
|
drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
|
||||||
|
int i;
|
||||||
|
uint32_t *ptr;
|
||||||
|
|
||||||
|
/* cursor should be mapped already */
|
||||||
|
ptr = (uint32_t *) (drmmode_crtc->cursor_bo->ptr);
|
||||||
|
|
||||||
|
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_set_cursor(crtc);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
drmmode_hide_cursor(xf86CrtcPtr crtc)
|
||||||
|
{
|
||||||
|
modesettingPtr ms = modesettingPTR(crtc->scrn);
|
||||||
|
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);
|
ms->cursor_width, ms->cursor_height);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
drmmode_crtc_gamma_set(xf86CrtcPtr crtc, uint16_t * red, uint16_t * green,
|
drmmode_crtc_gamma_set(xf86CrtcPtr crtc, uint16_t * red, uint16_t * green,
|
||||||
uint16_t * blue, int size)
|
uint16_t * blue, int size)
|
||||||
|
|
|
@ -87,6 +87,7 @@ typedef struct {
|
||||||
drmModeCrtcPtr mode_crtc;
|
drmModeCrtcPtr mode_crtc;
|
||||||
uint32_t vblank_pipe;
|
uint32_t vblank_pipe;
|
||||||
struct dumb_bo *cursor_bo;
|
struct dumb_bo *cursor_bo;
|
||||||
|
Bool cursor_up;
|
||||||
unsigned rotate_fb_id;
|
unsigned rotate_fb_id;
|
||||||
uint16_t lut_r[256], lut_g[256], lut_b[256];
|
uint16_t lut_r[256], lut_g[256], lut_b[256];
|
||||||
DamagePtr slave_damage;
|
DamagePtr slave_damage;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user