Damage: Add wrappable hooks for damage create, destroy, register, & unregister.

Signed-off-by: Aaron Plattner <aplattner@nvidia.com>
This commit is contained in:
Aaron Plattner 2009-07-17 15:10:32 -07:00
parent fb46474feb
commit c80ed4945e
3 changed files with 83 additions and 2 deletions

View File

@ -1855,6 +1855,25 @@ damageCloseScreen (int i, ScreenPtr pScreen)
return (*pScreen->CloseScreen) (i, pScreen); return (*pScreen->CloseScreen) (i, pScreen);
} }
/**
* Default implementations of the damage management functions.
*/
void miDamageCreate (DamagePtr pDamage)
{
}
void miDamageRegister (DrawablePtr pDrawable, DamagePtr pDamage)
{
}
void miDamageUnregister (DrawablePtr pDrawable, DamagePtr pDamage)
{
}
void miDamageDestroy (DamagePtr pDamage)
{
}
/** /**
* Public functions for consumption outside this file. * Public functions for consumption outside this file.
*/ */
@ -1866,6 +1885,9 @@ DamageSetup (ScreenPtr pScreen)
#ifdef RENDER #ifdef RENDER
PictureScreenPtr ps = GetPictureScreenIfSet(pScreen); PictureScreenPtr ps = GetPictureScreenIfSet(pScreen);
#endif #endif
const DamageScreenFuncsRec miFuncs = {
miDamageCreate, miDamageRegister, miDamageUnregister, miDamageDestroy
};
if (dixLookupPrivate(&pScreen->devPrivates, damageScrPrivateKey)) if (dixLookupPrivate(&pScreen->devPrivates, damageScrPrivateKey))
return TRUE; return TRUE;
@ -1894,6 +1916,8 @@ DamageSetup (ScreenPtr pScreen)
} }
#endif #endif
pScrPriv->funcs = miFuncs;
dixSetPrivate(&pScreen->devPrivates, damageScrPrivateKey, pScrPriv); dixSetPrivate(&pScreen->devPrivates, damageScrPrivateKey, pScrPriv);
return TRUE; return TRUE;
} }
@ -1906,6 +1930,7 @@ DamageCreate (DamageReportFunc damageReport,
ScreenPtr pScreen, ScreenPtr pScreen,
void *closure) void *closure)
{ {
damageScrPriv(pScreen);
DamagePtr pDamage; DamagePtr pDamage;
pDamage = xalloc (sizeof (DamageRec)); pDamage = xalloc (sizeof (DamageRec));
@ -1927,6 +1952,10 @@ DamageCreate (DamageReportFunc damageReport,
pDamage->damageReportPostRendering = NULL; pDamage->damageReportPostRendering = NULL;
pDamage->damageDestroy = damageDestroy; pDamage->damageDestroy = damageDestroy;
pDamage->damageMarker = NULL; pDamage->damageMarker = NULL;
pDamage->pScreen = pScreen;
(*pScrPriv->funcs.Create) (pDamage);
return pDamage; return pDamage;
} }
@ -1934,6 +1963,17 @@ void
DamageRegister (DrawablePtr pDrawable, DamageRegister (DrawablePtr pDrawable,
DamagePtr pDamage) DamagePtr pDamage)
{ {
ScreenPtr pScreen = pDrawable->pScreen;
damageScrPriv(pScreen);
#if DAMAGE_VALIDATE_ENABLE
if (pDrawable->pScreen != pDamage->pScreen)
{
ErrorF ("DamageRegister called with mismatched screens\n");
abort ();
}
#endif
if (pDrawable->type == DRAWABLE_WINDOW) if (pDrawable->type == DRAWABLE_WINDOW)
{ {
WindowPtr pWindow = (WindowPtr) pDrawable; WindowPtr pWindow = (WindowPtr) pDrawable;
@ -1956,6 +1996,7 @@ DamageRegister (DrawablePtr pDrawable,
pDamage->isWindow = FALSE; pDamage->isWindow = FALSE;
pDamage->pDrawable = pDrawable; pDamage->pDrawable = pDrawable;
damageInsertDamage (getDrawableDamageRef (pDrawable), pDamage); damageInsertDamage (getDrawableDamageRef (pDrawable), pDamage);
(*pScrPriv->funcs.Register) (pDrawable, pDamage);
} }
void void
@ -1970,6 +2011,11 @@ void
DamageUnregister (DrawablePtr pDrawable, DamageUnregister (DrawablePtr pDrawable,
DamagePtr pDamage) DamagePtr pDamage)
{ {
ScreenPtr pScreen = pDrawable->pScreen;
damageScrPriv(pScreen);
(*pScrPriv->funcs.Unregister) (pDrawable, pDamage);
if (pDrawable->type == DRAWABLE_WINDOW) if (pDrawable->type == DRAWABLE_WINDOW)
{ {
WindowPtr pWindow = (WindowPtr) pDrawable; WindowPtr pWindow = (WindowPtr) pDrawable;
@ -2004,10 +2050,14 @@ DamageUnregister (DrawablePtr pDrawable,
void void
DamageDestroy (DamagePtr pDamage) DamageDestroy (DamagePtr pDamage)
{ {
ScreenPtr pScreen = pDamage->pScreen;
damageScrPriv(pScreen);
if (pDamage->damageDestroy) if (pDamage->damageDestroy)
(*pDamage->damageDestroy) (pDamage, pDamage->closure); (*pDamage->damageDestroy) (pDamage, pDamage->closure);
REGION_UNINIT (pDamage->pDrawable->pScreen, &pDamage->damage); (*pScrPriv->funcs.Destroy) (pDamage);
REGION_UNINIT (pDamage->pDrawable->pScreen, &pDamage->pendingDamage); REGION_UNINIT (pScreen, &pDamage->damage);
REGION_UNINIT (pScreen, &pDamage->pendingDamage);
xfree (pDamage); xfree (pDamage);
} }
@ -2111,3 +2161,10 @@ DamageSetPostRenderingFunctions(DamagePtr pDamage, DamageReportFunc damageReport
pDamage->damageReportPostRendering = damageReportPostRendering; pDamage->damageReportPostRendering = damageReportPostRendering;
pDamage->damageMarker = damageMarker; pDamage->damageMarker = damageMarker;
} }
DamageScreenFuncsPtr
DamageGetScreenFuncs (ScreenPtr pScreen)
{
damageScrPriv(pScreen);
return &pScrPriv->funcs;
}

View File

@ -43,6 +43,23 @@ typedef void (*DamageDestroyFunc) (DamagePtr pDamage, void *closure);
/* At some point DamageRegionRendered() must be called. */ /* At some point DamageRegionRendered() must be called. */
typedef void (*DamageMarkerFunc) (DrawablePtr pDrawable, DamagePtr pDamage, RegionPtr pOldDamage, RegionPtr pRegion, void *closure); typedef void (*DamageMarkerFunc) (DrawablePtr pDrawable, DamagePtr pDamage, RegionPtr pOldDamage, RegionPtr pRegion, void *closure);
typedef void (*DamageScreenCreateFunc) (DamagePtr);
typedef void (*DamageScreenRegisterFunc) (DrawablePtr, DamagePtr);
typedef void (*DamageScreenUnregisterFunc) (DrawablePtr, DamagePtr);
typedef void (*DamageScreenDestroyFunc) (DamagePtr);
typedef struct _damageScreenFuncs {
DamageScreenCreateFunc Create;
DamageScreenRegisterFunc Register;
DamageScreenUnregisterFunc Unregister;
DamageScreenDestroyFunc Destroy;
} DamageScreenFuncsRec, *DamageScreenFuncsPtr;
extern _X_EXPORT void miDamageCreate (DamagePtr);
extern _X_EXPORT void miDamageRegister (DrawablePtr, DamagePtr);
extern _X_EXPORT void miDamageUnregister (DrawablePtr, DamagePtr);
extern _X_EXPORT void miDamageDestroy (DamagePtr);
extern _X_EXPORT Bool extern _X_EXPORT Bool
DamageSetup (ScreenPtr pScreen); DamageSetup (ScreenPtr pScreen);
@ -105,4 +122,7 @@ extern _X_EXPORT void
DamageSetPostRenderingFunctions(DamagePtr pDamage, DamageReportFunc damageReportPostRendering, DamageSetPostRenderingFunctions(DamagePtr pDamage, DamageReportFunc damageReportPostRendering,
DamageMarkerFunc damageMarker); DamageMarkerFunc damageMarker);
extern _X_EXPORT DamageScreenFuncsPtr
DamageGetScreenFuncs (ScreenPtr);
#endif /* _DAMAGE_H_ */ #endif /* _DAMAGE_H_ */

View File

@ -53,6 +53,7 @@ typedef struct _damage {
Bool reportAfter; Bool reportAfter;
RegionRec pendingDamage; /* will be flushed post submission at the latest */ RegionRec pendingDamage; /* will be flushed post submission at the latest */
RegionRec backupDamage; /* for use with damageMarker */ RegionRec backupDamage; /* for use with damageMarker */
ScreenPtr pScreen;
} DamageRec; } DamageRec;
typedef struct _damageScrPriv { typedef struct _damageScrPriv {
@ -75,6 +76,9 @@ typedef struct _damageScrPriv {
GlyphsProcPtr Glyphs; GlyphsProcPtr Glyphs;
AddTrapsProcPtr AddTraps; AddTrapsProcPtr AddTraps;
#endif #endif
/* Table of wrappable function pointers */
DamageScreenFuncsRec funcs;
} DamageScrPrivRec, *DamageScrPrivPtr; } DamageScrPrivRec, *DamageScrPrivPtr;
typedef struct _damageGCPriv { typedef struct _damageGCPriv {