// Copyright 2019 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_sequence.h"

#include "base/task/single_thread_task_runner.h"
#include "gpu/command_buffer/service/scheduler.h"

#if DCHECK_IS_ON()
#include "third_party/abseil-cpp/absl/base/attributes.h"
#endif

namespace gpu {

namespace {

#if DCHECK_IS_ON()
ABSL_CONST_INIT thread_local bool schedule_task_disallowed = false;
#endif  // DCHECK_IS_ON()

}  // namespace

ScopedAllowScheduleGpuTask::~ScopedAllowScheduleGpuTask() = default;

ScopedAllowScheduleGpuTask::ScopedAllowScheduleGpuTask()
#if DCHECK_IS_ON()
    : resetter_(&schedule_task_disallowed, false)
#endif  // DCHECK_IS_ON()
{
}

// static
void SchedulerSequence::DefaultDisallowScheduleTaskOnCurrentThread() {
#if DCHECK_IS_ON()
  schedule_task_disallowed = true;
#endif
}

SchedulerSequence::SchedulerSequence(
    Scheduler* scheduler,
    scoped_refptr<base::SingleThreadTaskRunner> task_runner,
    bool target_thread_is_always_available)
    : SingleTaskSequence(),
      scheduler_(scheduler),
      sequence_id_(scheduler->CreateSequence(SchedulingPriority::kHigh,
                                             std::move(task_runner))),
      target_thread_is_always_available_(target_thread_is_always_available) {}

// Note: this drops tasks not executed yet.
SchedulerSequence::~SchedulerSequence() {
  scheduler_->DestroySequence(sequence_id_);
}

// SingleTaskSequence implementation.
SequenceId SchedulerSequence::GetSequenceId() {
  return sequence_id_;
}

bool SchedulerSequence::ShouldYield() {
  return scheduler_->ShouldYield(sequence_id_);
}

void SchedulerSequence::ScheduleTask(base::OnceClosure task,
                                     std::vector<SyncToken> sync_token_fences,
                                     ReportingCallback report_callback) {
  // If your CL is failing this DCHECK, then that means you are probably calling
  // ScheduleGpuTask at a point that cannot be supported by Android Webview.
  // Consider using ScheduleOrRetainGpuTask which will delay (not reorder) the
  // task in Android Webview until the next DrawAndSwap.
  if (!target_thread_is_always_available_) {
#if DCHECK_IS_ON()
    DCHECK(!schedule_task_disallowed)
        << "If your CL is failing this DCHECK, then that means you are "
           "probably calling ScheduleGpuTask at a point that cannot be "
           "supported by Android Webview. Consider using "
           "ScheduleOrRetainGpuTask, which will delay (not reorder) the task "
           "in Android Webview until the next DrawAndSwap.";
#endif
  }

  ScheduleOrRetainTask(std::move(task), std::move(sync_token_fences),
                       std::move(report_callback));
}

void SchedulerSequence::ScheduleOrRetainTask(
    base::OnceClosure task,
    std::vector<gpu::SyncToken> sync_token_fences,
    ReportingCallback report_callback) {
  scheduler_->ScheduleTask(Scheduler::Task(sequence_id_, std::move(task),
                                           std::move(sync_token_fences),
                                           std::move(report_callback)));
}

void SchedulerSequence::ContinueTask(base::OnceClosure task) {
  scheduler_->ContinueTask(sequence_id_, std::move(task));
}

}  // namespace gpu
