blob: 61f98813ce4dee56b8a457f9072308bf60297fd9 [file] [log] [blame]
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#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 {
// A wrapper around eglLockVulkanQueueANGLE and eglUnlockVulkanQueueANGLE to
// make it look like base::Lock. When VulkanFromANGLE is enabled, those EGL
// calls are made if locking is necessary. Otherwise a base::Lock is used.
class COMPONENT_EXPORT(VULKAN) LOCKABLE VulkanQueueLock {
public:
VulkanQueueLock(const VulkanQueueLock&) = delete;
VulkanQueueLock& operator=(const VulkanQueueLock&) = delete;
VulkanQueueLock() = default;
// EGLDisplay is a void *, that's defined here to avoid having to include the
// EGL headers in this file.
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:
// If display_ is set (it is not EGL_NO_DISPLAY),
// eglLockVulkanQueueANGLE/eglUnlockVulkanQueueANGLE will be used for locking.
// Otherwise lock_ will be used.
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_;
};
} // namespace gpu
#endif // GPU_VULKAN_VULKAN_QUEUE_LOCK_H_