diff options
author | Eric Anholt <anholt@freebsd.org> | 2005-10-15 02:19:09 +0000 |
---|---|---|
committer | Eric Anholt <anholt@freebsd.org> | 2005-10-15 02:19:09 +0000 |
commit | 744aa34ca5228ea176cc56a7bdd48bbf5f29b0b5 (patch) | |
tree | 696c4daec250a44fad15f626df1725ad935fe74f /hw/xfree86 | |
parent | 21e7339c1eead1148eea462bc99cf8faf02c8d39 (diff) |
Add an additional meaning to the "dirty" flag. Now, if !dirty && !area, the
pixmaps's contents are undefined, so we won't need to upload the
undefined contents in MoveIn. Use the ExaCheck* for async ops as well,
so that dirty is always tracked. While the performance impact for my ls
-lR test was not significant (though the avoiding-upload path was being
hit), it's likely to be important for the upcoming Get/PutImage
acceleration from ajax.
Diffstat (limited to 'hw/xfree86')
-rw-r--r-- | hw/xfree86/exa/exa.c | 14 | ||||
-rw-r--r-- | hw/xfree86/exa/exaPriv.h | 8 | ||||
-rw-r--r-- | hw/xfree86/exa/exa_accel.c | 14 | ||||
-rw-r--r-- | hw/xfree86/exa/exa_migration.c | 14 | ||||
-rw-r--r-- | hw/xfree86/exa/exa_priv.h | 8 | ||||
-rw-r--r-- | hw/xfree86/exa/exa_unaccel.c | 28 | ||||
-rw-r--r-- | hw/xfree86/exa/exaasync.c | 28 |
7 files changed, 82 insertions, 32 deletions
diff --git a/hw/xfree86/exa/exa.c b/hw/xfree86/exa/exa.c index 2b9dc63dd..c8e57e440 100644 --- a/hw/xfree86/exa/exa.c +++ b/hw/xfree86/exa/exa.c @@ -159,6 +159,10 @@ exaPixmapSave (ScreenPtr pScreen, ExaOffscreenArea *area) pPixmap->devPrivate.ptr = dst; pPixmap->drawable.serialNumber = NEXT_SERIAL_NUMBER; pExaPixmap->area = NULL; + /* Mark it dirty now, to say that there is important data in the + * system-memory copy. + */ + pExaPixmap->dirty = TRUE; } static int @@ -238,6 +242,16 @@ exaMoveInPixmap (PixmapPtr pPixmap) return; } + /* If the "dirty" flag has never been set on the in-memory pixmap, then + * nothing has been written to it, so the contents are undefined and we can + * avoid the upload. + */ + if (!pExaPixmap->dirty) { + DBG_MIGRATE(("saved upload of %dx%d\n", pPixmap->drawable.width, + pPixmap->drawable.height)); + return; + } + pExaPixmap->dirty = FALSE; if (pExaScr->info->accel.UploadToScreen) diff --git a/hw/xfree86/exa/exaPriv.h b/hw/xfree86/exa/exaPriv.h index db83d1b32..c28e269ab 100644 --- a/hw/xfree86/exa/exaPriv.h +++ b/hw/xfree86/exa/exaPriv.h @@ -119,8 +119,12 @@ typedef struct { int devKind; DevUnion devPrivate; - /* True if the in-screen copy has been modified compared to the - * system-memory copy. + /* If area is NULL, then dirty == TRUE means that the pixmap has been + * modified, so the contents are defined. Used to avoid uploads of + * undefined data. + * If area is non-NULL, then dirty == TRUE means that the in-framebuffer + * copy has been changed from the system-memory copy. Used to avoid + * downloads of unmodified data. */ Bool dirty; unsigned int size; diff --git a/hw/xfree86/exa/exa_accel.c b/hw/xfree86/exa/exa_accel.c index 2b9dc63dd..c8e57e440 100644 --- a/hw/xfree86/exa/exa_accel.c +++ b/hw/xfree86/exa/exa_accel.c @@ -159,6 +159,10 @@ exaPixmapSave (ScreenPtr pScreen, ExaOffscreenArea *area) pPixmap->devPrivate.ptr = dst; pPixmap->drawable.serialNumber = NEXT_SERIAL_NUMBER; pExaPixmap->area = NULL; + /* Mark it dirty now, to say that there is important data in the + * system-memory copy. + */ + pExaPixmap->dirty = TRUE; } static int @@ -238,6 +242,16 @@ exaMoveInPixmap (PixmapPtr pPixmap) return; } + /* If the "dirty" flag has never been set on the in-memory pixmap, then + * nothing has been written to it, so the contents are undefined and we can + * avoid the upload. + */ + if (!pExaPixmap->dirty) { + DBG_MIGRATE(("saved upload of %dx%d\n", pPixmap->drawable.width, + pPixmap->drawable.height)); + return; + } + pExaPixmap->dirty = FALSE; if (pExaScr->info->accel.UploadToScreen) diff --git a/hw/xfree86/exa/exa_migration.c b/hw/xfree86/exa/exa_migration.c index 2b9dc63dd..c8e57e440 100644 --- a/hw/xfree86/exa/exa_migration.c +++ b/hw/xfree86/exa/exa_migration.c @@ -159,6 +159,10 @@ exaPixmapSave (ScreenPtr pScreen, ExaOffscreenArea *area) pPixmap->devPrivate.ptr = dst; pPixmap->drawable.serialNumber = NEXT_SERIAL_NUMBER; pExaPixmap->area = NULL; + /* Mark it dirty now, to say that there is important data in the + * system-memory copy. + */ + pExaPixmap->dirty = TRUE; } static int @@ -238,6 +242,16 @@ exaMoveInPixmap (PixmapPtr pPixmap) return; } + /* If the "dirty" flag has never been set on the in-memory pixmap, then + * nothing has been written to it, so the contents are undefined and we can + * avoid the upload. + */ + if (!pExaPixmap->dirty) { + DBG_MIGRATE(("saved upload of %dx%d\n", pPixmap->drawable.width, + pPixmap->drawable.height)); + return; + } + pExaPixmap->dirty = FALSE; if (pExaScr->info->accel.UploadToScreen) diff --git a/hw/xfree86/exa/exa_priv.h b/hw/xfree86/exa/exa_priv.h index db83d1b32..c28e269ab 100644 --- a/hw/xfree86/exa/exa_priv.h +++ b/hw/xfree86/exa/exa_priv.h @@ -119,8 +119,12 @@ typedef struct { int devKind; DevUnion devPrivate; - /* True if the in-screen copy has been modified compared to the - * system-memory copy. + /* If area is NULL, then dirty == TRUE means that the pixmap has been + * modified, so the contents are defined. Used to avoid uploads of + * undefined data. + * If area is non-NULL, then dirty == TRUE means that the in-framebuffer + * copy has been changed from the system-memory copy. Used to avoid + * downloads of unmodified data. */ Bool dirty; unsigned int size; diff --git a/hw/xfree86/exa/exa_unaccel.c b/hw/xfree86/exa/exa_unaccel.c index d6e111e79..8586405a4 100644 --- a/hw/xfree86/exa/exa_unaccel.c +++ b/hw/xfree86/exa/exa_unaccel.c @@ -331,26 +331,26 @@ ExaCheckComposite (CARD8 op, * do migration for CopyArea. */ const GCOps exaAsyncPixmapGCOps = { - fbFillSpans, - fbSetSpans, - fbPutImage, + ExaCheckFillSpans, + ExaCheckSetSpans, + ExaCheckPutImage, exaCopyArea, ExaCheckCopyPlane, - fbPolyPoint, - fbPolyLine, - fbPolySegment, - fbPolyRectangle, - fbPolyArc, - fbFillPolygon, - fbPolyFillRect, - fbPolyFillArc, + ExaCheckPolyPoint, + ExaCheckPolylines, + ExaCheckPolySegment, + ExaCheckPolyRectangle, + ExaCheckPolyArc, + ExaCheckFillPolygon, + ExaCheckPolyFillRect, + ExaCheckPolyFillArc, miPolyText8, miPolyText16, miImageText8, miImageText16, - fbImageGlyphBlt, - fbPolyGlyphBlt, - fbPushPixels + ExaCheckImageGlyphBlt, + ExaCheckPolyGlyphBlt, + ExaCheckPushPixels #ifdef NEED_LINEHELPER ,NULL #endif diff --git a/hw/xfree86/exa/exaasync.c b/hw/xfree86/exa/exaasync.c index d6e111e79..8586405a4 100644 --- a/hw/xfree86/exa/exaasync.c +++ b/hw/xfree86/exa/exaasync.c @@ -331,26 +331,26 @@ ExaCheckComposite (CARD8 op, * do migration for CopyArea. */ const GCOps exaAsyncPixmapGCOps = { - fbFillSpans, - fbSetSpans, - fbPutImage, + ExaCheckFillSpans, + ExaCheckSetSpans, + ExaCheckPutImage, exaCopyArea, ExaCheckCopyPlane, - fbPolyPoint, - fbPolyLine, - fbPolySegment, - fbPolyRectangle, - fbPolyArc, - fbFillPolygon, - fbPolyFillRect, - fbPolyFillArc, + ExaCheckPolyPoint, + ExaCheckPolylines, + ExaCheckPolySegment, + ExaCheckPolyRectangle, + ExaCheckPolyArc, + ExaCheckFillPolygon, + ExaCheckPolyFillRect, + ExaCheckPolyFillArc, miPolyText8, miPolyText16, miImageText8, miImageText16, - fbImageGlyphBlt, - fbPolyGlyphBlt, - fbPushPixels + ExaCheckImageGlyphBlt, + ExaCheckPolyGlyphBlt, + ExaCheckPushPixels #ifdef NEED_LINEHELPER ,NULL #endif |