#ifndef GPU_VULKAN_VULKAN_QUEUE_LOCK_H_
#define GPU_VULKAN_VULKAN_QUEUE_LOCK_H_
#include "base/component_export.h"
#include "base/synchronization/lock.h"
#include "base/thread_annotations.h"
namespace gpu {
class COMPONENT_EXPORT(VULKAN) LOCKABLE VulkanQueueLock {
public:
VulkanQueueLock(const VulkanQueueLock&) = delete;
VulkanQueueLock& operator=(const VulkanQueueLock&) = delete;
VulkanQueueLock() = default;
using EGLDisplay = void*;
explicit VulkanQueueLock(EGLDisplay display);
~VulkanQueueLock() = default;
void Acquire() EXCLUSIVE_LOCK_FUNCTION();
void Release() UNLOCK_FUNCTION();
void AssertAcquired() const ASSERT_EXCLUSIVE_LOCK() {
if (display_ == nullptr) {
lock_.AssertAcquired();
}
}
private:
EGLDisplay display_;
base::Lock lock_;
};
class SCOPED_LOCKABLE VulkanQueueAutoLockMaybe {
STACK_ALLOCATED();
public:
explicit VulkanQueueAutoLockMaybe(VulkanQueueLock* lock)
EXCLUSIVE_LOCK_FUNCTION(lock)
: lock_(lock) {
if (lock_) {
lock_->Acquire();
}
}
VulkanQueueAutoLockMaybe(const VulkanQueueAutoLockMaybe&) = delete;
VulkanQueueAutoLockMaybe& operator=(const VulkanQueueAutoLockMaybe&) = delete;
~VulkanQueueAutoLockMaybe() UNLOCK_FUNCTION() {
if (lock_) {
lock_->AssertAcquired();
lock_->Release();
}
}
private:
VulkanQueueLock* const lock_;
};
}
#endif