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