1 // Copyright 2016 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 #include "cc/base/devtools_instrumentation.h"
6
7 namespace cc {
8 namespace devtools_instrumentation {
9 namespace {
10
RecordMicrosecondTimesUmaByDecodeType(const std::string & metric_prefix,base::TimeDelta duration,base::TimeDelta min,base::TimeDelta max,uint32_t bucket_count,ScopedImageDecodeTask::DecodeType decode_type_)11 void RecordMicrosecondTimesUmaByDecodeType(
12 const std::string& metric_prefix,
13 base::TimeDelta duration,
14 base::TimeDelta min,
15 base::TimeDelta max,
16 uint32_t bucket_count,
17 ScopedImageDecodeTask::DecodeType decode_type_) {
18 switch (decode_type_) {
19 case ScopedImageDecodeTask::kSoftware:
20 UmaHistogramCustomMicrosecondsTimes(metric_prefix + ".Software", duration,
21 min, max, bucket_count);
22 break;
23 case ScopedImageDecodeTask::kGpu:
24 UmaHistogramCustomMicrosecondsTimes(metric_prefix + ".Gpu", duration, min,
25 max, bucket_count);
26 break;
27 }
28 }
29 } // namespace
30
31 namespace internal {
32 constexpr const char CategoryName::CategoryName::kTimeline[];
33 constexpr const char CategoryName::CategoryName::kTimelineFrame[];
34 const char kData[] = "data";
35 const char kFrameId[] = "frameId";
36 const char kLayerId[] = "layerId";
37 const char kLayerTreeId[] = "layerTreeId";
38 const char kPixelRefId[] = "pixelRefId";
39
40 const char kImageUploadTask[] = "ImageUploadTask";
41 const char kImageDecodeTask[] = "ImageDecodeTask";
42 const char kBeginFrame[] = "BeginFrame";
43 const char kNeedsBeginFrameChanged[] = "NeedsBeginFrameChanged";
44 const char kActivateLayerTree[] = "ActivateLayerTree";
45 const char kRequestMainThreadFrame[] = "RequestMainThreadFrame";
46 const char kBeginMainThreadFrame[] = "BeginMainThreadFrame";
47 const char kDrawFrame[] = "DrawFrame";
48 const char kCompositeLayers[] = "CompositeLayers";
49 } // namespace internal
50
51 const char kPaintSetup[] = "PaintSetup";
52 const char kUpdateLayer[] = "UpdateLayer";
53
ScopedImageUploadTask(const void * image_ptr,ImageType image_type)54 ScopedImageUploadTask::ScopedImageUploadTask(const void* image_ptr,
55 ImageType image_type)
56 : ScopedImageTask(image_type) {
57 TRACE_EVENT_BEGIN1(internal::CategoryName::kTimeline,
58 internal::kImageUploadTask, internal::kPixelRefId,
59 reinterpret_cast<uint64_t>(image_ptr));
60 }
61
~ScopedImageUploadTask()62 ScopedImageUploadTask::~ScopedImageUploadTask() {
63 TRACE_EVENT_END0(internal::CategoryName::kTimeline,
64 internal::kImageUploadTask);
65 if (suppress_metrics_)
66 return;
67
68 auto duration = base::TimeTicks::Now() - start_time_;
69 switch (image_type_) {
70 case ImageType::kWebP:
71 UmaHistogramCustomMicrosecondsTimes(
72 "Renderer4.ImageUploadTaskDurationUs.WebP", duration, hist_min_,
73 hist_max_, bucket_count_);
74 break;
75 case ImageType::kJpeg:
76 UmaHistogramCustomMicrosecondsTimes(
77 "Renderer4.ImageUploadTaskDurationUs.Jpeg", duration, hist_min_,
78 hist_max_, bucket_count_);
79 break;
80 case ImageType::kOther:
81 UmaHistogramCustomMicrosecondsTimes(
82 "Renderer4.ImageUploadTaskDurationUs.Other", duration, hist_min_,
83 hist_max_, bucket_count_);
84 break;
85 }
86 }
87
ScopedImageDecodeTask(const void * image_ptr,DecodeType decode_type,TaskType task_type,ImageType image_type)88 ScopedImageDecodeTask::ScopedImageDecodeTask(const void* image_ptr,
89 DecodeType decode_type,
90 TaskType task_type,
91 ImageType image_type)
92 : ScopedImageTask(image_type),
93 decode_type_(decode_type),
94 task_type_(task_type) {
95 TRACE_EVENT_BEGIN1(internal::CategoryName::kTimeline,
96 internal::kImageDecodeTask, internal::kPixelRefId,
97 reinterpret_cast<uint64_t>(image_ptr));
98 }
99
~ScopedImageDecodeTask()100 ScopedImageDecodeTask::~ScopedImageDecodeTask() {
101 TRACE_EVENT_END0(internal::CategoryName::kTimeline,
102 internal::kImageDecodeTask);
103 if (suppress_metrics_)
104 return;
105
106 auto duration = base::TimeTicks::Now() - start_time_;
107 switch (image_type_) {
108 case ImageType::kWebP:
109 RecordMicrosecondTimesUmaByDecodeType(
110 "Renderer4.ImageDecodeTaskDurationUs.WebP", duration, hist_min_,
111 hist_max_, bucket_count_, decode_type_);
112 break;
113 case ImageType::kJpeg:
114 RecordMicrosecondTimesUmaByDecodeType(
115 "Renderer4.ImageDecodeTaskDurationUs.Jpeg", duration, hist_min_,
116 hist_max_, bucket_count_, decode_type_);
117 break;
118 case ImageType::kOther:
119 RecordMicrosecondTimesUmaByDecodeType(
120 "Renderer4.ImageDecodeTaskDurationUs.Other", duration, hist_min_,
121 hist_max_, bucket_count_, decode_type_);
122 break;
123 }
124 switch (task_type_) {
125 case kInRaster:
126 RecordMicrosecondTimesUmaByDecodeType(
127 "Renderer4.ImageDecodeTaskDurationUs", duration, hist_min_, hist_max_,
128 bucket_count_, decode_type_);
129 break;
130 case kOutOfRaster:
131 RecordMicrosecondTimesUmaByDecodeType(
132 "Renderer4.ImageDecodeTaskDurationUs.OutOfRaster", duration,
133 hist_min_, hist_max_, bucket_count_, decode_type_);
134 break;
135 }
136 }
137
138 } // namespace devtools_instrumentation
139 } // namespace cc
140