diff options
author | Russell King <rmk@arm.linux.org.uk> | 2013-12-23 15:34:21 +0000 |
---|---|---|
committer | Russell King <rmk@arm.linux.org.uk> | 2013-12-23 15:34:21 +0000 |
commit | 80993e4b85286124b14aa3aa6e2ac6c0e072720f (patch) | |
tree | 2622134a579d083d15a3dcfd38e9d2a7162f13be /src | |
parent | 1b06d676d07e8d4ab26ed0f0603f12bb3e7f3f52 (diff) |
Avoid bouncing pixmaps between GPU and CPU on ChangeWindowAttributes()
Avoid unnecessary bouncing of pixmaps between the GPU and CPU when
ChangeWindowAttributes() is called. We don't need to map this to
the CPU unless we're actually need to access the pixmap; merely
checking for the flags is insufficient.
Signed-off-by: Russell King <rmk@arm.linux.org.uk>
Diffstat (limited to 'src')
-rw-r--r-- | src/vivante_unaccel.c | 50 |
1 files changed, 29 insertions, 21 deletions
diff --git a/src/vivante_unaccel.c b/src/vivante_unaccel.c index c7de2bd..da96f8a 100644 --- a/src/vivante_unaccel.c +++ b/src/vivante_unaccel.c @@ -33,22 +33,6 @@ static void vivante_finish_gc(GCPtr pGC) vivante_finish_drawable(&pGC->stipple->drawable, ACCESS_RO); } -static void vivante_prepare_window(WindowPtr pWin) -{ - if (pWin->backgroundState == BackgroundPixmap) - vivante_prepare_drawable(&pWin->background.pixmap->drawable, ACCESS_RO); - if (!pWin->borderIsPixel) - vivante_prepare_drawable(&pWin->border.pixmap->drawable, ACCESS_RO); -} - -static void vivante_finish_window(WindowPtr pWin) -{ - if (!pWin->borderIsPixel) - vivante_finish_drawable(&pWin->border.pixmap->drawable, ACCESS_RO); - if (pWin->backgroundState == BackgroundPixmap) - vivante_finish_drawable(&pWin->background.pixmap->drawable, ACCESS_RO); -} - void vivante_unaccel_FillSpans(DrawablePtr pDrawable, GCPtr pGC, int nspans, DDXPointPtr ppt, int *pwidth, int fSorted) { @@ -204,13 +188,37 @@ void vivante_unaccel_GetImage(DrawablePtr pDrawable, int x, int y, vivante_finish_drawable(pDrawable, ACCESS_RO); } +static void vivante_unaccel_fixup_tile(DrawablePtr pDraw, PixmapPtr *ppPix) +{ + PixmapPtr pNew, pPixmap = *ppPix; + + if (pPixmap->drawable.bitsPerPixel != pDraw->bitsPerPixel) { + vivante_prepare_drawable(&pPixmap->drawable, ACCESS_RO); + pNew = fb24_32ReformatTile(pPixmap, pDraw->bitsPerPixel); + vivante_finish_drawable(&pPixmap->drawable, ACCESS_RO); + + pDraw->pScreen->DestroyPixmap(pPixmap); + *ppPix = pPixmap = pNew; + } + + if (FbEvenTile(pPixmap->drawable.width * pPixmap->drawable.bitsPerPixel)) { + vivante_prepare_drawable(&pPixmap->drawable, ACCESS_RW); + fbPadPixmap(pPixmap); + vivante_finish_drawable(&pPixmap->drawable, ACCESS_RW); + } +} + Bool vivante_unaccel_ChangeWindowAttributes(WindowPtr pWin, unsigned long mask) { - Bool ret; - vivante_prepare_window(pWin); - ret = fbChangeWindowAttributes(pWin, mask); - vivante_finish_window(pWin); - return ret; + if (mask & CWBackPixmap && pWin->backgroundState == BackgroundPixmap) + vivante_unaccel_fixup_tile(&pWin->drawable, + &pWin->background.pixmap); + + if (mask & CWBorderPixmap && !pWin->borderIsPixel) + vivante_unaccel_fixup_tile(&pWin->drawable, + &pWin->border.pixmap); + + return TRUE; } RegionPtr vivante_unaccel_BitmapToRegion(PixmapPtr pixmap) |