summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam Jackson <ajax@redhat.com>2013-09-16 11:34:44 -0400
committerAdam Jackson <ajax@redhat.com>2013-09-27 12:32:10 -0400
commitc941aea23f78096a8837901fa494b88ea460311b (patch)
treee420aa0da1680dba31c028e034c120316df7b177
parent47b565f2d9d227635964114987fdad879571fab2 (diff)
damageext: Defer writing events until just before flushdamage-at-flush-globally
This was an experiment to see if the FlushCallback idea could work. Original commit message follows: For non-Xinerama this just (potentially) accumulates rects more aggressively, for example if your ddx uses the span routines then this will avoid double-reporting. For Xinerama we'll use this to accumulate damage across all screens and take the union at the end for the report, since we can't rely on rendering ops even hitting all screens let alone walking them in a consistent order. Signed-off-by: Adam Jackson <ajax@redhat.com>
-rw-r--r--damageext/damageext.c33
-rw-r--r--damageext/damageextint.h1
2 files changed, 26 insertions, 8 deletions
diff --git a/damageext/damageext.c b/damageext/damageext.c
index 0b26b7cfa..b2d00499c 100644
--- a/damageext/damageext.c
+++ b/damageext/damageext.c
@@ -52,7 +52,6 @@ static void
DamageExtNotify(DamageExtPtr pDamageExt, BoxPtr pBoxes, int nBoxes)
{
ClientPtr pClient = pDamageExt->pClient;
- DamageClientPtr pDamageClient = GetDamageClient(pClient);
DrawablePtr pDrawable = pDamageExt->pDrawable;
ScreenPtr pScreen = pDrawable->pScreen;
xDamageNotifyEvent ev;
@@ -96,17 +95,13 @@ DamageExtNotify(DamageExtPtr pDamageExt, BoxPtr pBoxes, int nBoxes)
ev.area.height = pDrawable->height;
WriteEventsToClient(pClient, 1, (xEvent *) &ev);
}
- /* Composite extension marks clients with manual Subwindows as critical */
- if (pDamageClient->critical > 0) {
- SetCriticalOutputPending();
- pClient->smart_priority = SMART_MAX_PRIORITY;
- }
}
static void
-DamageExtReport(DamagePtr pDamage, RegionPtr pRegion, void *closure)
+damageFlushCallback(CallbackListPtr *cbl, void *d, void *closure)
{
- DamageExtPtr pDamageExt = closure;
+ DamageExtPtr pDamageExt = d;
+ RegionPtr pRegion = DamageRegion(pDamageExt->pDamage);
switch (pDamageExt->level) {
case DamageReportRawRegion:
@@ -123,6 +118,27 @@ DamageExtReport(DamagePtr pDamage, RegionPtr pRegion, void *closure)
case DamageReportNone:
break;
}
+
+ DeleteCallback(&FlushCallback, damageFlushCallback, pDamageExt);
+ pDamageExt->callbackEnqueued = FALSE;
+}
+
+static void
+DamageExtReport(DamagePtr pDamage, RegionPtr pRegion, void *closure)
+{
+ DamageExtPtr pDamageExt = closure;
+ DamageClientPtr pDamageClient = GetDamageClient(pDamageExt->pClient);
+
+ if (!pDamageExt->callbackEnqueued) {
+ AddCallback(&FlushCallback, damageFlushCallback, pDamageExt);
+ pDamageExt->callbackEnqueued = TRUE;
+ }
+
+ /* Composite extension marks clients with manual Subwindows as critical */
+ if (pDamageClient->critical > 0) {
+ SetCriticalOutputPending();
+ pDamageExt->pClient->smart_priority = SMART_MAX_PRIORITY;
+ }
}
static void
@@ -234,6 +250,7 @@ ProcDamageCreate(ClientPtr client)
pDamageExt->pDrawable = pDrawable;
pDamageExt->level = level;
pDamageExt->pClient = client;
+ pDamageExt->callbackEnqueued = FALSE;
pDamageExt->pDamage = DamageCreate(DamageExtReport,
DamageExtDestroy,
level,
diff --git a/damageext/damageextint.h b/damageext/damageextint.h
index 272337922..1f0d0e1f5 100644
--- a/damageext/damageextint.h
+++ b/damageext/damageextint.h
@@ -55,6 +55,7 @@ typedef struct _DamageExt {
ClientPtr pClient;
XID id;
XID drawable;
+ Bool callbackEnqueued;
} DamageExtRec, *DamageExtPtr;
#define VERIFY_DAMAGEEXT(pDamageExt, rid, client, mode) { \