summaryrefslogtreecommitdiffstats
path: root/cc/debug/frame_timing_tracker.cc
blob: dda2e311e51da758a65908b029bdf2db8925d254 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
// Copyright 2015 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 "cc/debug/frame_timing_tracker.h"

#include <stdint.h>

#include <algorithm>
#include <limits>

#include "base/metrics/histogram.h"
#include "cc/trees/layer_tree_host_impl.h"
#include "cc/trees/proxy.h"

namespace cc {
namespace {
int kSendTimingIntervalMS = 200;
}

FrameTimingTracker::CompositeTimingEvent::CompositeTimingEvent(
    int _frame_id,
    base::TimeTicks _timestamp)
    : frame_id(_frame_id), timestamp(_timestamp) {
}

FrameTimingTracker::CompositeTimingEvent::~CompositeTimingEvent() {
}

FrameTimingTracker::MainFrameTimingEvent::MainFrameTimingEvent(
    int frame_id,
    base::TimeTicks timestamp,
    base::TimeTicks end_time)
    : frame_id(frame_id), timestamp(timestamp), end_time(end_time) {
}

FrameTimingTracker::MainFrameTimingEvent::~MainFrameTimingEvent() {
}

// static
scoped_ptr<FrameTimingTracker> FrameTimingTracker::Create(
    LayerTreeHostImpl* layer_tree_host_impl) {
  return make_scoped_ptr(new FrameTimingTracker(layer_tree_host_impl));
}

FrameTimingTracker::FrameTimingTracker(LayerTreeHostImpl* layer_tree_host_impl)
    : layer_tree_host_impl_(layer_tree_host_impl),
      post_events_notifier_(
          layer_tree_host_impl_->GetTaskRunner(),
          base::Bind(&FrameTimingTracker::PostEvents, base::Unretained(this)),
          base::TimeDelta::FromMilliseconds(kSendTimingIntervalMS)) {}

FrameTimingTracker::~FrameTimingTracker() {
}

void FrameTimingTracker::SaveTimeStamps(
    base::TimeTicks timestamp,
    const std::vector<FrameAndRectIds>& frame_ids) {
  if (!composite_events_)
    composite_events_.reset(new CompositeTimingSet);
  for (const auto& pair : frame_ids) {
    (*composite_events_)[pair.second].push_back(
        CompositeTimingEvent(pair.first, timestamp));
  }
  if (!post_events_notifier_.HasPendingNotification())
    post_events_notifier_.Schedule();
}

void FrameTimingTracker::SaveMainFrameTimeStamps(
    const std::vector<int64_t>& request_ids,
    base::TimeTicks main_frame_time,
    base::TimeTicks end_time,
    int source_frame_number) {
  if (!main_frame_events_)
    main_frame_events_.reset(new MainFrameTimingSet);
  for (const auto& request : request_ids) {
    std::vector<MainFrameTimingEvent>& events = (*main_frame_events_)[request];
    events.push_back(
        MainFrameTimingEvent(source_frame_number, main_frame_time, end_time));
  }
  if (!post_events_notifier_.HasPendingNotification())
    post_events_notifier_.Schedule();
}

scoped_ptr<FrameTimingTracker::CompositeTimingSet>
FrameTimingTracker::GroupCompositeCountsByRectId() {
  if (!composite_events_)
    return make_scoped_ptr(new CompositeTimingSet);
  for (auto& infos : *composite_events_) {
    std::sort(
        infos.second.begin(), infos.second.end(),
        [](const CompositeTimingEvent& lhs, const CompositeTimingEvent& rhs) {
          return lhs.timestamp < rhs.timestamp;
        });
  }
  return std::move(composite_events_);
}

scoped_ptr<FrameTimingTracker::MainFrameTimingSet>
FrameTimingTracker::GroupMainFrameCountsByRectId() {
  if (!main_frame_events_)
    return make_scoped_ptr(new MainFrameTimingSet);
  for (auto& infos : *main_frame_events_) {
    std::sort(
        infos.second.begin(), infos.second.end(),
        [](const MainFrameTimingEvent& lhs, const MainFrameTimingEvent& rhs) {
          return lhs.timestamp < rhs.timestamp;
        });
  }
  return std::move(main_frame_events_);
}

void FrameTimingTracker::PostEvents() {
  layer_tree_host_impl_->PostFrameTimingEvents(GroupCompositeCountsByRectId(),
                                               GroupMainFrameCountsByRectId());
}

}  // namespace cc