Michel Dänzer <[email protected]> writes: > Sounds good to me. > > One thing that might be nice to do as part of your patch would be moving > the xf86_config->cursor = NULL assignment from xf86_cursors_init to > xf86_hide_cursors. That way xf86_config->cursor would always be NULL > while the cursor layer isn't using the hardware cursor.
HideCursor gets called when setting the cursor image if HARDWARE_CURSOR_UPDATE_UNHIDDEN isn't set, which means we'd have to save the pointer in the LoadCursorImageCheck and LoadCursorARGBCheck functions. The LoadCursorImageCheck function doesn't get the CursorPtr. So, we need the xf86CurrentCursor function that I had written before.
From c133e4d9fac39862d7922f59080cc7ce40d1108b Mon Sep 17 00:00:00 2001 From: Keith Packard <[email protected]> Date: Wed, 9 Mar 2016 11:13:14 -0800 Subject: [PATCH xserver] xfree86: Set xf86CrtcConfigRec cursor pointer to NULL in HideCursor This makes the cursor pointer held by xf86Cursors.c get reset to NULL whenever the cursor isn't displayed, and means that the reference count held in xf86Cursor.c is sufficient to cover the reference in xf86Cursors.c. As HideCursor may be called in the cursor loading path after UseHWCursor or UseHWCursorARGB when HARDWARE_CURSOR_UPDATE_UNHIDDEN isn't set in the Flags field, the setting of the cursor pointer had to be moved to the LoadCursor paths. LoadCursorARGBCheck gets the cursor pointer, but LoadCursorImageCheck does not. For LoadCursorImageCheck, I added a new function, xf86CurrentCursor, which returns the current cursor. With this new function, we can eliminate the cursor pointer from the xf86CrtcConfigRec, once drivers are converted over to use it. Signed-off-by: Keith Packard <[email protected]> --- hw/xfree86/modes/xf86Cursors.c | 18 ++++++------------ hw/xfree86/ramdac/xf86Cursor.c | 9 +++++++++ hw/xfree86/ramdac/xf86Cursor.h | 1 + 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/hw/xfree86/modes/xf86Cursors.c b/hw/xfree86/modes/xf86Cursors.c index 5df1ab7..8f9d589 100644 --- a/hw/xfree86/modes/xf86Cursors.c +++ b/hw/xfree86/modes/xf86Cursors.c @@ -287,7 +287,7 @@ xf86_set_cursor_colors(ScrnInfoPtr scrn, int bg, int fg) { ScreenPtr screen = scrn->pScreen; xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn); - CursorPtr cursor = xf86_config->cursor; + CursorPtr cursor = xf86CurrentCursor(screen); int c; CARD8 *bits = cursor ? dixLookupScreenPrivate(&cursor->devPrivates, CursorScreenKey, screen) @@ -325,6 +325,7 @@ xf86_hide_cursors(ScrnInfoPtr scrn) int c; xf86_config->cursor_on = FALSE; + xf86_config->cursor = NULL; for (c = 0; c < xf86_config->num_crtc; c++) { xf86CrtcPtr crtc = xf86_config->crtc[c]; @@ -456,6 +457,7 @@ xf86_crtc_load_cursor_image(xf86CrtcPtr crtc, CARD8 *src) CARD8 *cursor_image; const Rotation rotation = xf86_crtc_cursor_rotation(crtc); + xf86_config->cursor = xf86CurrentCursor(xf86ScrnToScreen(scrn)); crtc->cursor_argb = FALSE; if (rotation == RR_Rotate_0) @@ -517,11 +519,6 @@ xf86_use_hw_cursor(ScreenPtr screen, CursorPtr cursor) xf86CursorInfoPtr cursor_info = xf86_config->cursor_info; int c; - cursor = RefCursor(cursor); - if (xf86_config->cursor) - FreeCursor(xf86_config->cursor, None); - xf86_config->cursor = cursor; - if (cursor->bits->width > cursor_info->MaxWidth || cursor->bits->height > cursor_info->MaxHeight) return FALSE; @@ -593,6 +590,7 @@ xf86_load_cursor_argb(ScrnInfoPtr scrn, CursorPtr cursor) xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn); int c; + xf86_config->cursor = cursor; for (c = 0; c < xf86_config->num_crtc; c++) { xf86CrtcPtr crtc = xf86_config->crtc[c]; @@ -638,7 +636,6 @@ xf86_cursors_init(ScreenPtr screen, int max_width, int max_height, int flags) cursor_info->LoadCursorARGBCheck = xf86_load_cursor_argb; } - xf86_config->cursor = NULL; xf86_hide_cursors(scrn); return xf86InitCursor(screen, cursor_info); @@ -681,7 +678,7 @@ xf86_reload_cursors(ScreenPtr screen) if (!cursor_info) return; - cursor = xf86_config->cursor; + cursor = xf86CurrentCursor(screen); GetSpritePosition(inputInfo.pointer, &x, &y); if (!(cursor_info->Flags & HARDWARE_CURSOR_UPDATE_UNHIDDEN)) (*cursor_info->HideCursor) (scrn); @@ -716,8 +713,5 @@ xf86_cursors_fini(ScreenPtr screen) } free(xf86_config->cursor_image); xf86_config->cursor_image = NULL; - if (xf86_config->cursor) { - FreeCursor(xf86_config->cursor, None); - xf86_config->cursor = NULL; - } + xf86_config->cursor = NULL; } diff --git a/hw/xfree86/ramdac/xf86Cursor.c b/hw/xfree86/ramdac/xf86Cursor.c index c061b80..dda4349 100644 --- a/hw/xfree86/ramdac/xf86Cursor.c +++ b/hw/xfree86/ramdac/xf86Cursor.c @@ -462,6 +462,15 @@ xf86ForceHWCursor(ScreenPtr pScreen, Bool on) } } +CursorPtr +xf86CurrentCursor(ScreenPtr pScreen) +{ + xf86CursorScreenPtr ScreenPriv = + (xf86CursorScreenPtr) dixLookupPrivate(&pScreen->devPrivates, + xf86CursorScreenKey); + return ScreenPriv->CurrentCursor; +} + xf86CursorInfoPtr xf86CreateCursorInfoRec(void) { diff --git a/hw/xfree86/ramdac/xf86Cursor.h b/hw/xfree86/ramdac/xf86Cursor.h index 6e88240..320ec0c 100644 --- a/hw/xfree86/ramdac/xf86Cursor.h +++ b/hw/xfree86/ramdac/xf86Cursor.h @@ -61,6 +61,7 @@ extern _X_EXPORT xf86CursorInfoPtr xf86CreateCursorInfoRec(void); extern _X_EXPORT void xf86DestroyCursorInfoRec(xf86CursorInfoPtr); extern _X_EXPORT void xf86CursorResetCursor(ScreenPtr pScreen); extern _X_EXPORT void xf86ForceHWCursor(ScreenPtr pScreen, Bool on); +extern _X_EXPORT CursorPtr xf86CurrentCursor(ScreenPtr pScreen); #define HARDWARE_CURSOR_INVERT_MASK 0x00000001 #define HARDWARE_CURSOR_AND_SOURCE_WITH_MASK 0x00000002 -- 2.7.0
-- -keith
signature.asc
Description: PGP signature
_______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: https://lists.x.org/mailman/listinfo/xorg-devel
