Michel Dänzer <[email protected]> writes: > From: Michel Dänzer <[email protected]> > > This reduces code duplication. > > One side effect of this change is that xf86_config->cursor will no longer > be updated for cursors which cannot use the HW cursor.
That means we'll be holding on to the last HW cursor in use on the screen 'forever'; not a big deal, but doesn't seem great. > Signed-off-by: Michel Dänzer <[email protected]> > --- > > The side effect might actually be a bugfix? Haven't noticed any actual > problems because of this though. The referencing counting was added to xf86Cursors.c (by me) back in 2007 to avoid having the cursor get freed at the wrong time. xf86_config->cursor is read in only two places: xf86_reload_cursors and xf86_set_cursor_colors. xf86_set_cursor_colors is only called from the ramdac cursor code, and is never called when a SW cursor is displayed. However, xf86_reload_cursors is currently called from drivers during modesetting, and so may well be called when a SW cursor is displayed. Reading the code, I can't see any reason we can't just use ScreenPriv->cursor instead of saving another reference in this code; any time we're using the HW cursor, that will be correct, and anytime we're not using the HW cursor, we won't be doing anything with it. This will let unused cursors get freed sooner, and eliminate this twisty bit of extra code here. This is untested, but 'should' work.
From da2e5c4f6e08b765a6a3e7337c0da8dd60b531e0 Mon Sep 17 00:00:00 2001 From: Keith Packard <[email protected]> Date: Thu, 24 Dec 2015 09:51:49 -0800 Subject: [PATCH xserver] xfree86/modes: Remove extra reference to current cursor Just use the cursor reference in the xf86CursorScreenRec that is managed in xf86Cursor.c Signed-off-by: Keith Packard <[email protected]> --- hw/xfree86/drivers/modesetting/drmmode_display.c | 3 +-- hw/xfree86/modes/xf86Crtc.h | 1 - hw/xfree86/modes/xf86Cursors.c | 20 +++----------------- hw/xfree86/ramdac/xf86Cursor.c | 9 +++++++++ hw/xfree86/ramdac/xf86Cursor.h | 1 + 5 files changed, 14 insertions(+), 20 deletions(-) diff --git a/hw/xfree86/drivers/modesetting/drmmode_display.c b/hw/xfree86/drivers/modesetting/drmmode_display.c index 0d34ca1..17bfa4f 100644 --- a/hw/xfree86/drivers/modesetting/drmmode_display.c +++ b/hw/xfree86/drivers/modesetting/drmmode_display.c @@ -496,8 +496,7 @@ drmmode_set_cursor(xf86CrtcPtr crtc) int ret; if (use_set_cursor2) { - xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(crtc->scrn); - CursorPtr cursor = xf86_config->cursor; + CursorPtr cursor = xf86CurrentCursor(crtc->scrn->pScreen); ret = drmModeSetCursor2(drmmode->fd, drmmode_crtc->mode_crtc->crtc_id, diff --git a/hw/xfree86/modes/xf86Crtc.h b/hw/xfree86/modes/xf86Crtc.h index 8b01608..69abc52 100644 --- a/hw/xfree86/modes/xf86Crtc.h +++ b/hw/xfree86/modes/xf86Crtc.h @@ -709,7 +709,6 @@ typedef struct _xf86CrtcConfig { /* Cursor information */ xf86CursorInfoPtr cursor_info; - CursorPtr cursor; CARD8 *cursor_image; Bool cursor_on; CARD32 cursor_fg, cursor_bg; diff --git a/hw/xfree86/modes/xf86Cursors.c b/hw/xfree86/modes/xf86Cursors.c index 321cde7..09dbecb 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) @@ -516,11 +516,6 @@ xf86_use_hw_cursor(ScreenPtr screen, CursorPtr cursor) xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn); xf86CursorInfoPtr cursor_info = xf86_config->cursor_info; - 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; @@ -535,11 +530,6 @@ xf86_use_hw_cursor_argb(ScreenPtr screen, CursorPtr cursor) xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn); xf86CursorInfoPtr cursor_info = xf86_config->cursor_info; - cursor = RefCursor(cursor); - if (xf86_config->cursor) - FreeCursor(xf86_config->cursor, None); - xf86_config->cursor = cursor; - /* Make sure ARGB support is available */ if ((cursor_info->Flags & HARDWARE_CURSOR_ARGB) == 0) return FALSE; @@ -633,7 +623,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); @@ -676,7 +665,8 @@ 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); @@ -711,8 +701,4 @@ 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; - } } diff --git a/hw/xfree86/ramdac/xf86Cursor.c b/hw/xfree86/ramdac/xf86Cursor.c index 2a54571..a354295 100644 --- a/hw/xfree86/ramdac/xf86Cursor.c +++ b/hw/xfree86/ramdac/xf86Cursor.c @@ -438,6 +438,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 8c98bb1..dd10c48 100644 --- a/hw/xfree86/ramdac/xf86Cursor.h +++ b/hw/xfree86/ramdac/xf86Cursor.h @@ -60,6 +60,7 @@ extern _X_EXPORT Bool xf86InitCursor(ScreenPtr pScreen, extern _X_EXPORT xf86CursorInfoPtr xf86CreateCursorInfoRec(void); extern _X_EXPORT void xf86DestroyCursorInfoRec(xf86CursorInfoPtr); 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.6.4
-- -keith
signature.asc
Description: PGP signature
_______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel
