1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CC_DEBUG_DEVTOOLS_INSTRUMENTATION_H_
6#define CC_DEBUG_DEVTOOLS_INSTRUMENTATION_H_
7
8#include "base/debug/trace_event.h"
9
10namespace cc {
11namespace devtools_instrumentation {
12
13namespace internal {
14const char kCategory[] = TRACE_DISABLED_BY_DEFAULT("devtools.timeline");
15const char kCategoryFrame[] =
16    TRACE_DISABLED_BY_DEFAULT("devtools.timeline.frame");
17const char kFrameId[] = "frameId";
18const char kLayerId[] = "layerId";
19const char kLayerTreeId[] = "layerTreeId";
20const char kPixelRefId[] = "pixelRefId";
21
22const char kImageDecodeTask[] = "ImageDecodeTask";
23const char kBeginFrame[] = "BeginFrame";
24const char kActivateLayerTree[] = "ActivateLayerTree";
25const char kRequestMainThreadFrame[] = "RequestMainThreadFrame";
26const char kDrawFrame[] = "DrawFrame";
27}  // namespace internal
28
29const char kRasterTask[] = "RasterTask";
30const char kPaintSetup[] = "PaintSetup";
31const char kUpdateLayer[] = "UpdateLayer";
32
33class ScopedLayerTask {
34 public:
35  ScopedLayerTask(const char* event_name, int layer_id)
36    : event_name_(event_name) {
37    TRACE_EVENT_BEGIN1(internal::kCategory, event_name_,
38        internal::kLayerId, layer_id);
39  }
40  ~ScopedLayerTask() {
41    TRACE_EVENT_END0(internal::kCategory, event_name_);
42  }
43 private:
44  const char* event_name_;
45
46  DISALLOW_COPY_AND_ASSIGN(ScopedLayerTask);
47};
48
49class ScopedImageDecodeTask {
50 public:
51  explicit ScopedImageDecodeTask(void* pixelRef) {
52    TRACE_EVENT_BEGIN1(internal::kCategory, internal::kImageDecodeTask,
53        internal::kPixelRefId, reinterpret_cast<uint64>(pixelRef));
54  }
55  ~ScopedImageDecodeTask() {
56    TRACE_EVENT_END0(internal::kCategory, internal::kImageDecodeTask);
57  }
58 private:
59  DISALLOW_COPY_AND_ASSIGN(ScopedImageDecodeTask);
60};
61
62class ScopedLayerTreeTask {
63 public:
64  ScopedLayerTreeTask(const char* event_name,
65                      int layer_id,
66                      int layer_tree_host_id)
67    : event_name_(event_name) {
68    TRACE_EVENT_BEGIN2(internal::kCategory, event_name_,
69        internal::kLayerId, layer_id,
70        internal::kLayerTreeId, layer_tree_host_id);
71  }
72  ~ScopedLayerTreeTask() {
73    TRACE_EVENT_END0(internal::kCategory, event_name_);
74  }
75 private:
76  const char* event_name_;
77
78  DISALLOW_COPY_AND_ASSIGN(ScopedLayerTreeTask);
79};
80
81struct ScopedLayerObjectTracker
82    : public base::debug::TraceScopedTrackableObject<int> {
83  explicit ScopedLayerObjectTracker(int layer_id)
84      : base::debug::TraceScopedTrackableObject<int>(
85            internal::kCategory,
86            internal::kLayerId,
87            layer_id) {
88  }
89
90 private:
91  DISALLOW_COPY_AND_ASSIGN(ScopedLayerObjectTracker);
92};
93
94inline void DidActivateLayerTree(int layer_tree_host_id, int frame_id) {
95  TRACE_EVENT_INSTANT2(internal::kCategoryFrame,
96                       internal::kActivateLayerTree,
97                       TRACE_EVENT_SCOPE_THREAD,
98                       internal::kLayerTreeId,
99                       layer_tree_host_id,
100                       internal::kFrameId,
101                       frame_id);
102}
103
104inline void DidBeginFrame(int layer_tree_host_id) {
105  TRACE_EVENT_INSTANT1(internal::kCategoryFrame,
106                       internal::kBeginFrame,
107                       TRACE_EVENT_SCOPE_THREAD,
108                       internal::kLayerTreeId,
109                       layer_tree_host_id);
110}
111
112inline void DidDrawFrame(int layer_tree_host_id) {
113  TRACE_EVENT_INSTANT1(internal::kCategoryFrame,
114                       internal::kDrawFrame,
115                       TRACE_EVENT_SCOPE_THREAD,
116                       internal::kLayerTreeId,
117                       layer_tree_host_id);
118}
119
120inline void DidRequestMainThreadFrame(int layer_tree_host_id) {
121  TRACE_EVENT_INSTANT1(internal::kCategoryFrame,
122                       internal::kRequestMainThreadFrame,
123                       TRACE_EVENT_SCOPE_THREAD,
124                       internal::kLayerTreeId,
125                       layer_tree_host_id);
126}
127
128}  // namespace devtools_instrumentation
129}  // namespace cc
130
131#endif  // CC_DEBUG_DEVTOOLS_INSTRUMENTATION_H_
132