blob: 7e663c4799c66b9615812e9ab018b42be5209cba [file] [log] [blame]
//
// 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 <GlobalMutexChoice mutexChoice>
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<priv::GlobalMutexChoice::EGL>;
using ScopedGlobalEGLSyncObjectMutexLock =
priv::ScopedGlobalMutexLock<priv::GlobalMutexChoice::Sync>;
// 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_