[PATCH 22/36] exa: pixmap sharing infrastructure (v2)

Dave Airlie airlied at gmail.com
Mon Jul 2 03:13:15 PDT 2012


From: Dave Airlie <airlied at redhat.com>

This just adds exa interfaces for mixed exa so drivers can
share and set shared pixmaps up correctly.

v2: update for passing slave screen.

Signed-off-by: Dave Airlie <airlied at redhat.com>
---
 exa/exa.c       |    7 +++++++
 exa/exa.h       |    6 +++++-
 exa/exa_mixed.c |   33 +++++++++++++++++++++++++++++++++
 exa/exa_priv.h  |    7 +++++++
 4 files changed, 52 insertions(+), 1 deletion(-)

diff --git a/exa/exa.c b/exa/exa.c
index 0f90e59..0074955 100644
--- a/exa/exa.c
+++ b/exa/exa.c
@@ -784,6 +784,10 @@ exaCloseScreen(ScreenPtr pScreen)
     unwrap(pExaScr, pScreen, ChangeWindowAttributes);
     unwrap(pExaScr, pScreen, BitmapToRegion);
     unwrap(pExaScr, pScreen, CreateScreenResources);
+    if (pExaScr->SavedSharePixmapBacking)
+        unwrap(pExaScr, pScreen, SharePixmapBacking);
+    if (pExaScr->SavedSetSharedPixmapBacking)
+        unwrap(pExaScr, pScreen, SetSharedPixmapBacking);
     unwrap(pExaScr, ps, Composite);
     if (pExaScr->SavedGlyphs)
         unwrap(pExaScr, ps, Glyphs);
@@ -978,6 +982,9 @@ exaDriverInit(ScreenPtr pScreen, ExaDriverPtr pScreenInfo)
                 wrap(pExaScr, pScreen, DestroyPixmap, exaDestroyPixmap_mixed);
                 wrap(pExaScr, pScreen, ModifyPixmapHeader,
                      exaModifyPixmapHeader_mixed);
+                wrap(pExaScr, pScreen, SharePixmapBacking, exaSharePixmapBacking_mixed);
+                wrap(pExaScr, pScreen, SetSharedPixmapBacking, exaSetSharedPixmapBacking_mixed);
+
                 pExaScr->do_migration = exaDoMigration_mixed;
                 pExaScr->pixmap_has_gpu_copy = exaPixmapHasGpuCopy_mixed;
                 pExaScr->do_move_in_pixmap = exaMoveInPixmap_mixed;
diff --git a/exa/exa.h b/exa/exa.h
index 8a6539f..166a5ca 100644
--- a/exa/exa.h
+++ b/exa/exa.h
@@ -39,7 +39,7 @@
 #include "fb.h"
 
 #define EXA_VERSION_MAJOR   2
-#define EXA_VERSION_MINOR   5
+#define EXA_VERSION_MINOR   6
 #define EXA_VERSION_RELEASE 0
 
 typedef struct _ExaOffscreenArea ExaOffscreenArea;
@@ -694,6 +694,10 @@ typedef struct _ExaDriver {
                             int depth, int usage_hint, int bitsPerPixel,
                             int *new_fb_pitch);
     /** @} */
+    Bool (*SharePixmapBacking)(PixmapPtr pPixmap, ScreenPtr slave, int *handle_p);
+
+    Bool (*SetSharedPixmapBacking)(PixmapPtr pPixmap, int handle);
+
 } ExaDriverRec, *ExaDriverPtr;
 
 /** @name EXA driver flags
diff --git a/exa/exa_mixed.c b/exa/exa_mixed.c
index 0681731..6d9beed 100644
--- a/exa/exa_mixed.c
+++ b/exa/exa_mixed.c
@@ -294,3 +294,36 @@ exaPixmapHasGpuCopy_mixed(PixmapPtr pPixmap)
 
     return ret;
 }
+
+Bool
+exaSharePixmapBacking_mixed(PixmapPtr pPixmap, ScreenPtr slave, int *handle_p)
+{
+    ScreenPtr pScreen = pPixmap->drawable.pScreen;
+    ExaScreenPriv(pScreen);
+    Bool ret = FALSE;
+
+    exaMoveInPixmap(pPixmap);
+    /* get the driver to give us a handle */
+    if (pExaScr->info->SharePixmapBacking)
+        ret = pExaScr->info->SharePixmapBacking(pPixmap, slave, handle_p);
+
+    return ret;
+}
+
+Bool
+exaSetSharedPixmapBacking_mixed(PixmapPtr pPixmap, int handle)
+{
+    ScreenPtr pScreen = pPixmap->drawable.pScreen;
+    ExaScreenPriv(pScreen);
+    Bool ret = FALSE;
+
+    if (pExaScr->info->SetSharedPixmapBacking)
+        ret = pExaScr->info->SetSharedPixmapBacking(pPixmap, handle);
+
+    if (ret == TRUE)
+        exaMoveInPixmap(pPixmap);
+
+    return ret;
+}
+
+
diff --git a/exa/exa_priv.h b/exa/exa_priv.h
index f980fea..78ea0d2 100644
--- a/exa/exa_priv.h
+++ b/exa/exa_priv.h
@@ -163,6 +163,8 @@ typedef struct {
     BitmapToRegionProcPtr SavedBitmapToRegion;
     CreateScreenResourcesProcPtr SavedCreateScreenResources;
     ModifyPixmapHeaderProcPtr SavedModifyPixmapHeader;
+    SharePixmapBackingProcPtr SavedSharePixmapBacking;
+    SetSharedPixmapBackingProcPtr SavedSetSharedPixmapBacking;
     SourceValidateProcPtr SavedSourceValidate;
     CompositeProcPtr SavedComposite;
     TrianglesProcPtr SavedTriangles;
@@ -662,6 +664,11 @@ void
 void
  exaPrepareAccessReg_mixed(PixmapPtr pPixmap, int index, RegionPtr pReg);
 
+Bool
+exaSetSharedPixmapBacking_mixed(PixmapPtr pPixmap, int handle);
+Bool
+exaSharePixmapBacking_mixed(PixmapPtr pPixmap, ScreenPtr slave, int *handle_p);
+
 /* exa_render.c */
 Bool
  exaOpReadsDestination(CARD8 op);
-- 
1.7.10.2



More information about the xorg-devel mailing list