Why does it help to allocate the sys_ptr up front, why does that avoid migration (i would except sys_ptr to be allocated when needed)?
Maarten. 2009/12/28 Michel Dänzer <[email protected]>: > From: Michel Dänzer <[email protected]> > > Signed-off-by: Michel Dänzer <[email protected]> > --- > exa/exa_accel.c | 4 ++++ > exa/exa_mixed.c | 18 +++++++++++++++++- > 2 files changed, 21 insertions(+), 1 deletions(-) > > diff --git a/exa/exa_accel.c b/exa/exa_accel.c > index 0f6e5f7..eea799e 100644 > --- a/exa/exa_accel.c > +++ b/exa/exa_accel.c > @@ -1043,6 +1043,7 @@ exaFillRegionSolid (DrawablePtr pDrawable, RegionPtr > pRegion, Pixel pixel, > pDrawable->width == 1 && pDrawable->height == 1 && > pDrawable->bitsPerPixel != 24) { > ExaPixmapPriv(pPixmap); > + RegionPtr pending_damage = > DamagePendingRegion(pExaPixmap->pDamage); > > switch (pDrawable->bitsPerPixel) { > case 32: > @@ -1057,6 +1058,9 @@ exaFillRegionSolid (DrawablePtr pDrawable, RegionPtr > pRegion, Pixel pixel, > > REGION_UNION(pScreen, &pExaPixmap->validSys, &pExaPixmap->validSys, > pRegion); > + REGION_UNION(pScreen, &pExaPixmap->validFB, &pExaPixmap->validFB, > + pRegion); > + REGION_SUBTRACT(pScreen, pending_damage, pending_damage, pRegion); > } > > ret = TRUE; > diff --git a/exa/exa_mixed.c b/exa/exa_mixed.c > index 155ed47..b262fc7 100644 > --- a/exa/exa_mixed.c > +++ b/exa/exa_mixed.c > @@ -94,9 +94,25 @@ exaCreatePixmap_mixed(ScreenPtr pScreen, int w, int h, int > depth, > if (!w || !h) { > exaCreateDriverPixmap_mixed(pPixmap); > pExaPixmap->use_gpu_copy = exaPixmapHasGpuCopy(pPixmap); > - } else > + } else { > pExaPixmap->use_gpu_copy = FALSE; > > + if (w == 1 && h == 1) { > + pExaPixmap->sys_ptr = malloc((pPixmap->drawable.bitsPerPixel + 7) > / 8); > + > + /* Set up damage tracking */ > + pExaPixmap->pDamage = DamageCreate(NULL, NULL, > + DamageReportNonEmpty, TRUE, > + pPixmap->drawable.pScreen, > + pPixmap); > + > + DamageRegister(&pPixmap->drawable, pExaPixmap->pDamage); > + /* This ensures that pending damage reflects the current > operation. */ > + /* This is used by exa to optimize migration. */ > + DamageSetReportAfterOp(pExaPixmap->pDamage, TRUE); > + } > + } > + > /* During a fallback we must prepare access. */ > if (pExaScr->fallback_counter) > exaPrepareAccess(&pPixmap->drawable, EXA_PREPARE_AUX_DEST); > -- > 1.6.5.7 > > _______________________________________________ > xorg-devel mailing list > [email protected] > http://lists.x.org/mailman/listinfo/xorg-devel > _______________________________________________ xorg-devel mailing list [email protected] http://lists.x.org/mailman/listinfo/xorg-devel
