summaryrefslogtreecommitdiff
path: root/exa
diff options
context:
space:
mode:
authorEric Anholt <anholt@freebsd.org>2005-10-15 02:19:09 +0000
committerEric Anholt <anholt@freebsd.org>2005-10-15 02:19:09 +0000
commit744aa34ca5228ea176cc56a7bdd48bbf5f29b0b5 (patch)
tree696c4daec250a44fad15f626df1725ad935fe74f /exa
parent21e7339c1eead1148eea462bc99cf8faf02c8d39 (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 'exa')
-rw-r--r--exa/exa.c14
-rw-r--r--exa/exa_accel.c14
-rw-r--r--exa/exa_migration.c14
-rw-r--r--exa/exa_priv.h8
-rw-r--r--exa/exa_unaccel.c28
5 files changed, 62 insertions, 16 deletions
diff --git a/exa/exa.c b/exa/exa.c
index 2b9dc63dd..c8e57e440 100644
--- a/exa/exa.c
+++ b/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/exa/exa_accel.c b/exa/exa_accel.c
index 2b9dc63dd..c8e57e440 100644
--- a/exa/exa_accel.c
+++ b/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/exa/exa_migration.c b/exa/exa_migration.c
index 2b9dc63dd..c8e57e440 100644
--- a/exa/exa_migration.c
+++ b/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/exa/exa_priv.h b/exa/exa_priv.h
index db83d1b32..c28e269ab 100644
--- a/exa/exa_priv.h
+++ b/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/exa/exa_unaccel.c b/exa/exa_unaccel.c
index d6e111e79..8586405a4 100644
--- a/exa/exa_unaccel.c
+++ b/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