nouveau_sync.c revision fda9279d
1fda9279dSmrg/*
2fda9279dSmrg * Copyright © 2013-2014 Intel Corporation
3fda9279dSmrg *
4fda9279dSmrg * Permission to use, copy, modify, distribute, and sell this software and its
5fda9279dSmrg * documentation for any purpose is hereby granted without fee, provided that
6fda9279dSmrg * the above copyright notice appear in all copies and that both that copyright
7fda9279dSmrg * notice and this permission notice appear in supporting documentation, and
8fda9279dSmrg * that the name of the copyright holders not be used in advertising or
9fda9279dSmrg * publicity pertaining to distribution of the software without specific,
10fda9279dSmrg * written prior permission.  The copyright holders make no representations
11fda9279dSmrg * about the suitability of this software for any purpose.  It is provided "as
12fda9279dSmrg * is" without express or implied warranty.
13fda9279dSmrg *
14fda9279dSmrg * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
15fda9279dSmrg * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
16fda9279dSmrg * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
17fda9279dSmrg * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
18fda9279dSmrg * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
19fda9279dSmrg * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
20fda9279dSmrg * OF THIS SOFTWARE.
21fda9279dSmrg */
22fda9279dSmrg
23fda9279dSmrg#include "nouveau_sync.h"
24fda9279dSmrg#ifdef DRI3
25fda9279dSmrg#include "nv_include.h"
26fda9279dSmrg
27fda9279dSmrgstatic DevPrivateKeyRec nouveau_syncobj_key;
28fda9279dSmrg
29fda9279dSmrgstruct nouveau_syncobj {
30fda9279dSmrg	SyncFenceSetTriggeredFunc SetTriggered;
31fda9279dSmrg};
32fda9279dSmrg
33fda9279dSmrg#define nouveau_syncobj(fence)                                                 \
34fda9279dSmrg	dixLookupPrivate(&(fence)->devPrivates, &nouveau_syncobj_key)
35fda9279dSmrg
36fda9279dSmrgstruct nouveau_syncctx {
37fda9279dSmrg	SyncScreenCreateFenceFunc CreateFence;
38fda9279dSmrg};
39fda9279dSmrg
40fda9279dSmrg#define nouveau_syncctx(screen) ({                                             \
41fda9279dSmrg	ScrnInfoPtr scrn = xf86ScreenToScrn(screen);                           \
42fda9279dSmrg	NVPtr pNv = NVPTR(scrn);                                               \
43fda9279dSmrg	pNv->sync;                                                             \
44fda9279dSmrg})
45fda9279dSmrg
46fda9279dSmrgstatic void
47fda9279dSmrgnouveau_syncobj_flush(SyncFence *fence)
48fda9279dSmrg{
49fda9279dSmrg	struct nouveau_syncobj *pobj = nouveau_syncobj(fence);
50fda9279dSmrg	ScrnInfoPtr scrn = xf86ScreenToScrn(fence->pScreen);
51fda9279dSmrg	NVPtr pNv = NVPTR(scrn);
52fda9279dSmrg	SyncFenceFuncsPtr func = &fence->funcs;
53fda9279dSmrg
54fda9279dSmrg	if (pNv->Flush)
55fda9279dSmrg		pNv->Flush(scrn);
56fda9279dSmrg
57fda9279dSmrg	swap(pobj, func, SetTriggered);
58fda9279dSmrg	func->SetTriggered(fence);
59fda9279dSmrg	swap(pobj, func, SetTriggered);
60fda9279dSmrg}
61fda9279dSmrg
62fda9279dSmrgstatic void
63fda9279dSmrgnouveau_syncobj_new(ScreenPtr screen, SyncFence *fence, Bool triggered)
64fda9279dSmrg{
65fda9279dSmrg	struct nouveau_syncctx *priv = nouveau_syncctx(screen);
66fda9279dSmrg	struct nouveau_syncobj *pobj = nouveau_syncobj(fence);
67fda9279dSmrg	SyncScreenFuncsPtr sync = miSyncGetScreenFuncs(screen);
68fda9279dSmrg	SyncFenceFuncsPtr func = &fence->funcs;
69fda9279dSmrg
70fda9279dSmrg	swap(priv, sync, CreateFence);
71fda9279dSmrg	sync->CreateFence(screen, fence, triggered);
72fda9279dSmrg	swap(priv, sync, CreateFence);
73fda9279dSmrg
74fda9279dSmrg	wrap(pobj, func, SetTriggered, nouveau_syncobj_flush);
75fda9279dSmrg}
76fda9279dSmrg
77fda9279dSmrgvoid
78fda9279dSmrgnouveau_sync_fini(ScreenPtr screen)
79fda9279dSmrg{
80fda9279dSmrg	struct nouveau_syncctx *priv = nouveau_syncctx(screen);
81fda9279dSmrg	SyncScreenFuncsPtr sync = miSyncGetScreenFuncs(screen);
82fda9279dSmrg	ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
83fda9279dSmrg	NVPtr pNv = NVPTR(scrn);
84fda9279dSmrg
85fda9279dSmrg	unwrap(priv, sync, CreateFence);
86fda9279dSmrg
87fda9279dSmrg	pNv->sync = NULL;
88fda9279dSmrg	free(priv);
89fda9279dSmrg}
90fda9279dSmrg
91fda9279dSmrgBool
92fda9279dSmrgnouveau_sync_init(ScreenPtr screen)
93fda9279dSmrg{
94fda9279dSmrg	ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
95fda9279dSmrg	NVPtr pNv = NVPTR(scrn);
96fda9279dSmrg	struct nouveau_syncctx *priv;
97fda9279dSmrg	SyncScreenFuncsPtr sync;
98fda9279dSmrg
99fda9279dSmrg	priv = pNv->sync = calloc(1, sizeof(*priv));
100fda9279dSmrg	if (!priv)
101fda9279dSmrg		return FALSE;
102fda9279dSmrg
103fda9279dSmrg	if (!miSyncShmScreenInit(screen))
104fda9279dSmrg		return FALSE;
105fda9279dSmrg
106fda9279dSmrg	if (!dixPrivateKeyRegistered(&nouveau_syncobj_key)) {
107fda9279dSmrg		if (!dixRegisterPrivateKey(&nouveau_syncobj_key,
108fda9279dSmrg					    PRIVATE_SYNC_FENCE,
109fda9279dSmrg					   sizeof(struct nouveau_syncobj)))
110fda9279dSmrg			return FALSE;
111fda9279dSmrg	}
112fda9279dSmrg
113fda9279dSmrg	sync = miSyncGetScreenFuncs(screen);
114fda9279dSmrg	wrap(priv, sync, CreateFence, nouveau_syncobj_new);
115fda9279dSmrg	return TRUE;
116fda9279dSmrg}
117fda9279dSmrg#endif
118