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