summaryrefslogtreecommitdiff
path: root/exa
diff options
context:
space:
mode:
Diffstat (limited to 'exa')
-rw-r--r--exa/exa.c15
-rw-r--r--exa/exa_priv.h1
2 files changed, 16 insertions, 0 deletions
diff --git a/exa/exa.c b/exa/exa.c
index 007495583..8513020fe 100644
--- a/exa/exa.c
+++ b/exa/exa.c
@@ -675,6 +675,18 @@ exaBitmapToRegion(PixmapPtr pPix)
return ret;
}
+static miCopyProc
+exaGetCopyAreaFunction(DrawablePtr pSrc,
+ DrawablePtr pDst)
+{
+ ExaScreenPriv (pDst->pScreen);
+
+ if (pExaScr->fallback_counter || pExaScr->swappedOut)
+ return ExaCheckCopyNtoN;
+ else
+ return exaCopyNtoN;
+}
+
static Bool
exaCreateScreenResources(ScreenPtr pScreen)
{
@@ -788,6 +800,8 @@ exaCloseScreen(ScreenPtr pScreen)
unwrap(pExaScr, pScreen, SharePixmapBacking);
if (pExaScr->SavedSetSharedPixmapBacking)
unwrap(pExaScr, pScreen, SetSharedPixmapBacking);
+ if (pExaScr->SavedGetCopyAreaFunction)
+ unwrap(pExaScr, pScreen, GetCopyAreaFunction);
unwrap(pExaScr, ps, Composite);
if (pExaScr->SavedGlyphs)
unwrap(pExaScr, ps, Glyphs);
@@ -944,6 +958,7 @@ exaDriverInit(ScreenPtr pScreen, ExaDriverPtr pScreenInfo)
wrap(pExaScr, pScreen, ChangeWindowAttributes, exaChangeWindowAttributes);
wrap(pExaScr, pScreen, BitmapToRegion, exaBitmapToRegion);
wrap(pExaScr, pScreen, CreateScreenResources, exaCreateScreenResources);
+ wrap(pExaScr, pScreen, GetCopyAreaFunction, exaGetCopyAreaFunction);
if (ps) {
wrap(pExaScr, ps, Composite, exaComposite);
diff --git a/exa/exa_priv.h b/exa/exa_priv.h
index 77a96986d..687b52c3b 100644
--- a/exa/exa_priv.h
+++ b/exa/exa_priv.h
@@ -171,6 +171,7 @@ typedef struct {
GlyphsProcPtr SavedGlyphs;
TrapezoidsProcPtr SavedTrapezoids;
AddTrapsProcPtr SavedAddTraps;
+ GetCopyAreaFunctionProcPtr SavedGetCopyAreaFunction;
void (*do_migration) (ExaMigrationPtr pixmaps, int npixmaps,
Bool can_accel);
Bool (*pixmap_has_gpu_copy) (PixmapPtr pPixmap);