| // Copyright 2020 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_COMMAND_BUFFER_SERVICE_EXTERNAL_SEMAPHORE_POOL_H_ | |
| #define GPU_COMMAND_BUFFER_SERVICE_EXTERNAL_SEMAPHORE_POOL_H_ | |
| #include <vulkan/vulkan_core.h> | |
| #include <vector> | |
| #include "base/containers/circular_deque.h" | |
| #include "base/memory/raw_ptr.h" | |
| #include "base/memory/weak_ptr.h" | |
| #include "gpu/command_buffer/service/external_semaphore.h" | |
| #include "gpu/gpu_gles2_export.h" | |
| namespace gpu { | |
| class SharedContextState; | |
| class GPU_GLES2_EXPORT ExternalSemaphorePool { | |
| public: | |
| explicit ExternalSemaphorePool(SharedContextState* shared_context_state); | |
| ~ExternalSemaphorePool(); | |
| ExternalSemaphorePool(const ExternalSemaphorePool&) = delete; | |
| ExternalSemaphorePool& operator=(const ExternalSemaphorePool&) = delete; | |
| // Get a semaphore from the pool. If there is no semaphore available in the | |
| // pool, a new semaphore will be created. | |
| ExternalSemaphore GetOrCreateSemaphore(); | |
| // Return a semaphore to the pool. It can be reused or released immediately. | |
| void ReturnSemaphore(ExternalSemaphore semaphore); | |
| // Return semaphores to the pool. They can be reused or released immediately. | |
| void ReturnSemaphores(std::vector<ExternalSemaphore> semaphores); | |
| // Return semaphores to the pool. They cannot be reused or released until all | |
| // submitted GPU work is finished. | |
| void ReturnSemaphoresWithFenceHelper( | |
| std::vector<ExternalSemaphore> semaphores); | |
| private: | |
| const raw_ptr<SharedContextState> shared_context_state_; | |
| base::circular_deque<ExternalSemaphore> semaphores_; | |
| base::WeakPtrFactory<ExternalSemaphorePool> weak_ptr_factory_{this}; | |
| }; | |
| } // namespace gpu | |
| #endif // GPU_COMMAND_BUFFER_SERVICE_EXTERNAL_SEMAPHORE_POOL_H_ |