| Index: components/scheduler/renderer/renderer_scheduler_impl.cc
|
| diff --git a/components/scheduler/renderer/renderer_scheduler_impl.cc b/components/scheduler/renderer/renderer_scheduler_impl.cc
|
| index c02624efe41caf4f0b62d006dc0eeb7f3611df19..209e5631e34542d21da17fa03e605f9478016ae3 100644
|
| --- a/components/scheduler/renderer/renderer_scheduler_impl.cc
|
| +++ b/components/scheduler/renderer/renderer_scheduler_impl.cc
|
| @@ -8,6 +8,7 @@
|
| #include "base/debug/stack_trace.h"
|
| #include "base/logging.h"
|
| #include "base/memory/ptr_util.h"
|
| +#include "base/metrics/histogram_macros.h"
|
| #include "base/trace_event/trace_event.h"
|
| #include "base/trace_event/trace_event_argument.h"
|
| #include "cc/output/begin_frame_args.h"
|
| @@ -22,7 +23,7 @@ namespace scheduler {
|
| namespace {
|
| // The run time of loading tasks is strongly bimodal. The vast majority are
|
| // very cheap, but there are usually a handful of very expensive tasks (e.g ~1
|
| -// second on a mobile device) so we take a very pesimistic view when estimating
|
| +// second on a mobile device) so we take a very pessimistic view when estimating
|
| // the cost of loading tasks.
|
| const int kLoadingTaskEstimationSampleCount = 1000;
|
| const double kLoadingTaskEstimationPercentile = 99;
|
| @@ -49,14 +50,14 @@ RendererSchedulerImpl::RendererSchedulerImpl(
|
| base::TimeDelta()),
|
| render_widget_scheduler_signals_(this),
|
| control_task_runner_(helper_.ControlTaskRunner()),
|
| - compositor_task_runner_(
|
| - helper_.NewTaskQueue(TaskQueue::Spec("compositor_tq")
|
| - .SetShouldMonitorQuiescence(true))),
|
| + compositor_task_runner_(helper_.NewTaskQueue(
|
| + TaskQueue::Spec("compositor_tq").SetShouldMonitorQuiescence(true))),
|
| delayed_update_policy_runner_(
|
| base::Bind(&RendererSchedulerImpl::UpdatePolicy,
|
| base::Unretained(this)),
|
| helper_.ControlTaskRunner()),
|
| - main_thread_only_(compositor_task_runner_,
|
| + main_thread_only_(this,
|
| + compositor_task_runner_,
|
| helper_.scheduler_tqm_delegate().get()),
|
| policy_may_need_update_(&any_thread_lock_),
|
| weak_factory_(this) {
|
| @@ -78,6 +79,7 @@ RendererSchedulerImpl::RendererSchedulerImpl(
|
| this);
|
|
|
| helper_.SetObserver(this);
|
| + helper_.SetTaskTimeTracker(this);
|
| }
|
|
|
| RendererSchedulerImpl::~RendererSchedulerImpl() {
|
| @@ -101,6 +103,7 @@ RendererSchedulerImpl::~RendererSchedulerImpl() {
|
| }
|
|
|
| RendererSchedulerImpl::MainThreadOnly::MainThreadOnly(
|
| + RendererSchedulerImpl* renderer_scheduler_impl,
|
| const scoped_refptr<TaskQueue>& compositor_task_runner,
|
| base::TickClock* time_source)
|
| : loading_task_cost_estimator(time_source,
|
| @@ -109,6 +112,8 @@ RendererSchedulerImpl::MainThreadOnly::MainThreadOnly(
|
| timer_task_cost_estimator(time_source,
|
| kTimerTaskEstimationSampleCount,
|
| kTimerTaskEstimationPercentile),
|
| + queueing_time_estimator(renderer_scheduler_impl,
|
| + base::TimeDelta::FromSeconds(1)),
|
| idle_time_estimator(compositor_task_runner,
|
| time_source,
|
| kShortIdlePeriodDurationSampleCount,
|
| @@ -1383,6 +1388,21 @@ void RendererSchedulerImpl::OnTriedToExecuteBlockedTask(
|
| }
|
| }
|
|
|
| +void RendererSchedulerImpl::ReportTaskTime(base::TimeTicks start_time,
|
| + base::TimeTicks end_time) {
|
| + MainThreadOnly().queueing_time_estimator.OnToplevelTaskCompleted(start_time,
|
| + end_time);
|
| +}
|
| +
|
| +void RendererSchedulerImpl::OnQueueingTimeForWindowEstimated(
|
| + base::TimeDelta queueing_time) {
|
| + UMA_HISTOGRAM_TIMES("RendererScheduler.ExpectedTaskQueueingDuration",
|
| + queueing_time);
|
| + TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"),
|
| + "estimated_queueing_time_for_window",
|
| + queueing_time.InMillisecondsF());
|
| +}
|
| +
|
| // static
|
| const char* RendererSchedulerImpl::UseCaseToString(UseCase use_case) {
|
| switch (use_case) {
|
|
|