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>
This commit is contained in:
parent
4f6e3b0f37
commit
13ac3deedb
|
@ -255,6 +255,15 @@ static void miSpriteSaveUnderCursor(DeviceIntPtr pDev,
|
||||||
static void miSpriteRestoreCursor(DeviceIntPtr pDev,
|
static void miSpriteRestoreCursor(DeviceIntPtr pDev,
|
||||||
ScreenPtr pScreen);
|
ScreenPtr pScreen);
|
||||||
|
|
||||||
|
static void
|
||||||
|
miSpriteRegisterBlockHandler(ScreenPtr pScreen, miSpriteScreenPtr pScreenPriv)
|
||||||
|
{
|
||||||
|
if (!pScreenPriv->BlockHandler) {
|
||||||
|
pScreenPriv->BlockHandler = pScreen->BlockHandler;
|
||||||
|
pScreen->BlockHandler = miSpriteBlockHandler;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
miSpriteReportDamage (DamagePtr pDamage, RegionPtr pRegion, void *closure)
|
miSpriteReportDamage (DamagePtr pDamage, RegionPtr pRegion, void *closure)
|
||||||
{
|
{
|
||||||
|
@ -332,7 +341,7 @@ miSpriteInitialize (ScreenPtr pScreen,
|
||||||
pScreenPriv->InstallColormap = pScreen->InstallColormap;
|
pScreenPriv->InstallColormap = pScreen->InstallColormap;
|
||||||
pScreenPriv->StoreColors = pScreen->StoreColors;
|
pScreenPriv->StoreColors = pScreen->StoreColors;
|
||||||
|
|
||||||
pScreenPriv->BlockHandler = pScreen->BlockHandler;
|
pScreenPriv->BlockHandler = NULL;
|
||||||
|
|
||||||
pScreenPriv->DeviceCursorInitialize = pScreen->DeviceCursorInitialize;
|
pScreenPriv->DeviceCursorInitialize = pScreen->DeviceCursorInitialize;
|
||||||
pScreenPriv->DeviceCursorCleanup = pScreen->DeviceCursorCleanup;
|
pScreenPriv->DeviceCursorCleanup = pScreen->DeviceCursorCleanup;
|
||||||
|
@ -359,8 +368,6 @@ miSpriteInitialize (ScreenPtr pScreen,
|
||||||
pScreen->InstallColormap = miSpriteInstallColormap;
|
pScreen->InstallColormap = miSpriteInstallColormap;
|
||||||
pScreen->StoreColors = miSpriteStoreColors;
|
pScreen->StoreColors = miSpriteStoreColors;
|
||||||
|
|
||||||
pScreen->BlockHandler = miSpriteBlockHandler;
|
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -382,7 +389,6 @@ miSpriteCloseScreen (int i, ScreenPtr pScreen)
|
||||||
pScreen->GetImage = pScreenPriv->GetImage;
|
pScreen->GetImage = pScreenPriv->GetImage;
|
||||||
pScreen->GetSpans = pScreenPriv->GetSpans;
|
pScreen->GetSpans = pScreenPriv->GetSpans;
|
||||||
pScreen->SourceValidate = pScreenPriv->SourceValidate;
|
pScreen->SourceValidate = pScreenPriv->SourceValidate;
|
||||||
pScreen->BlockHandler = pScreenPriv->BlockHandler;
|
|
||||||
pScreen->InstallColormap = pScreenPriv->InstallColormap;
|
pScreen->InstallColormap = pScreenPriv->InstallColormap;
|
||||||
pScreen->StoreColors = pScreenPriv->StoreColors;
|
pScreen->StoreColors = pScreenPriv->StoreColors;
|
||||||
|
|
||||||
|
@ -555,12 +561,7 @@ miSpriteBlockHandler (int i, pointer blockData, pointer pTimeout,
|
||||||
miSpriteScreenPtr pPriv = GetSpriteScreen(pScreen);
|
miSpriteScreenPtr pPriv = GetSpriteScreen(pScreen);
|
||||||
DeviceIntPtr pDev;
|
DeviceIntPtr pDev;
|
||||||
miCursorInfoPtr pCursorInfo;
|
miCursorInfoPtr pCursorInfo;
|
||||||
|
Bool WorkToDo = FALSE;
|
||||||
SCREEN_PROLOGUE(pPriv, pScreen, BlockHandler);
|
|
||||||
|
|
||||||
(*pScreen->BlockHandler) (i, blockData, pTimeout, pReadmask);
|
|
||||||
|
|
||||||
SCREEN_EPILOGUE(pPriv, pScreen, BlockHandler);
|
|
||||||
|
|
||||||
for(pDev = inputInfo.devices; pDev; pDev = pDev->next)
|
for(pDev = inputInfo.devices; pDev; pDev = pDev->next)
|
||||||
{
|
{
|
||||||
|
@ -587,9 +588,20 @@ miSpriteBlockHandler (int i, pointer blockData, pointer pTimeout,
|
||||||
{
|
{
|
||||||
SPRITE_DEBUG (("BlockHandler restore\n"));
|
SPRITE_DEBUG (("BlockHandler restore\n"));
|
||||||
miSpriteRestoreCursor (pDev, pScreen);
|
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
|
static void
|
||||||
|
@ -798,6 +810,8 @@ miSpriteSetCursor (DeviceIntPtr pDev, ScreenPtr pScreen,
|
||||||
if (!pPointer->shouldBeUp)
|
if (!pPointer->shouldBeUp)
|
||||||
pScreenPriv->numberOfCursors++;
|
pScreenPriv->numberOfCursors++;
|
||||||
pPointer->shouldBeUp = TRUE;
|
pPointer->shouldBeUp = TRUE;
|
||||||
|
if (!pPointer->isUp)
|
||||||
|
miSpriteRegisterBlockHandler(pScreen, pScreenPriv);
|
||||||
if (pPointer->x == x &&
|
if (pPointer->x == x &&
|
||||||
pPointer->y == y &&
|
pPointer->y == y &&
|
||||||
pPointer->pCursor == pCursor &&
|
pPointer->pCursor == pCursor &&
|
||||||
|
@ -898,6 +912,7 @@ miSpriteRemoveCursor (DeviceIntPtr pDev, ScreenPtr pScreen)
|
||||||
pCursorInfo = MISPRITE(pDev);
|
pCursorInfo = MISPRITE(pDev);
|
||||||
|
|
||||||
miSpriteIsDown(pCursorInfo);
|
miSpriteIsDown(pCursorInfo);
|
||||||
|
miSpriteRegisterBlockHandler(pScreen, pScreenPriv);
|
||||||
pCursorInfo->pCacheWin = NullWindow;
|
pCursorInfo->pCacheWin = NullWindow;
|
||||||
miSpriteDisableDamage(pScreen, pScreenPriv);
|
miSpriteDisableDamage(pScreen, pScreenPriv);
|
||||||
if (!miDCRestoreUnderCursor(pDev,
|
if (!miDCRestoreUnderCursor(pDev,
|
||||||
|
|
Loading…
Reference in New Issue