summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaarten Maathuis <madman2003@gmail.com>2009-02-26 22:18:03 +0100
committerMaarten Maathuis <madman2003@gmail.com>2009-02-27 17:11:35 +0100
commited00515ec54b294f304b8ae2857e3073f97860d2 (patch)
tree30de04d33e9fb54526cf32663d67ff95626e8902
parent2e88b6004f09dbcb888abf05d4d5554231b2bd1a (diff)
exa: fixup exaAssertNotDirty.
- Do the right thing based on prepare access.
-rw-r--r--exa/exa.c13
-rw-r--r--exa/exa_migration.c20
-rw-r--r--exa/exa_priv.h2
3 files changed, 27 insertions, 8 deletions
diff --git a/exa/exa.c b/exa/exa.c
index 5425f902e..76860a490 100644
--- a/exa/exa.c
+++ b/exa/exa.c
@@ -517,7 +517,10 @@ exaGetOffscreenPixmap (DrawablePtr pDrawable, int *xp, int *yp)
return NULL;
}
-void
+/**
+ * Returns TRUE if pixmap can be accessed offscreen.
+ */
+Bool
ExaDoPrepareAccess(DrawablePtr pDrawable, int index)
{
ScreenPtr pScreen = pDrawable->pScreen;
@@ -531,12 +534,12 @@ ExaDoPrepareAccess(DrawablePtr pDrawable, int index)
}
if (!offscreen)
- return;
+ return FALSE;
exaWaitSync (pDrawable->pScreen);
if (pExaScr->info->PrepareAccess == NULL)
- return;
+ return TRUE;
if (index >= EXA_PREPARE_AUX0 &&
!(pExaScr->info->flags & EXA_SUPPORTS_PREPARE_AUX)) {
@@ -549,7 +552,11 @@ ExaDoPrepareAccess(DrawablePtr pDrawable, int index)
if (pExaPixmap->score == EXA_PIXMAP_SCORE_PINNED)
FatalError("Driver failed PrepareAccess on a pinned pixmap\n");
exaMoveOutPixmap (pPixmap);
+
+ return FALSE;
}
+
+ return TRUE;
}
void
diff --git a/exa/exa_migration.c b/exa/exa_migration.c
index 9d0eda0de..8b911500b 100644
--- a/exa/exa_migration.c
+++ b/exa/exa_migration.c
@@ -545,9 +545,9 @@ exaAssertNotDirty (PixmapPtr pPixmap)
ExaPixmapPriv (pPixmap);
CARD8 *dst, *src;
RegionRec ValidReg;
- int dst_pitch, src_pitch, cpp, y, nbox;
+ int dst_pitch, src_pitch, cpp, y, nbox, save_pitch;
BoxPtr pBox;
- Bool ret = TRUE;
+ Bool ret = TRUE, save_offscreen;
if (exaPixmapIsPinned(pPixmap) || pExaPixmap->area == NULL)
return ret;
@@ -566,7 +566,14 @@ exaAssertNotDirty (PixmapPtr pPixmap)
src_pitch = pExaPixmap->fb_pitch;
cpp = pPixmap->drawable.bitsPerPixel / 8;
- ExaDoPrepareAccess(&pPixmap->drawable, EXA_PREPARE_SRC);
+ save_offscreen = pExaPixmap->offscreen;
+ save_pitch = pPixmap->devKind;
+ pExaPixmap->offscreen = TRUE;
+ pPixmap->devKind = pExaPixmap->fb_pitch;
+
+ if (!ExaDoPrepareAccess(&pPixmap->drawable, EXA_PREPARE_SRC))
+ goto skip;
+
while (nbox--) {
int rowbytes;
@@ -579,7 +586,7 @@ exaAssertNotDirty (PixmapPtr pPixmap)
continue;
rowbytes = (pBox->x2 - pBox->x1) * cpp;
- src = pExaPixmap->fb_ptr + pBox->y1 * src_pitch + pBox->x1 * cpp;
+ src = (CARD8 *) pPixmap->devPrivate.ptr + pBox->y1 * src_pitch + pBox->x1 * cpp;
dst = pExaPixmap->sys_ptr + pBox->y1 * dst_pitch + pBox->x1 * cpp;
for (y = pBox->y1; y < pBox->y2;
@@ -592,8 +599,13 @@ exaAssertNotDirty (PixmapPtr pPixmap)
}
}
}
+
+skip:
exaFinishAccess(&pPixmap->drawable, EXA_PREPARE_SRC);
+ pExaPixmap->offscreen = save_offscreen;
+ pPixmap->devKind = save_pitch;
+
out:
REGION_UNINIT(pScreen, &ValidReg);
return ret;
diff --git a/exa/exa_priv.h b/exa/exa_priv.h
index a618fb42a..a037eb031 100644
--- a/exa/exa_priv.h
+++ b/exa/exa_priv.h
@@ -449,7 +449,7 @@ void
ExaOffscreenFini (ScreenPtr pScreen);
/* exa.c */
-void
+Bool
ExaDoPrepareAccess(DrawablePtr pDrawable, int index);
void