Acked-by: Maarten Maathuis <[email protected]>
2009/12/8 Michel Dänzer <[email protected]>: > From: Michel Dänzer <[email protected]> > > * Better detection of dimension changes. > * Make sure to re-create the system memory copy when the pixmap dimensions > change (e.g. the screen pixmap on screen resize). > * Clear the valid regions. > > Signed-off-by: Michel Dänzer <[email protected]> > --- > exa/exa_mixed.c | 43 ++++++++++++++++++++++++++++++++++++++++--- > 1 files changed, 40 insertions(+), 3 deletions(-) > > diff --git a/exa/exa_mixed.c b/exa/exa_mixed.c > index 764c7dd..0fb644b 100644 > --- a/exa/exa_mixed.c > +++ b/exa/exa_mixed.c > @@ -135,17 +135,54 @@ exaModifyPixmapHeader_mixed(PixmapPtr pPixmap, int > width, int height, int depth, > pExaPixmap->score = EXA_PIXMAP_SCORE_PINNED; > } > > - if (pExaPixmap->driverPriv) { > - if (width > 0 && height > 0 && bitsPerPixel > 0) { > + has_gpu_copy = exaPixmapHasGpuCopy(pPixmap); > + > + if (width <= 0) > + width = pPixmap->drawable.width; > + > + if (height <= 0) > + height = pPixmap->drawable.height; > + > + if (bitsPerPixel <= 0) { > + if (depth <= 0) > + bitsPerPixel = pPixmap->drawable.bitsPerPixel; > + else > + bitsPerPixel = BitsPerPixel(depth); > + } > + > + if (depth <= 0) > + depth = pPixmap->drawable.depth; > + > + if (width != pPixmap->drawable.width || > + height != pPixmap->drawable.height || > + devKind != pPixmap->devKind || > + depth != pPixmap->drawable.depth || > + bitsPerPixel != pPixmap->drawable.bitsPerPixel) { > + if (pExaPixmap->driverPriv) { > exaSetFbPitch(pExaScr, pExaPixmap, > width, height, bitsPerPixel); > > exaSetAccelBlock(pExaScr, pExaPixmap, > width, height, bitsPerPixel); > + REGION_EMPTY(pScreen, &pExaPixmap->validFB); > } > + > + /* Need to re-create system copy if there's also a GPU copy */ > + if (has_gpu_copy && pExaPixmap->sys_ptr) { > + free(pExaPixmap->sys_ptr); > + pExaPixmap->sys_ptr = NULL; > + pExaPixmap->sys_pitch = devKind > 0 ? devKind : > + PixmapBytePad(width, depth); > + DamageUnregister(&pPixmap->drawable, pExaPixmap->pDamage); > + DamageDestroy(pExaPixmap->pDamage); > + pExaPixmap->pDamage = NULL; > + REGION_EMPTY(pScreen, &pExaPixmap->validSys); > + > + if (pExaScr->deferred_mixed_pixmap == pPixmap) > + pExaScr->deferred_mixed_pixmap = NULL; > + } > } > > - has_gpu_copy = exaPixmapHasGpuCopy(pPixmap); > if (has_gpu_copy) { > pPixmap->devPrivate.ptr = pExaPixmap->fb_ptr; > pPixmap->devKind = pExaPixmap->fb_pitch; > -- > 1.6.4.3 > > _______________________________________________ > 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
