No longer leak FDs on VT switch.
[xserver.git] / glamor / glamor_sync.c
blob3f98be40074375497f62bc7ec8b4bf2cf2b8d517
1 /*
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
20 * OF THIS SOFTWARE.
24 #include "glamor_priv.h"
25 #include "misyncshm.h"
26 #include "misyncstr.h"
28 #if XSYNC
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);
47 static void
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 */
55 glamor_flush(glamor);
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;
63 static void
64 glamor_sync_create_fence(ScreenPtr screen,
65 SyncFence *fence,
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;
80 #endif
82 Bool
83 glamor_sync_init(ScreenPtr screen)
85 #if XSYNC
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,
91 PRIVATE_SYNC_FENCE,
92 sizeof (struct glamor_sync_fence)))
93 return FALSE;
96 #ifdef HAVE_XSHMFENCE
97 if (!miSyncShmScreenInit(screen))
98 return FALSE;
99 #else
100 if (!miSyncSetup(screen))
101 return FALSE;
102 #endif
104 screen_funcs = miSyncGetScreenFuncs(screen);
105 glamor->saved_procs.sync_screen_funcs.CreateFence = screen_funcs->CreateFence;
106 screen_funcs->CreateFence = glamor_sync_create_fence;
107 #endif
108 return TRUE;
111 void
112 glamor_sync_close(ScreenPtr screen)
114 #if XSYNC
115 glamor_screen_private *glamor = glamor_get_screen_private(screen);
116 SyncScreenFuncsPtr screen_funcs = miSyncGetScreenFuncs(screen);
118 if (screen_funcs)
119 screen_funcs->CreateFence = glamor->saved_procs.sync_screen_funcs.CreateFence;
120 #endif