| // Copyright 2021 The Chromium Authors | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #include "gpu/command_buffer/service/scheduler_task_runner.h" | |
| #include <utility> | |
| #include <vector> | |
| #include "base/auto_reset.h" | |
| #include "base/check.h" | |
| #include "base/functional/bind.h" | |
| #include "gpu/command_buffer/common/sync_token.h" | |
| #include "gpu/command_buffer/service/scheduler.h" | |
| namespace gpu { | |
| namespace { | |
| constinit thread_local const SchedulerTaskRunner* current_task_runner = nullptr; | |
| } // namespace | |
| SchedulerTaskRunner::SchedulerTaskRunner(Scheduler& scheduler, | |
| SequenceId sequence_id) | |
| : scheduler_(scheduler), sequence_id_(sequence_id) {} | |
| SchedulerTaskRunner::~SchedulerTaskRunner() = default; | |
| void SchedulerTaskRunner::ShutDown() { | |
| base::AutoLock lock(lock_); | |
| is_running_ = false; | |
| } | |
| bool SchedulerTaskRunner::PostDelayedTask(const base::Location& from_here, | |
| base::OnceClosure task, | |
| base::TimeDelta delay) { | |
| return PostNonNestableDelayedTask(from_here, std::move(task), delay); | |
| } | |
| bool SchedulerTaskRunner::PostNonNestableDelayedTask( | |
| const base::Location& from_here, | |
| base::OnceClosure task, | |
| base::TimeDelta delay) { | |
| base::AutoLock lock(lock_); | |
| if (!is_running_) | |
| return false; | |
| CHECK(delay.is_zero()); | |
| scheduler_->ScheduleTask(Scheduler::Task( | |
| sequence_id_, | |
| base::BindOnce(&SchedulerTaskRunner::RunTask, this, std::move(task)), | |
| std::vector<SyncToken>())); | |
| return true; | |
| } | |
| bool SchedulerTaskRunner::RunsTasksInCurrentSequence() const { | |
| return current_task_runner && | |
| current_task_runner->sequence_id_ == sequence_id_; | |
| } | |
| void SchedulerTaskRunner::RunTask(base::OnceClosure task) { | |
| { | |
| // Handle the case where the sequence was shut down after this task was | |
| // posted but before it had a chance to run. Note that we don't hold the | |
| // lock while invoking the task below, since a task may reenter this object | |
| // to e.g. call ShutDown() or post a new task. | |
| base::AutoLock lock(lock_); | |
| if (!is_running_) | |
| return; | |
| } | |
| // Scheduler doesn't nest tasks, so we don't support nesting. | |
| const base::AutoReset<const SchedulerTaskRunner*> resetter( | |
| ¤t_task_runner, this, nullptr); | |
| std::move(task).Run(); | |
| } | |
| } // namespace gpu |