summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSøren Sandmann Pedersen <ssp@redhat.com>2009-02-26 07:10:35 -0500
committerSøren Sandmann Pedersen <ssp@redhat.com>2009-02-26 07:10:35 -0500
commita40a14c1f2c56f7d9d014a5e310e976471ba8c20 (patch)
treef0124adaeb18a4f2c6a126afe2951ae27ac8f7b2
parenteb57c4f1968d08bc10320cf37394ff1a520f992d (diff)
Accelerate window background painting
-rw-r--r--src/qxl.h2
-rw-r--r--src/qxl_driver.c54
2 files changed, 56 insertions, 0 deletions
diff --git a/src/qxl.h b/src/qxl.h
index 4e280d2..35df0f0 100644
--- a/src/qxl.h
+++ b/src/qxl.h
@@ -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,