// // Copyright 2023 The ANGLE Project Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // // GlobalMutex.h: Defines Global Mutex and utilities. #ifndef LIBANGLE_GLOBAL_MUTEX_H_ #define LIBANGLE_GLOBAL_MUTEX_H_ #include "common/angleutils.h" namespace egl { namespace priv { class GlobalMutex; enum class GlobalMutexChoice { // All EGL entry points except EGL Sync objects EGL, // Entry points relating to EGL Sync objects Sync, }; template class [[nodiscard]] ScopedGlobalMutexLock final : angle::NonCopyable { public: ScopedGlobalMutexLock(); ~ScopedGlobalMutexLock(); #if !defined(ANGLE_ENABLE_GLOBAL_MUTEX_LOAD_TIME_ALLOCATE) private: GlobalMutex *mMutex; #endif }; } // namespace priv using ScopedGlobalEGLMutexLock = priv::ScopedGlobalMutexLock; using ScopedGlobalEGLSyncObjectMutexLock = priv::ScopedGlobalMutexLock; // For Context protection where lock is optional. Works slower than ScopedGlobalMutexLock. class [[nodiscard]] ScopedOptionalGlobalMutexLock final : angle::NonCopyable { public: explicit ScopedOptionalGlobalMutexLock(bool enabled); ~ScopedOptionalGlobalMutexLock(); private: priv::GlobalMutex *mMutex; }; #if defined(ANGLE_PLATFORM_WINDOWS) && !defined(ANGLE_STATIC) void AllocateGlobalMutex(); void DeallocateGlobalMutex(); #endif } // namespace egl #endif // LIBANGLE_GLOBAL_MUTEX_H_