2 * Copyright © 2013 Keith Packard
4 * Permission to use, copy, modify, distribute, and sell this software and its
5 * documentation for any purpose is hereby granted without fee, provided that
6 * the above copyright notice appear in all copies and that both that copyright
7 * notice and this permission notice appear in supporting documentation, and
8 * that the name of the copyright holders not be used in advertising or
9 * publicity pertaining to distribution of the software without specific,
10 * written prior permission. The copyright holders make no representations
11 * about the suitability of this software for any purpose. It is provided "as
12 * is" without express or implied warranty.
14 * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
15 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
16 * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
17 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
18 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
19 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
23 #ifdef HAVE_DIX_CONFIG_H
24 #include <dix-config.h>
27 #include "scrnintstr.h"
29 #include "misyncstr.h"
30 #include "misyncshm.h"
32 #include "pixmapstr.h"
36 #include <X11/xshmfence.h>
38 static DevPrivateKeyRec syncShmFencePrivateKey
;
40 typedef struct _SyncShmFencePrivate
{
41 struct xshmfence
*fence
;
43 } SyncShmFencePrivateRec
, *SyncShmFencePrivatePtr
;
45 #define SYNC_FENCE_PRIV(pFence) \
46 (SyncShmFencePrivatePtr) dixLookupPrivate(&pFence->devPrivates, &syncShmFencePrivateKey)
49 miSyncShmFenceSetTriggered(SyncFence
* pFence
)
51 SyncShmFencePrivatePtr pPriv
= SYNC_FENCE_PRIV(pFence
);
54 xshmfence_trigger(pPriv
->fence
);
55 miSyncFenceSetTriggered(pFence
);
59 miSyncShmFenceReset(SyncFence
* pFence
)
61 SyncShmFencePrivatePtr pPriv
= SYNC_FENCE_PRIV(pFence
);
64 xshmfence_reset(pPriv
->fence
);
65 miSyncFenceReset(pFence
);
69 miSyncShmFenceCheckTriggered(SyncFence
* pFence
)
71 SyncShmFencePrivatePtr pPriv
= SYNC_FENCE_PRIV(pFence
);
74 return xshmfence_query(pPriv
->fence
);
76 return miSyncFenceCheckTriggered(pFence
);
80 miSyncShmFenceAddTrigger(SyncTrigger
* pTrigger
)
82 miSyncFenceAddTrigger(pTrigger
);
86 miSyncShmFenceDeleteTrigger(SyncTrigger
* pTrigger
)
88 miSyncFenceDeleteTrigger(pTrigger
);
91 static const SyncFenceFuncsRec miSyncShmFenceFuncs
= {
92 &miSyncShmFenceSetTriggered
,
94 &miSyncShmFenceCheckTriggered
,
95 &miSyncShmFenceAddTrigger
,
96 &miSyncShmFenceDeleteTrigger
100 miSyncShmScreenCreateFence(ScreenPtr pScreen
, SyncFence
* pFence
,
101 Bool initially_triggered
)
103 SyncShmFencePrivatePtr pPriv
= SYNC_FENCE_PRIV(pFence
);
106 miSyncScreenCreateFence(pScreen
, pFence
, initially_triggered
);
107 pFence
->funcs
= miSyncShmFenceFuncs
;
111 miSyncShmScreenDestroyFence(ScreenPtr pScreen
, SyncFence
* pFence
)
113 SyncShmFencePrivatePtr pPriv
= SYNC_FENCE_PRIV(pFence
);
116 xshmfence_trigger(pPriv
->fence
);
117 xshmfence_unmap_shm(pPriv
->fence
);
120 miSyncScreenDestroyFence(pScreen
, pFence
);
124 miSyncShmCreateFenceFromFd(ScreenPtr pScreen
, SyncFence
*pFence
, int fd
, Bool initially_triggered
)
126 SyncShmFencePrivatePtr pPriv
= SYNC_FENCE_PRIV(pFence
);
128 miSyncInitFence(pScreen
, pFence
, initially_triggered
);
131 pPriv
->fence
= xshmfence_map_shm(fd
);
142 miSyncShmGetFenceFd(ScreenPtr pScreen
, SyncFence
*pFence
)
144 SyncShmFencePrivatePtr pPriv
= SYNC_FENCE_PRIV(pFence
);
147 pPriv
->fd
= xshmfence_alloc_shm();
150 pPriv
->fd
= os_move_fd(pPriv
->fd
);
151 pPriv
->fence
= xshmfence_map_shm(pPriv
->fd
);
160 static const SyncFdScreenFuncsRec miSyncShmScreenFuncs
= {
161 .version
= SYNC_FD_SCREEN_FUNCS_VERSION
,
162 .CreateFenceFromFd
= miSyncShmCreateFenceFromFd
,
163 .GetFenceFd
= miSyncShmGetFenceFd
166 _X_EXPORT Bool
miSyncShmScreenInit(ScreenPtr pScreen
)
168 SyncScreenFuncsPtr funcs
;
170 if (!miSyncFdScreenInit(pScreen
, &miSyncShmScreenFuncs
))
173 if (!dixPrivateKeyRegistered(&syncShmFencePrivateKey
)) {
174 if (!dixRegisterPrivateKey(&syncShmFencePrivateKey
, PRIVATE_SYNC_FENCE
,
175 sizeof(SyncShmFencePrivateRec
)))
179 funcs
= miSyncGetScreenFuncs(pScreen
);
181 funcs
->CreateFence
= miSyncShmScreenCreateFence
;
182 funcs
->DestroyFence
= miSyncShmScreenDestroyFence
;