- Do the right thing based on prepare access.
---
 exa/exa.c           |   13 ++++++++++---
 exa/exa_migration.c |    8 ++++++--
 exa/exa_priv.h      |    2 +-
 3 files changed, 17 insertions(+), 6 deletions(-)

diff --git a/exa/exa.c b/exa/exa.c
index a647699..8b6aab2 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,19 +534,23 @@ ExaDoPrepareAccess(DrawablePtr pDrawable, int index)
     }
 
     if (!offscreen)
-       return;
+       return FALSE;
 
     exaWaitSync (pDrawable->pScreen);
 
     if (pExaScr->info->PrepareAccess == NULL)
-       return;
+       return TRUE;
 
     if (!(*pExaScr->info->PrepareAccess) (pPixmap, index)) {
        ExaPixmapPriv (pPixmap);
        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 9d0eda0..b6f192b 100644
--- a/exa/exa_migration.c
+++ b/exa/exa_migration.c
@@ -566,7 +566,9 @@ exaAssertNotDirty (PixmapPtr pPixmap)
     src_pitch = pExaPixmap->fb_pitch;
     cpp = pPixmap->drawable.bitsPerPixel / 8;
 
-    ExaDoPrepareAccess(&pPixmap->drawable, EXA_PREPARE_SRC);
+    if (!ExaDoPrepareAccess(&pPixmap->drawable, EXA_PREPARE_SRC))
+       goto skip;
+
     while (nbox--) {
            int rowbytes;
 
@@ -579,7 +581,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,6 +594,8 @@ exaAssertNotDirty (PixmapPtr pPixmap)
                }
            }
     }
+
+skip:
     exaFinishAccess(&pPixmap->drawable, EXA_PREPARE_SRC);
 
 out:
diff --git a/exa/exa_priv.h b/exa/exa_priv.h
index 8f83701..0509c47 100644
--- a/exa/exa_priv.h
+++ b/exa/exa_priv.h
@@ -443,7 +443,7 @@ void
 ExaOffscreenFini (ScreenPtr pScreen);
 
 /* exa.c */
-void
+Bool
 ExaDoPrepareAccess(DrawablePtr pDrawable, int index);
 
 void
-- 
1.6.1.3

_______________________________________________
xorg-devel mailing list
[email protected]
http://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to