diff options
author | Søren Sandmann Pedersen <ssp@redhat.com> | 2009-02-26 07:10:35 -0500 |
---|---|---|
committer | Søren Sandmann Pedersen <ssp@redhat.com> | 2009-02-26 07:10:35 -0500 |
commit | a40a14c1f2c56f7d9d014a5e310e976471ba8c20 (patch) | |
tree | f0124adaeb18a4f2c6a126afe2951ae27ac8f7b2 | |
parent | eb57c4f1968d08bc10320cf37394ff1a520f992d (diff) |
Accelerate window background painting
-rw-r--r-- | src/qxl.h | 2 | ||||
-rw-r--r-- | src/qxl_driver.c | 54 |
2 files changed, 56 insertions, 0 deletions
@@ -498,6 +498,8 @@ typedef struct _qxlScreen CreateScreenResourcesProcPtr CreateScreenResources; CloseScreenProcPtr CloseScreen; CreateGCProcPtr CreateGC; + PaintWindowProcPtr PaintWindowBackground; + PaintWindowProcPtr PaintWindowBorder; DamagePtr pDamage; RegionRec pendingCopy; diff --git a/src/qxl_driver.c b/src/qxl_driver.c index 204e3f4..641c52c 100644 --- a/src/qxl_driver.c +++ b/src/qxl_driver.c @@ -609,6 +609,55 @@ qxlPolyFillRect (DrawablePtr pDrawable, miPolyFillRect (pDrawable, pGC, nrect, prect); } +static void +qxlFillRegionSolid (DrawablePtr pDrawable, RegionPtr pRegion, Pixel pixel) +{ + ScreenPtr pScreen = pDrawable->pScreen; + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + qxlScreen *qxl = pScrn->driverPrivate; + + if (pDrawable->type == DRAWABLE_WINDOW) + { + int nbox = REGION_NUM_RECTS (pRegion); + BoxPtr pBox = REGION_RECTS (pRegion); + + while (nbox--) + { + struct qxl_rect qrect; + + qrect.left = pBox->x1; + qrect.right = pBox->x2; + qrect.top = pBox->y1; + qrect.bottom = pBox->y2; + + submit_random_fill (qxl, &qrect); + } + } + + fbFillRegionSolid (pDrawable, pRegion, 0, fbReplicatePixel (pixel, pDrawable->bitsPerPixel)); +} + +static void +qxlPaintWindow(WindowPtr pWin, RegionPtr pRegion, int what) +{ + ScreenPtr pScreen = pWin->drawable.pScreen; + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + qxlScreen *qxl = pScrn->driverPrivate; + + if (!REGION_NUM_RECTS(pRegion)) + return; + + if (what == PW_BACKGROUND && + pWin->backgroundState == BackgroundPixel) + { + qxlFillRegionSolid (&pWin->drawable, pRegion, pWin->background.pixel); + + REGION_EMPTY (pScreen, &qxl->pendingCopy); + } + + miPaintWindow (pWin, pRegion, what); +} + #if 0 static void qxlPaintWindow (WindowPtr pWin, RegionPtr pRegion, int what) @@ -757,6 +806,11 @@ qxlScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) qxl->CreateGC = pScreen->CreateGC; pScreen->CreateGC = qxlCreateGC; + + qxl->PaintWindowBackground = pScreen->PaintWindowBackground; + qxl->PaintWindowBorder = pScreen->PaintWindowBorder; + pScreen->PaintWindowBackground = qxlPaintWindow; + pScreen->PaintWindowBorder = qxlPaintWindow; qxl->pDamage = DamageCreate(qxlOnDamage, NULL, DamageReportRawRegion, |