2 * Copyright © 2014 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
24 #include "glamor_priv.h"
25 #include "misyncshm.h"
26 #include "misyncstr.h"
30 * This whole file exists to wrap a sync fence trigger operation so
31 * that we can flush GL to provide serialization between the server
32 * and the shm fence client
35 static DevPrivateKeyRec glamor_sync_fence_key
;
37 struct glamor_sync_fence
{
38 SyncFenceSetTriggeredFunc set_triggered
;
41 static inline struct glamor_sync_fence
*
42 glamor_get_sync_fence(SyncFence
*fence
)
44 return (struct glamor_sync_fence
*) dixLookupPrivate(&fence
->devPrivates
, &glamor_sync_fence_key
);
48 glamor_sync_fence_set_triggered (SyncFence
*fence
)
50 ScreenPtr screen
= fence
->pScreen
;
51 glamor_screen_private
*glamor
= glamor_get_screen_private(screen
);
52 struct glamor_sync_fence
*glamor_fence
= glamor_get_sync_fence(fence
);
54 /* Flush pending rendering operations */
57 fence
->funcs
.SetTriggered
= glamor_fence
->set_triggered
;
58 fence
->funcs
.SetTriggered(fence
);
59 glamor_fence
->set_triggered
= fence
->funcs
.SetTriggered
;
60 fence
->funcs
.SetTriggered
= glamor_sync_fence_set_triggered
;
64 glamor_sync_create_fence(ScreenPtr screen
,
66 Bool initially_triggered
)
68 glamor_screen_private
*glamor
= glamor_get_screen_private(screen
);
69 SyncScreenFuncsPtr screen_funcs
= miSyncGetScreenFuncs(screen
);
70 struct glamor_sync_fence
*glamor_fence
= glamor_get_sync_fence(fence
);
72 screen_funcs
->CreateFence
= glamor
->saved_procs
.sync_screen_funcs
.CreateFence
;
73 screen_funcs
->CreateFence(screen
, fence
, initially_triggered
);
74 glamor
->saved_procs
.sync_screen_funcs
.CreateFence
= screen_funcs
->CreateFence
;
75 screen_funcs
->CreateFence
= glamor_sync_create_fence
;
77 glamor_fence
->set_triggered
= fence
->funcs
.SetTriggered
;
78 fence
->funcs
.SetTriggered
= glamor_sync_fence_set_triggered
;
83 glamor_sync_init(ScreenPtr screen
)
86 glamor_screen_private
*glamor
= glamor_get_screen_private(screen
);
87 SyncScreenFuncsPtr screen_funcs
;
89 if (!dixPrivateKeyRegistered(&glamor_sync_fence_key
)) {
90 if (!dixRegisterPrivateKey(&glamor_sync_fence_key
,
92 sizeof (struct glamor_sync_fence
)))
97 if (!miSyncShmScreenInit(screen
))
100 if (!miSyncSetup(screen
))
104 screen_funcs
= miSyncGetScreenFuncs(screen
);
105 glamor
->saved_procs
.sync_screen_funcs
.CreateFence
= screen_funcs
->CreateFence
;
106 screen_funcs
->CreateFence
= glamor_sync_create_fence
;
112 glamor_sync_close(ScreenPtr screen
)
115 glamor_screen_private
*glamor
= glamor_get_screen_private(screen
);
116 SyncScreenFuncsPtr screen_funcs
= miSyncGetScreenFuncs(screen
);
119 screen_funcs
->CreateFence
= glamor
->saved_procs
.sync_screen_funcs
.CreateFence
;