diff options
author | Pauli Nieminen <ext-pauli.nieminen@nokia.com> | 2010-12-30 19:19:40 +0200 |
---|---|---|
committer | Daniel Stone <daniel@fooishbar.org> | 2010-12-31 12:52:51 +0000 |
commit | 13ac3deedb532b39f41dcd45d70f9eb4a85c1f58 (patch) | |
tree | 289b27e48b42b92ef29486467a34ccbf82da8382 /mi | |
parent | 4f6e3b0f378d7306dbd8c00ef9a7df81e24e5769 (diff) |
mi: Only register sprite block handler when needed
miSpriteBlockHandler takes about 10us in arm each time BlockHandlers are
called. To eliminate that overhead from xserver side only register the
BlockHandler when there actually is any cursor down.
Signed-off-by: Pauli Nieminen <ext-pauli.nieminen@nokia.com>
Reviewed-by: Daniel Stone <daniel@fooishbar.org>
Diffstat (limited to 'mi')
-rw-r--r-- | mi/misprite.c | 35 |
1 files changed, 25 insertions, 10 deletions
diff --git a/mi/misprite.c b/mi/misprite.c index 1a76d2001..c25c093f2 100644 --- a/mi/misprite.c +++ b/mi/misprite.c @@ -256,6 +256,15 @@ static void miSpriteRestoreCursor(DeviceIntPtr pDev, ScreenPtr pScreen); static void +miSpriteRegisterBlockHandler(ScreenPtr pScreen, miSpriteScreenPtr pScreenPriv) +{ + if (!pScreenPriv->BlockHandler) { + pScreenPriv->BlockHandler = pScreen->BlockHandler; + pScreen->BlockHandler = miSpriteBlockHandler; + } +} + +static void miSpriteReportDamage (DamagePtr pDamage, RegionPtr pRegion, void *closure) { ScreenPtr pScreen = closure; @@ -332,7 +341,7 @@ miSpriteInitialize (ScreenPtr pScreen, pScreenPriv->InstallColormap = pScreen->InstallColormap; pScreenPriv->StoreColors = pScreen->StoreColors; - pScreenPriv->BlockHandler = pScreen->BlockHandler; + pScreenPriv->BlockHandler = NULL; pScreenPriv->DeviceCursorInitialize = pScreen->DeviceCursorInitialize; pScreenPriv->DeviceCursorCleanup = pScreen->DeviceCursorCleanup; @@ -359,8 +368,6 @@ miSpriteInitialize (ScreenPtr pScreen, pScreen->InstallColormap = miSpriteInstallColormap; pScreen->StoreColors = miSpriteStoreColors; - pScreen->BlockHandler = miSpriteBlockHandler; - return TRUE; } @@ -382,7 +389,6 @@ miSpriteCloseScreen (int i, ScreenPtr pScreen) pScreen->GetImage = pScreenPriv->GetImage; pScreen->GetSpans = pScreenPriv->GetSpans; pScreen->SourceValidate = pScreenPriv->SourceValidate; - pScreen->BlockHandler = pScreenPriv->BlockHandler; pScreen->InstallColormap = pScreenPriv->InstallColormap; pScreen->StoreColors = pScreenPriv->StoreColors; @@ -555,12 +561,7 @@ miSpriteBlockHandler (int i, pointer blockData, pointer pTimeout, miSpriteScreenPtr pPriv = GetSpriteScreen(pScreen); DeviceIntPtr pDev; miCursorInfoPtr pCursorInfo; - - SCREEN_PROLOGUE(pPriv, pScreen, BlockHandler); - - (*pScreen->BlockHandler) (i, blockData, pTimeout, pReadmask); - - SCREEN_EPILOGUE(pPriv, pScreen, BlockHandler); + Bool WorkToDo = FALSE; for(pDev = inputInfo.devices; pDev; pDev = pDev->next) { @@ -587,9 +588,20 @@ miSpriteBlockHandler (int i, pointer blockData, pointer pTimeout, { SPRITE_DEBUG (("BlockHandler restore\n")); miSpriteRestoreCursor (pDev, pScreen); + if (!pCursorInfo->isUp) + WorkToDo = TRUE; } } } + + SCREEN_PROLOGUE(pPriv, pScreen, BlockHandler); + + (*pScreen->BlockHandler) (i, blockData, pTimeout, pReadmask); + + if (WorkToDo) + SCREEN_EPILOGUE(pPriv, pScreen, BlockHandler); + else + pPriv->BlockHandler = NULL; } static void @@ -798,6 +810,8 @@ miSpriteSetCursor (DeviceIntPtr pDev, ScreenPtr pScreen, if (!pPointer->shouldBeUp) pScreenPriv->numberOfCursors++; pPointer->shouldBeUp = TRUE; + if (!pPointer->isUp) + miSpriteRegisterBlockHandler(pScreen, pScreenPriv); if (pPointer->x == x && pPointer->y == y && pPointer->pCursor == pCursor && @@ -898,6 +912,7 @@ miSpriteRemoveCursor (DeviceIntPtr pDev, ScreenPtr pScreen) pCursorInfo = MISPRITE(pDev); miSpriteIsDown(pCursorInfo); + miSpriteRegisterBlockHandler(pScreen, pScreenPriv); pCursorInfo->pCacheWin = NullWindow; miSpriteDisableDamage(pScreen, pScreenPriv); if (!miDCRestoreUnderCursor(pDev, |