xref: /aosp_15_r20/external/angle/src/libANGLE/histogram_macros.h (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2015 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker //
6*8975f5c5SAndroid Build Coastguard Worker // histogram_macros.h:
7*8975f5c5SAndroid Build Coastguard Worker //   Helpers for making histograms, to keep consistency with Chromium's
8*8975f5c5SAndroid Build Coastguard Worker //   histogram_macros.h.
9*8975f5c5SAndroid Build Coastguard Worker 
10*8975f5c5SAndroid Build Coastguard Worker #ifndef LIBANGLE_HISTOGRAM_MACROS_H_
11*8975f5c5SAndroid Build Coastguard Worker #define LIBANGLE_HISTOGRAM_MACROS_H_
12*8975f5c5SAndroid Build Coastguard Worker 
13*8975f5c5SAndroid Build Coastguard Worker #include <platform/PlatformMethods.h>
14*8975f5c5SAndroid Build Coastguard Worker 
15*8975f5c5SAndroid Build Coastguard Worker #define ANGLE_HISTOGRAM_TIMES(name, sample) ANGLE_HISTOGRAM_CUSTOM_TIMES(name, sample, 1, 10000, 50)
16*8975f5c5SAndroid Build Coastguard Worker 
17*8975f5c5SAndroid Build Coastguard Worker #define ANGLE_HISTOGRAM_MEDIUM_TIMES(name, sample) \
18*8975f5c5SAndroid Build Coastguard Worker     ANGLE_HISTOGRAM_CUSTOM_TIMES(name, sample, 10, 180000, 50)
19*8975f5c5SAndroid Build Coastguard Worker 
20*8975f5c5SAndroid Build Coastguard Worker // Use this macro when times can routinely be much longer than 10 seconds.
21*8975f5c5SAndroid Build Coastguard Worker #define ANGLE_HISTOGRAM_LONG_TIMES(name, sample) \
22*8975f5c5SAndroid Build Coastguard Worker     ANGLE_HISTOGRAM_CUSTOM_TIMES(name, sample, 1, 3600000, 50)
23*8975f5c5SAndroid Build Coastguard Worker 
24*8975f5c5SAndroid Build Coastguard Worker // Use this macro when times can routinely be much longer than 10 seconds and
25*8975f5c5SAndroid Build Coastguard Worker // you want 100 buckets.
26*8975f5c5SAndroid Build Coastguard Worker #define ANGLE_HISTOGRAM_LONG_TIMES_100(name, sample) \
27*8975f5c5SAndroid Build Coastguard Worker     ANGLE_HISTOGRAM_CUSTOM_TIMES(name, sample, 1, 3600000, 100)
28*8975f5c5SAndroid Build Coastguard Worker 
29*8975f5c5SAndroid Build Coastguard Worker // For folks that need real specific times, use this to select a precise range
30*8975f5c5SAndroid Build Coastguard Worker // of times you want plotted, and the number of buckets you want used.
31*8975f5c5SAndroid Build Coastguard Worker #define ANGLE_HISTOGRAM_CUSTOM_TIMES(name, sample, min, max, bucket_count) \
32*8975f5c5SAndroid Build Coastguard Worker     ANGLE_HISTOGRAM_CUSTOM_COUNTS(name, sample, min, max, bucket_count)
33*8975f5c5SAndroid Build Coastguard Worker 
34*8975f5c5SAndroid Build Coastguard Worker #define ANGLE_HISTOGRAM_COUNTS(name, sample) \
35*8975f5c5SAndroid Build Coastguard Worker     ANGLE_HISTOGRAM_CUSTOM_COUNTS(name, sample, 1, 1000000, 50)
36*8975f5c5SAndroid Build Coastguard Worker 
37*8975f5c5SAndroid Build Coastguard Worker #define ANGLE_HISTOGRAM_COUNTS_100(name, sample) \
38*8975f5c5SAndroid Build Coastguard Worker     ANGLE_HISTOGRAM_CUSTOM_COUNTS(name, sample, 1, 100, 50)
39*8975f5c5SAndroid Build Coastguard Worker 
40*8975f5c5SAndroid Build Coastguard Worker #define ANGLE_HISTOGRAM_COUNTS_10000(name, sample) \
41*8975f5c5SAndroid Build Coastguard Worker     ANGLE_HISTOGRAM_CUSTOM_COUNTS(name, sample, 1, 10000, 50)
42*8975f5c5SAndroid Build Coastguard Worker 
43*8975f5c5SAndroid Build Coastguard Worker #define ANGLE_HISTOGRAM_CUSTOM_COUNTS(name, sample, min, max, bucket_count)                       \
44*8975f5c5SAndroid Build Coastguard Worker     ANGLEPlatformCurrent()->histogramCustomCounts(ANGLEPlatformCurrent(), name, sample, min, max, \
45*8975f5c5SAndroid Build Coastguard Worker                                                   bucket_count)
46*8975f5c5SAndroid Build Coastguard Worker 
47*8975f5c5SAndroid Build Coastguard Worker #define ANGLE_HISTOGRAM_PERCENTAGE(name, under_one_hundred) \
48*8975f5c5SAndroid Build Coastguard Worker     ANGLE_HISTOGRAM_ENUMERATION(name, under_one_hundred, 101)
49*8975f5c5SAndroid Build Coastguard Worker 
50*8975f5c5SAndroid Build Coastguard Worker #define ANGLE_HISTOGRAM_BOOLEAN(name, sample) \
51*8975f5c5SAndroid Build Coastguard Worker     ANGLEPlatformCurrent()->histogramBoolean(ANGLEPlatformCurrent(), name, sample)
52*8975f5c5SAndroid Build Coastguard Worker 
53*8975f5c5SAndroid Build Coastguard Worker #define ANGLE_HISTOGRAM_ENUMERATION(name, sample, boundary_value)                      \
54*8975f5c5SAndroid Build Coastguard Worker     ANGLEPlatformCurrent()->histogramEnumeration(ANGLEPlatformCurrent(), name, sample, \
55*8975f5c5SAndroid Build Coastguard Worker                                                  boundary_value)
56*8975f5c5SAndroid Build Coastguard Worker 
57*8975f5c5SAndroid Build Coastguard Worker #define ANGLE_HISTOGRAM_MEMORY_KB(name, sample) \
58*8975f5c5SAndroid Build Coastguard Worker     ANGLE_HISTOGRAM_CUSTOM_COUNTS(name, sample, 1000, 500000, 50)
59*8975f5c5SAndroid Build Coastguard Worker 
60*8975f5c5SAndroid Build Coastguard Worker #define ANGLE_HISTOGRAM_MEMORY_MB(name, sample) \
61*8975f5c5SAndroid Build Coastguard Worker     ANGLE_HISTOGRAM_CUSTOM_COUNTS(name, sample, 1, 1000, 50)
62*8975f5c5SAndroid Build Coastguard Worker 
63*8975f5c5SAndroid Build Coastguard Worker #define ANGLE_HISTOGRAM_SPARSE_SLOWLY(name, sample) \
64*8975f5c5SAndroid Build Coastguard Worker     ANGLEPlatformCurrent()->histogramSparse(ANGLEPlatformCurrent(), name, sample)
65*8975f5c5SAndroid Build Coastguard Worker 
66*8975f5c5SAndroid Build Coastguard Worker // Scoped class which logs its time on this earth as a UMA statistic. This is
67*8975f5c5SAndroid Build Coastguard Worker // recommended for when you want a histogram which measures the time it takes
68*8975f5c5SAndroid Build Coastguard Worker // for a method to execute. This measures up to 10 seconds.
69*8975f5c5SAndroid Build Coastguard Worker #define SCOPED_ANGLE_HISTOGRAM_TIMER(name) \
70*8975f5c5SAndroid Build Coastguard Worker     SCOPED_ANGLE_HISTOGRAM_TIMER_EXPANDER(name, false, __COUNTER__)
71*8975f5c5SAndroid Build Coastguard Worker 
72*8975f5c5SAndroid Build Coastguard Worker // Similar scoped histogram timer, but this uses ANGLE_HISTOGRAM_LONG_TIMES_100,
73*8975f5c5SAndroid Build Coastguard Worker // which measures up to an hour, and uses 100 buckets. This is more expensive
74*8975f5c5SAndroid Build Coastguard Worker // to store, so only use if this often takes >10 seconds.
75*8975f5c5SAndroid Build Coastguard Worker #define SCOPED_ANGLE_HISTOGRAM_LONG_TIMER(name) \
76*8975f5c5SAndroid Build Coastguard Worker     SCOPED_ANGLE_HISTOGRAM_TIMER_EXPANDER(name, true, __COUNTER__)
77*8975f5c5SAndroid Build Coastguard Worker 
78*8975f5c5SAndroid Build Coastguard Worker // This nested macro is necessary to expand __COUNTER__ to an actual value.
79*8975f5c5SAndroid Build Coastguard Worker #define SCOPED_ANGLE_HISTOGRAM_TIMER_EXPANDER(name, is_long, key) \
80*8975f5c5SAndroid Build Coastguard Worker     SCOPED_ANGLE_HISTOGRAM_TIMER_UNIQUE(name, is_long, key)
81*8975f5c5SAndroid Build Coastguard Worker 
82*8975f5c5SAndroid Build Coastguard Worker #define SCOPED_ANGLE_HISTOGRAM_TIMER_UNIQUE(name, is_long, key)                         \
83*8975f5c5SAndroid Build Coastguard Worker     class [[nodiscard]] ScopedHistogramTimer##key                                       \
84*8975f5c5SAndroid Build Coastguard Worker     {                                                                                   \
85*8975f5c5SAndroid Build Coastguard Worker       public:                                                                           \
86*8975f5c5SAndroid Build Coastguard Worker         ScopedHistogramTimer##key()                                                     \
87*8975f5c5SAndroid Build Coastguard Worker             : constructed_(ANGLEPlatformCurrent()->currentTime(ANGLEPlatformCurrent())) \
88*8975f5c5SAndroid Build Coastguard Worker         {}                                                                              \
89*8975f5c5SAndroid Build Coastguard Worker         ~ScopedHistogramTimer##key()                                                    \
90*8975f5c5SAndroid Build Coastguard Worker         {                                                                               \
91*8975f5c5SAndroid Build Coastguard Worker             if (constructed_ == 0)                                                      \
92*8975f5c5SAndroid Build Coastguard Worker                 return;                                                                 \
93*8975f5c5SAndroid Build Coastguard Worker             auto *platform = ANGLEPlatformCurrent();                                    \
94*8975f5c5SAndroid Build Coastguard Worker             double elapsed = platform->currentTime(platform) - constructed_;            \
95*8975f5c5SAndroid Build Coastguard Worker             int elapsedMS  = static_cast<int>(elapsed * 1000.0);                        \
96*8975f5c5SAndroid Build Coastguard Worker             if (is_long)                                                                \
97*8975f5c5SAndroid Build Coastguard Worker             {                                                                           \
98*8975f5c5SAndroid Build Coastguard Worker                 ANGLE_HISTOGRAM_LONG_TIMES_100(name, elapsedMS);                        \
99*8975f5c5SAndroid Build Coastguard Worker             }                                                                           \
100*8975f5c5SAndroid Build Coastguard Worker             else                                                                        \
101*8975f5c5SAndroid Build Coastguard Worker             {                                                                           \
102*8975f5c5SAndroid Build Coastguard Worker                 ANGLE_HISTOGRAM_TIMES(name, elapsedMS);                                 \
103*8975f5c5SAndroid Build Coastguard Worker             }                                                                           \
104*8975f5c5SAndroid Build Coastguard Worker         }                                                                               \
105*8975f5c5SAndroid Build Coastguard Worker                                                                                         \
106*8975f5c5SAndroid Build Coastguard Worker       private:                                                                          \
107*8975f5c5SAndroid Build Coastguard Worker         double constructed_;                                                            \
108*8975f5c5SAndroid Build Coastguard Worker     } scoped_histogram_timer_##key
109*8975f5c5SAndroid Build Coastguard Worker 
110*8975f5c5SAndroid Build Coastguard Worker #endif  // LIBANGLE_HISTOGRAM_MACROS_H_
111