| // Copyright 2024 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_BLOCKING_SEQUENCE_RUNNER_H_ | |
| #define GPU_COMMAND_BUFFER_SERVICE_BLOCKING_SEQUENCE_RUNNER_H_ | |
| #include <vector> | |
| #include "base/memory/raw_ptr.h" | |
| #include "base/synchronization/lock.h" | |
| #include "base/thread_annotations.h" | |
| #include "base/time/time.h" | |
| #include "gpu/command_buffer/common/sync_token.h" | |
| #include "gpu/command_buffer/service/gpu_command_buffer_service_export.h" | |
| #include "gpu/command_buffer/service/sequence_id.h" | |
| #include "gpu/command_buffer/service/task_graph.h" | |
| namespace gpu { | |
| class Scheduler; | |
| // BlockingSequenceRunner owns a TaskGraph::Sequence and supports running | |
| // its tasks blockingly. | |
| class GPU_COMMAND_BUFFER_SERVICE_EXPORT BlockingSequenceRunner { | |
| public: | |
| explicit BlockingSequenceRunner(Scheduler* scheduler) LOCKS_EXCLUDED(lock()); | |
| BlockingSequenceRunner(const BlockingSequenceRunner&) = delete; | |
| BlockingSequenceRunner& operator=(const BlockingSequenceRunner&) = delete; | |
| ~BlockingSequenceRunner() LOCKS_EXCLUDED(lock()); | |
| SequenceId GetSequenceId() const; | |
| bool HasTasks() const LOCKS_EXCLUDED(lock()); | |
| uint32_t AddTask(TaskCallback task_calback, | |
| std::vector<SyncToken> wait_fences, | |
| const SyncToken& release, | |
| ReportingCallback report_callback = {}) | |
| LOCKS_EXCLUDED(lock()); | |
| uint32_t AddTask(base::OnceClosure task_closure, | |
| std::vector<SyncToken> wait_fences, | |
| const SyncToken& release, | |
| ReportingCallback report_callback = {}) | |
| LOCKS_EXCLUDED(lock()); | |
| [[nodiscard]] ScopedSyncPointClientState CreateSyncPointClientState( | |
| CommandBufferNamespace namespace_id, | |
| CommandBufferId command_buffer_id) LOCKS_EXCLUDED(lock()); | |
| // Runs tasks in the sequence blockingly until the sequence is empty. | |
| void RunAllTasks() LOCKS_EXCLUDED(lock()); | |
| private: | |
| class Sequence : public TaskGraph::Sequence { | |
| public: | |
| explicit Sequence(Scheduler* scheduler); | |
| void RunAllTasks() EXCLUSIVE_LOCKS_REQUIRED(lock()); | |
| private: | |
| const raw_ptr<Scheduler> scheduler_ = nullptr; | |
| }; | |
| base::Lock& lock() const LOCK_RETURNED(task_graph_->lock()) { | |
| return task_graph_->lock(); | |
| } | |
| const raw_ptr<TaskGraph> task_graph_ = nullptr; | |
| raw_ptr<Sequence> sequence_ = nullptr; | |
| }; | |
| } // namespace gpu | |
| #endif // GPU_COMMAND_BUFFER_SERVICE_BLOCKING_SEQUENCE_RUNNER_H_ |