blob: 3b660d3342053b60ead2b161f9b7e4150c751a37 [file] [log] [blame]
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "third_party/blink/renderer/platform/scheduler/main_thread/prioritize_compositing_after_input_experiment.h"
#include "base/metrics/field_trial_params.h"
#include "base/strings/string_number_conversions.h"
#include "third_party/blink/renderer/platform/scheduler/common/features.h"
#include "third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.h"
#include "third_party/blink/renderer/platform/scheduler/main_thread/main_thread_task_queue.h"
namespace blink {
namespace scheduler {
namespace {
// Prioritize compositing after input trial.
constexpr const char kPrioritizeCompositingAfterInputTrial[] =
"BlinkSchedulerPrioritizeCompositingAfterInput";
constexpr const char kNumberOfCompositingTasksToPrioritizeAfterInputParam[] =
"number_of_tasks";
constexpr int kDefaultNumberOfTasksToPrioritizeAfterInput = 1;
int GetNumberOfCompositingTasksToPrioritizeAfterInput() {
if (!base::FeatureList::IsEnabled(kPrioritizeCompositingAfterInput))
return 0;
int number_of_tasks;
if (!base::StringToInt(
base::GetFieldTrialParamValue(
kPrioritizeCompositingAfterInputTrial,
kNumberOfCompositingTasksToPrioritizeAfterInputParam),
&number_of_tasks)) {
return kDefaultNumberOfTasksToPrioritizeAfterInput;
}
return number_of_tasks;
}
} // namespace
PrioritizeCompositingAfterInputExperiment::
PrioritizeCompositingAfterInputExperiment(
MainThreadSchedulerImpl* scheduler)
: scheduler_(scheduler),
increased_compositing_priority_(
base::FeatureList::IsEnabled(kHighestPriorityForCompositingAfterInput)
? base::sequence_manager::TaskQueue::QueuePriority::
kHighestPriority
: base::sequence_manager::TaskQueue::QueuePriority::
kHighPriority),
number_of_tasks_to_prioritize_after_input_(
GetNumberOfCompositingTasksToPrioritizeAfterInput()),
trigger_type_(
base::FeatureList::IsEnabled(
kUseExplicitSignalForTriggeringCompositingPrioritization)
? TriggerType::kExplicitSignal
: TriggerType::kInferredFromInput),
stop_signal_type_(base::FeatureList::IsEnabled(
kUseWillBeginMainFrameForCompositingPrioritization)
? StopSignalType::kWillBeginMainFrameSignal
: StopSignalType::kAllCompositingTasks),
number_of_tasks_to_prioritize_(0) {}
PrioritizeCompositingAfterInputExperiment::
~PrioritizeCompositingAfterInputExperiment() {}
void PrioritizeCompositingAfterInputExperiment::
SetNumberOfCompositingTasksToPrioritize(int number_of_tasks) {
number_of_tasks = std::max(number_of_tasks, 0);
bool did_prioritize_compositing = number_of_tasks_to_prioritize_ > 0;
number_of_tasks_to_prioritize_ = number_of_tasks;
bool should_prioritize_compositing = number_of_tasks_to_prioritize_ > 0;
if (did_prioritize_compositing != should_prioritize_compositing)
scheduler_->SetShouldPrioritizeCompositing(should_prioritize_compositing);
}
base::sequence_manager::TaskQueue::QueuePriority
PrioritizeCompositingAfterInputExperiment::GetIncreasedCompositingPriority() {
return increased_compositing_priority_;
}
void PrioritizeCompositingAfterInputExperiment::OnTaskCompleted(
MainThreadTaskQueue* queue) {
if (!queue)
return;
if (queue->queue_type() == MainThreadTaskQueue::QueueType::kInput &&
trigger_type_ == TriggerType::kInferredFromInput) {
SetNumberOfCompositingTasksToPrioritize(
number_of_tasks_to_prioritize_after_input_);
} else if (queue->queue_type() ==
MainThreadTaskQueue::QueueType::kCompositor &&
stop_signal_type_ == StopSignalType::kAllCompositingTasks) {
SetNumberOfCompositingTasksToPrioritize(number_of_tasks_to_prioritize_ - 1);
}
}
void PrioritizeCompositingAfterInputExperiment::OnWillBeginMainFrame() {
if (stop_signal_type_ != StopSignalType::kWillBeginMainFrameSignal)
return;
SetNumberOfCompositingTasksToPrioritize(number_of_tasks_to_prioritize_ - 1);
}
void PrioritizeCompositingAfterInputExperiment::OnMainFrameRequestedForInput() {
if (trigger_type_ != TriggerType::kExplicitSignal)
return;
SetNumberOfCompositingTasksToPrioritize(
number_of_tasks_to_prioritize_after_input_);
}
} // namespace scheduler
} // namespace blink