[PATCH 1/2] Damage: Add wrappable hooks for damage create, destroy, register, & unregister.

Aaron Plattner aplattner at nvidia.com
Fri Jul 17 15:10:32 PDT 2009


---
 miext/damage/damage.c    |   61 ++++++++++++++++++++++++++++++++++++++++++++-
 miext/damage/damage.h    |   20 +++++++++++++++
 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 ade6735..2c78134 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 9ead925..067016f 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 559a136..812075a 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 {
-- 
1.6.0.4



More information about the xorg-devel mailing list