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