Compare commits

...

2 Commits

Author SHA1 Message Date
Enrico Weigelt, metux IT consult ce2bcc0a4f miext: damage: tolerate NULL pointers in DamageScreenFuncsRec
For now that case doensn't practically happen yet - all fields are at
least assigned to some default/dummy function. But in the future, we
might wanna get rid of dummies.

From now on, video drivers are allowed to assign them to NULL, if they
don't wanna have the default implementations and nothing happening
at all instead (no more need for having their own empty dummies)

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-07-04 18:40:29 +02:00
Enrico Weigelt, metux IT consult 83a28d5af2 miext: damage: document DamageScreenFuncsRec
This struct (and associated functions) needs to be part of public driver ABI,
so video drivers can get notifications on damage certain operations, but
there hasn't been any documentation on it.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
2025-07-04 18:40:29 +02:00
2 changed files with 25 additions and 4 deletions

View File

@ -1714,7 +1714,8 @@ DamageCreate(DamageReportFunc damageReport,
pDamage->damageDestroy = damageDestroy;
pDamage->pScreen = pScreen;
(*pScrPriv->funcs.Create) (pDamage);
if (pScrPriv->funcs.Create)
pScrPriv->funcs.Create (pDamage);
return pDamage;
}
@ -1755,7 +1756,8 @@ DamageRegister(DrawablePtr pDrawable, DamagePtr pDamage)
pDamage->isWindow = FALSE;
pDamage->pDrawable = pDrawable;
damageInsertDamage(getDrawableDamageRef(pDrawable), pDamage);
(*pScrPriv->funcs.Register) (pDrawable, pDamage);
if (pScrPriv->funcs.Register)
pScrPriv->funcs.Register (pDrawable, pDamage);
}
void
@ -1774,7 +1776,8 @@ DamageUnregister(DamagePtr pDamage)
damageScrPriv(pScreen);
(*pScrPriv->funcs.Unregister) (pDrawable, pDamage);
if (pScrPriv->funcs.Unregister)
pScrPriv->funcs.Unregister (pDrawable, pDamage);
if (pDrawable->type == DRAWABLE_WINDOW) {
WindowPtr pWindow = (WindowPtr) pDrawable;
@ -1817,7 +1820,10 @@ DamageDestroy(DamagePtr pDamage)
if (pDamage->damageDestroy)
(*pDamage->damageDestroy) (pDamage, pDamage->closure);
(*pScrPriv->funcs.Destroy) (pDamage);
if (pScrPriv->funcs.Destroy)
pScrPriv->funcs.Destroy (pDamage);
RegionUninit(&pDamage->damage);
RegionUninit(&pDamage->pendingDamage);
free(pDamage);

View File

@ -46,6 +46,21 @@ typedef void (*DamageScreenRegisterFunc) (DrawablePtr, DamagePtr);
typedef void (*DamageScreenUnregisterFunc) (DrawablePtr, DamagePtr);
typedef void (*DamageScreenDestroyFunc) (DamagePtr);
/* @public
*
* @brief Driver callbacks for getting notified on several damage calls
*
* The pointer to this struct can be obtained via DamageGetScreenFuncs().
* Drivers can inject themselves here, in order to get notified on
* DamageCreate(), DamageRegister(), DamageUnregister(), DamageDestroy().
*
* The fields may be assigned to NULL, if no action at all is wanted.
* (by default assigned to default implementations)
*
* This should ONLY be touched by video drivers, nobody else.
*
* So far the only one using it is the proprietary NVidia driver.
*/
typedef struct _damageScreenFuncs {
DamageScreenCreateFunc Create;
DamageScreenRegisterFunc Register;