diff options
author | Aaron Plattner <aplattner@nvidia.com> | 2009-07-17 15:10:32 -0700 |
---|---|---|
committer | Aaron Plattner <aplattner@nvidia.com> | 2009-07-24 13:11:43 -0700 |
commit | c80ed4945ef6dd50473fab871211b71b3d20dc3c (patch) | |
tree | a13966a5fbd4bf1ba0dd74adc231f5095bc3ba81 | |
parent | fb46474feb69d52d3dfdd61452ced5cfc38f6651 (diff) |
Damage: Add wrappable hooks for damage create, destroy, register, & unregister.
Signed-off-by: Aaron Plattner <aplattner@nvidia.com>
-rw-r--r-- | miext/damage/damage.c | 61 | ||||
-rw-r--r-- | miext/damage/damage.h | 20 | ||||
-rw-r--r-- | miext/damage/damagestr.h | 4 |
3 files changed, 83 insertions, 2 deletions
diff --git a/miext/damage/damage.c b/miext/damage/damage.c index ade67359a..2c7813492 100644 --- a/miext/damage/damage.c +++ b/miext/damage/damage.c @@ -1856,6 +1856,25 @@ damageCloseScreen (int i, ScreenPtr 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. */ @@ -1866,6 +1885,9 @@ DamageSetup (ScreenPtr pScreen) #ifdef RENDER PictureScreenPtr ps = GetPictureScreenIfSet(pScreen); #endif + const DamageScreenFuncsRec miFuncs = { + miDamageCreate, miDamageRegister, miDamageUnregister, miDamageDestroy + }; if (dixLookupPrivate(&pScreen->devPrivates, damageScrPrivateKey)) return TRUE; @@ -1894,6 +1916,8 @@ DamageSetup (ScreenPtr pScreen) } #endif + pScrPriv->funcs = miFuncs; + dixSetPrivate(&pScreen->devPrivates, damageScrPrivateKey, pScrPriv); return TRUE; } @@ -1906,6 +1930,7 @@ DamageCreate (DamageReportFunc damageReport, ScreenPtr pScreen, void *closure) { + damageScrPriv(pScreen); DamagePtr pDamage; pDamage = xalloc (sizeof (DamageRec)); @@ -1927,6 +1952,10 @@ DamageCreate (DamageReportFunc damageReport, pDamage->damageReportPostRendering = NULL; pDamage->damageDestroy = damageDestroy; pDamage->damageMarker = NULL; + pDamage->pScreen = pScreen; + + (*pScrPriv->funcs.Create) (pDamage); + return pDamage; } @@ -1934,6 +1963,17 @@ void DamageRegister (DrawablePtr pDrawable, 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) { WindowPtr pWindow = (WindowPtr) pDrawable; @@ -1956,6 +1996,7 @@ DamageRegister (DrawablePtr pDrawable, pDamage->isWindow = FALSE; pDamage->pDrawable = pDrawable; damageInsertDamage (getDrawableDamageRef (pDrawable), pDamage); + (*pScrPriv->funcs.Register) (pDrawable, pDamage); } void @@ -1970,6 +2011,11 @@ void DamageUnregister (DrawablePtr pDrawable, DamagePtr pDamage) { + ScreenPtr pScreen = pDrawable->pScreen; + damageScrPriv(pScreen); + + (*pScrPriv->funcs.Unregister) (pDrawable, pDamage); + if (pDrawable->type == DRAWABLE_WINDOW) { WindowPtr pWindow = (WindowPtr) pDrawable; @@ -2004,10 +2050,14 @@ DamageUnregister (DrawablePtr pDrawable, void DamageDestroy (DamagePtr pDamage) { + ScreenPtr pScreen = pDamage->pScreen; + damageScrPriv(pScreen); + if (pDamage->damageDestroy) (*pDamage->damageDestroy) (pDamage, pDamage->closure); - REGION_UNINIT (pDamage->pDrawable->pScreen, &pDamage->damage); - REGION_UNINIT (pDamage->pDrawable->pScreen, &pDamage->pendingDamage); + (*pScrPriv->funcs.Destroy) (pDamage); + REGION_UNINIT (pScreen, &pDamage->damage); + REGION_UNINIT (pScreen, &pDamage->pendingDamage); xfree (pDamage); } @@ -2111,3 +2161,10 @@ DamageSetPostRenderingFunctions(DamagePtr pDamage, DamageReportFunc damageReport pDamage->damageReportPostRendering = damageReportPostRendering; pDamage->damageMarker = damageMarker; } + +DamageScreenFuncsPtr +DamageGetScreenFuncs (ScreenPtr pScreen) +{ + damageScrPriv(pScreen); + return &pScrPriv->funcs; +} diff --git a/miext/damage/damage.h b/miext/damage/damage.h index 9ead92567..067016f38 100644 --- a/miext/damage/damage.h +++ b/miext/damage/damage.h @@ -43,6 +43,23 @@ typedef void (*DamageDestroyFunc) (DamagePtr pDamage, void *closure); /* At some point DamageRegionRendered() must be called. */ 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 DamageSetup (ScreenPtr pScreen); @@ -105,4 +122,7 @@ extern _X_EXPORT void DamageSetPostRenderingFunctions(DamagePtr pDamage, DamageReportFunc damageReportPostRendering, DamageMarkerFunc damageMarker); +extern _X_EXPORT DamageScreenFuncsPtr +DamageGetScreenFuncs (ScreenPtr); + #endif /* _DAMAGE_H_ */ diff --git a/miext/damage/damagestr.h b/miext/damage/damagestr.h index 559a13659..812075a15 100644 --- a/miext/damage/damagestr.h +++ b/miext/damage/damagestr.h @@ -53,6 +53,7 @@ typedef struct _damage { Bool reportAfter; RegionRec pendingDamage; /* will be flushed post submission at the latest */ RegionRec backupDamage; /* for use with damageMarker */ + ScreenPtr pScreen; } DamageRec; typedef struct _damageScrPriv { @@ -75,6 +76,9 @@ typedef struct _damageScrPriv { GlyphsProcPtr Glyphs; AddTrapsProcPtr AddTraps; #endif + + /* Table of wrappable function pointers */ + DamageScreenFuncsRec funcs; } DamageScrPrivRec, *DamageScrPrivPtr; typedef struct _damageGCPriv { |