Alongside DRI3, SHM fences are used to serialise changes to the Pixmap shared between the client and the xserver. By recording the associated Drawable for a particular fence, the driver can reduce the amount of work required for serialisation (i.e. it only has to serialise access to one Pixmap, not all).
Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk> --- miext/sync/misyncfd.c | 2 +- miext/sync/misyncfd.h | 3 ++- miext/sync/misyncshm.c | 11 ++++++++++- miext/sync/misyncshm.h | 4 ++++ 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/miext/sync/misyncfd.c b/miext/sync/misyncfd.c index 93ff85f..b5fe92d 100644 --- a/miext/sync/misyncfd.c +++ b/miext/sync/misyncfd.c @@ -52,7 +52,7 @@ miSyncInitFenceFromFD(DrawablePtr pDraw, SyncFence *pFence, int fd, BOOL initial if (!priv) return BadMatch; - return (*priv->funcs.CreateFenceFromFd)(pDraw->pScreen, pFence, fd, initially_triggered); + return (*priv->funcs.CreateFenceFromFd)(pDraw->pScreen, pFence, pDraw, fd, initially_triggered); } int diff --git a/miext/sync/misyncfd.h b/miext/sync/misyncfd.h index c1d05f9..2cb33dc 100644 --- a/miext/sync/misyncfd.h +++ b/miext/sync/misyncfd.h @@ -25,11 +25,12 @@ typedef int (*SyncScreenCreateFenceFromFdFunc) (ScreenPtr screen, SyncFence *fence, + DrawablePtr drawable, int fd, Bool initially_triggered); typedef int (*SyncScreenGetFenceFdFunc) (ScreenPtr screen, - SyncFence *fence); + SyncFence *fence); #define SYNC_FD_SCREEN_FUNCS_VERSION 1 diff --git a/miext/sync/misyncshm.c b/miext/sync/misyncshm.c index 4d11b57..f954e1e 100644 --- a/miext/sync/misyncshm.c +++ b/miext/sync/misyncshm.c @@ -38,6 +38,7 @@ static DevPrivateKeyRec syncShmFencePrivateKey; typedef struct _SyncShmFencePrivate { + DrawablePtr pDrawable; struct xshmfence *fence; int fd; } SyncShmFencePrivateRec, *SyncShmFencePrivatePtr; @@ -121,12 +122,14 @@ miSyncShmScreenDestroyFence(ScreenPtr pScreen, SyncFence * pFence) } static int -miSyncShmCreateFenceFromFd(ScreenPtr pScreen, SyncFence *pFence, int fd, Bool initially_triggered) +miSyncShmCreateFenceFromFd(ScreenPtr pScreen, SyncFence *pFence, DrawablePtr draw, int fd, Bool initially_triggered) { SyncShmFencePrivatePtr pPriv = SYNC_FENCE_PRIV(pFence); miSyncInitFence(pScreen, pFence, initially_triggered); + pPriv->pDrawable = draw; + fd = os_move_fd(fd); pPriv->fence = xshmfence_map_shm(fd); if (pPriv->fence) { @@ -184,3 +187,9 @@ _X_EXPORT Bool miSyncShmScreenInit(ScreenPtr pScreen) return TRUE; } +_X_EXPORT DrawablePtr +miSyncShmFenceGetDrawable(SyncFence *pFence) +{ + SyncShmFencePrivatePtr pPriv = SYNC_FENCE_PRIV(pFence); + return pPriv ? pPriv->pDrawable : NULL; +} diff --git a/miext/sync/misyncshm.h b/miext/sync/misyncshm.h index 23c001a..2484970 100644 --- a/miext/sync/misyncshm.h +++ b/miext/sync/misyncshm.h @@ -23,6 +23,10 @@ #ifndef _MISYNCSHM_H_ #define _MISYNCSHM_H_ +#include <misync.h> + extern _X_EXPORT Bool miSyncShmScreenInit(ScreenPtr pScreen); +extern _X_EXPORT DrawablePtr miSyncShmFenceGetDrawable(SyncFence *pFence); + #endif /* _MISYNCSHM_H_ */ -- 2.0.0.rc2 _______________________________________________ xorg-devel@lists.x.org: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel