xref: /aosp_15_r20/external/angle/src/libANGLE/GlobalMutex.h (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1 //
2 // Copyright 2023 The ANGLE Project Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
5 //
6 // GlobalMutex.h: Defines Global Mutex and utilities.
7 
8 #ifndef LIBANGLE_GLOBAL_MUTEX_H_
9 #define LIBANGLE_GLOBAL_MUTEX_H_
10 
11 #include "common/angleutils.h"
12 
13 namespace egl
14 {
15 namespace priv
16 {
17 class GlobalMutex;
18 
19 enum class GlobalMutexChoice
20 {
21     // All EGL entry points except EGL Sync objects
22     EGL,
23     // Entry points relating to EGL Sync objects
24     Sync,
25 };
26 
27 template <GlobalMutexChoice mutexChoice>
28 class [[nodiscard]] ScopedGlobalMutexLock final : angle::NonCopyable
29 {
30   public:
31     ScopedGlobalMutexLock();
32     ~ScopedGlobalMutexLock();
33 
34 #if !defined(ANGLE_ENABLE_GLOBAL_MUTEX_LOAD_TIME_ALLOCATE)
35   private:
36     GlobalMutex *mMutex;
37 #endif
38 };
39 }  // namespace priv
40 
41 using ScopedGlobalEGLMutexLock = priv::ScopedGlobalMutexLock<priv::GlobalMutexChoice::EGL>;
42 using ScopedGlobalEGLSyncObjectMutexLock =
43     priv::ScopedGlobalMutexLock<priv::GlobalMutexChoice::Sync>;
44 
45 // For Context protection where lock is optional. Works slower than ScopedGlobalMutexLock.
46 class [[nodiscard]] ScopedOptionalGlobalMutexLock final : angle::NonCopyable
47 {
48   public:
49     explicit ScopedOptionalGlobalMutexLock(bool enabled);
50     ~ScopedOptionalGlobalMutexLock();
51 
52   private:
53     priv::GlobalMutex *mMutex;
54 };
55 
56 #if defined(ANGLE_PLATFORM_WINDOWS) && !defined(ANGLE_STATIC)
57 void AllocateGlobalMutex();
58 void DeallocateGlobalMutex();
59 #endif
60 
61 }  // namespace egl
62 
63 #endif  // LIBANGLE_GLOBAL_MUTEX_H_
64