diff options
author | Dave Airlie <airlied@redhat.com> | 2012-05-24 16:03:31 +0100 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2012-07-07 10:37:10 +0100 |
commit | 0b0e7148925e1f835d4f4f06e402a97023531828 (patch) | |
tree | 26c172ef2a4376a4094cafce05a0ac203ef5a6b6 | |
parent | fd6c1bf0a3efced3ad4623dbd4716230a5f2419e (diff) |
exa: pixmap sharing infrastructure (v3)
This just adds exa interfaces for mixed exa so drivers can
share and set shared pixmaps up correctly.
v2: update for passing slave screen.
v3: update for void *
Reviewed-by: Keith Packard <keithp@keithp.com>
Reviewed-by: Adam Jackson <ajax@redhat.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
-rw-r--r-- | exa/exa.c | 7 | ||||
-rw-r--r-- | exa/exa.h | 6 | ||||
-rw-r--r-- | exa/exa_mixed.c | 33 | ||||
-rw-r--r-- | exa/exa_priv.h | 7 |
4 files changed, 52 insertions, 1 deletions
@@ -782,6 +782,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); @@ -976,6 +980,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; @@ -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, void **handle_p); + + Bool (*SetSharedPixmapBacking)(PixmapPtr pPixmap, void *handle); + } ExaDriverRec, *ExaDriverPtr; /** @name EXA driver flags diff --git a/exa/exa_mixed.c b/exa/exa_mixed.c index 06817313f..0fb409102 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, void **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, void *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 68eadc550..ea7e7faff 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; @@ -658,6 +660,11 @@ void void exaPrepareAccessReg_mixed(PixmapPtr pPixmap, int index, RegionPtr pReg); +Bool +exaSetSharedPixmapBacking_mixed(PixmapPtr pPixmap, void *handle); +Bool +exaSharePixmapBacking_mixed(PixmapPtr pPixmap, ScreenPtr slave, void **handle_p); + /* exa_render.c */ Bool exaOpReadsDestination(CARD8 op); |