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