xref: /aosp_15_r20/external/angle/src/libANGLE/OverlayWidgets.h (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2019 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 // OverlayWidgets.h:
7*8975f5c5SAndroid Build Coastguard Worker //    Defines the Overlay* widget classes and corresponding enums.
8*8975f5c5SAndroid Build Coastguard Worker //
9*8975f5c5SAndroid Build Coastguard Worker 
10*8975f5c5SAndroid Build Coastguard Worker #ifndef LIBANGLE_OVERLAYWIDGETS_H_
11*8975f5c5SAndroid Build Coastguard Worker #define LIBANGLE_OVERLAYWIDGETS_H_
12*8975f5c5SAndroid Build Coastguard Worker 
13*8975f5c5SAndroid Build Coastguard Worker #include "common/angleutils.h"
14*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Overlay_autogen.h"
15*8975f5c5SAndroid Build Coastguard Worker 
16*8975f5c5SAndroid Build Coastguard Worker namespace gl
17*8975f5c5SAndroid Build Coastguard Worker {
18*8975f5c5SAndroid Build Coastguard Worker class Overlay;
19*8975f5c5SAndroid Build Coastguard Worker class OverlayState;
20*8975f5c5SAndroid Build Coastguard Worker 
21*8975f5c5SAndroid Build Coastguard Worker namespace overlay_impl
22*8975f5c5SAndroid Build Coastguard Worker {
23*8975f5c5SAndroid Build Coastguard Worker class AppendWidgetDataHelper;
24*8975f5c5SAndroid Build Coastguard Worker }  // namespace overlay_impl
25*8975f5c5SAndroid Build Coastguard Worker 
26*8975f5c5SAndroid Build Coastguard Worker enum class WidgetType
27*8975f5c5SAndroid Build Coastguard Worker {
28*8975f5c5SAndroid Build Coastguard Worker     // Text types:
29*8975f5c5SAndroid Build Coastguard Worker 
30*8975f5c5SAndroid Build Coastguard Worker     // A total count of some event.
31*8975f5c5SAndroid Build Coastguard Worker     Count,
32*8975f5c5SAndroid Build Coastguard Worker     // A single line of ASCII text.  Retains content until changed.
33*8975f5c5SAndroid Build Coastguard Worker     Text,
34*8975f5c5SAndroid Build Coastguard Worker     // A per-second value.
35*8975f5c5SAndroid Build Coastguard Worker     PerSecond,
36*8975f5c5SAndroid Build Coastguard Worker 
37*8975f5c5SAndroid Build Coastguard Worker     // Graph types:
38*8975f5c5SAndroid Build Coastguard Worker 
39*8975f5c5SAndroid Build Coastguard Worker     // A graph of the last N values.
40*8975f5c5SAndroid Build Coastguard Worker     RunningGraph,
41*8975f5c5SAndroid Build Coastguard Worker     // A histogram of the last N values (values between 0 and 1).
42*8975f5c5SAndroid Build Coastguard Worker     RunningHistogram,
43*8975f5c5SAndroid Build Coastguard Worker 
44*8975f5c5SAndroid Build Coastguard Worker     InvalidEnum,
45*8975f5c5SAndroid Build Coastguard Worker     EnumCount = InvalidEnum,
46*8975f5c5SAndroid Build Coastguard Worker };
47*8975f5c5SAndroid Build Coastguard Worker 
48*8975f5c5SAndroid Build Coastguard Worker namespace overlay
49*8975f5c5SAndroid Build Coastguard Worker {
50*8975f5c5SAndroid Build Coastguard Worker class Text;
51*8975f5c5SAndroid Build Coastguard Worker class Widget
52*8975f5c5SAndroid Build Coastguard Worker {
53*8975f5c5SAndroid Build Coastguard Worker   public:
~Widget()54*8975f5c5SAndroid Build Coastguard Worker     virtual ~Widget() {}
55*8975f5c5SAndroid Build Coastguard Worker 
56*8975f5c5SAndroid Build Coastguard Worker     virtual const Text *getDescriptionWidget() const;
57*8975f5c5SAndroid Build Coastguard Worker 
58*8975f5c5SAndroid Build Coastguard Worker   protected:
59*8975f5c5SAndroid Build Coastguard Worker     WidgetType type;
60*8975f5c5SAndroid Build Coastguard Worker     // Whether this item should be drawn.
61*8975f5c5SAndroid Build Coastguard Worker     bool enabled = false;
62*8975f5c5SAndroid Build Coastguard Worker 
63*8975f5c5SAndroid Build Coastguard Worker     // For text items, size of the font.  This is a value in [0, overlay::kFontMipCount) which
64*8975f5c5SAndroid Build Coastguard Worker     // determines the font size to use.
65*8975f5c5SAndroid Build Coastguard Worker     int fontSize;
66*8975f5c5SAndroid Build Coastguard Worker 
67*8975f5c5SAndroid Build Coastguard Worker     // The area covered by the item, predetermined by the overlay class.  Negative values
68*8975f5c5SAndroid Build Coastguard Worker     // indicate offset from the left/bottom of the image.
69*8975f5c5SAndroid Build Coastguard Worker     int32_t coords[4];
70*8975f5c5SAndroid Build Coastguard Worker     float color[4];
71*8975f5c5SAndroid Build Coastguard Worker 
72*8975f5c5SAndroid Build Coastguard Worker     // In some cases, a widget may need to match its contents (e.g. graph height scaling) with
73*8975f5c5SAndroid Build Coastguard Worker     // another related widget.  In such a case, this pointer will point to the widget it needs to
74*8975f5c5SAndroid Build Coastguard Worker     // match to.
75*8975f5c5SAndroid Build Coastguard Worker     Widget *matchToWidget;
76*8975f5c5SAndroid Build Coastguard Worker 
77*8975f5c5SAndroid Build Coastguard Worker     friend class gl::Overlay;
78*8975f5c5SAndroid Build Coastguard Worker     friend class gl::OverlayState;
79*8975f5c5SAndroid Build Coastguard Worker     friend class overlay_impl::AppendWidgetDataHelper;
80*8975f5c5SAndroid Build Coastguard Worker };
81*8975f5c5SAndroid Build Coastguard Worker 
82*8975f5c5SAndroid Build Coastguard Worker class Count : public Widget
83*8975f5c5SAndroid Build Coastguard Worker {
84*8975f5c5SAndroid Build Coastguard Worker   public:
~Count()85*8975f5c5SAndroid Build Coastguard Worker     ~Count() override {}
add(uint64_t n)86*8975f5c5SAndroid Build Coastguard Worker     void add(uint64_t n) { count += n; }
set(uint64_t n)87*8975f5c5SAndroid Build Coastguard Worker     void set(uint64_t n) { count = n; }
reset()88*8975f5c5SAndroid Build Coastguard Worker     void reset() { count = 0; }
89*8975f5c5SAndroid Build Coastguard Worker 
90*8975f5c5SAndroid Build Coastguard Worker   protected:
91*8975f5c5SAndroid Build Coastguard Worker     uint64_t count = 0;
92*8975f5c5SAndroid Build Coastguard Worker 
93*8975f5c5SAndroid Build Coastguard Worker     friend class gl::Overlay;
94*8975f5c5SAndroid Build Coastguard Worker     friend class overlay_impl::AppendWidgetDataHelper;
95*8975f5c5SAndroid Build Coastguard Worker };
96*8975f5c5SAndroid Build Coastguard Worker 
97*8975f5c5SAndroid Build Coastguard Worker class PerSecond : public Count
98*8975f5c5SAndroid Build Coastguard Worker {
99*8975f5c5SAndroid Build Coastguard Worker   public:
~PerSecond()100*8975f5c5SAndroid Build Coastguard Worker     ~PerSecond() override {}
101*8975f5c5SAndroid Build Coastguard Worker 
102*8975f5c5SAndroid Build Coastguard Worker   protected:
103*8975f5c5SAndroid Build Coastguard Worker     uint64_t lastPerSecondCount = 0;
104*8975f5c5SAndroid Build Coastguard Worker 
105*8975f5c5SAndroid Build Coastguard Worker     friend class gl::Overlay;
106*8975f5c5SAndroid Build Coastguard Worker     friend class overlay_impl::AppendWidgetDataHelper;
107*8975f5c5SAndroid Build Coastguard Worker };
108*8975f5c5SAndroid Build Coastguard Worker 
109*8975f5c5SAndroid Build Coastguard Worker class Text : public Widget
110*8975f5c5SAndroid Build Coastguard Worker {
111*8975f5c5SAndroid Build Coastguard Worker   public:
~Text()112*8975f5c5SAndroid Build Coastguard Worker     ~Text() override {}
set(std::string && str)113*8975f5c5SAndroid Build Coastguard Worker     void set(std::string &&str) { text = std::move(str); }
114*8975f5c5SAndroid Build Coastguard Worker 
115*8975f5c5SAndroid Build Coastguard Worker   protected:
116*8975f5c5SAndroid Build Coastguard Worker     std::string text;
117*8975f5c5SAndroid Build Coastguard Worker 
118*8975f5c5SAndroid Build Coastguard Worker     friend class overlay_impl::AppendWidgetDataHelper;
119*8975f5c5SAndroid Build Coastguard Worker };
120*8975f5c5SAndroid Build Coastguard Worker 
121*8975f5c5SAndroid Build Coastguard Worker class RunningGraph : public Widget
122*8975f5c5SAndroid Build Coastguard Worker {
123*8975f5c5SAndroid Build Coastguard Worker   public:
124*8975f5c5SAndroid Build Coastguard Worker     // Out of line constructor to satisfy chromium-style.
125*8975f5c5SAndroid Build Coastguard Worker     RunningGraph(size_t n);
126*8975f5c5SAndroid Build Coastguard Worker     ~RunningGraph() override;
127*8975f5c5SAndroid Build Coastguard Worker 
add(uint64_t n)128*8975f5c5SAndroid Build Coastguard Worker     void add(uint64_t n)
129*8975f5c5SAndroid Build Coastguard Worker     {
130*8975f5c5SAndroid Build Coastguard Worker         if (!ignoreFirstValue)
131*8975f5c5SAndroid Build Coastguard Worker         {
132*8975f5c5SAndroid Build Coastguard Worker             runningValues[lastValueIndex] += n;
133*8975f5c5SAndroid Build Coastguard Worker         }
134*8975f5c5SAndroid Build Coastguard Worker     }
135*8975f5c5SAndroid Build Coastguard Worker 
next()136*8975f5c5SAndroid Build Coastguard Worker     void next()
137*8975f5c5SAndroid Build Coastguard Worker     {
138*8975f5c5SAndroid Build Coastguard Worker         if (ignoreFirstValue)
139*8975f5c5SAndroid Build Coastguard Worker         {
140*8975f5c5SAndroid Build Coastguard Worker             ignoreFirstValue = false;
141*8975f5c5SAndroid Build Coastguard Worker         }
142*8975f5c5SAndroid Build Coastguard Worker         else
143*8975f5c5SAndroid Build Coastguard Worker         {
144*8975f5c5SAndroid Build Coastguard Worker             lastValueIndex                = (lastValueIndex + 1) % runningValues.size();
145*8975f5c5SAndroid Build Coastguard Worker             runningValues[lastValueIndex] = 0;
146*8975f5c5SAndroid Build Coastguard Worker         }
147*8975f5c5SAndroid Build Coastguard Worker     }
148*8975f5c5SAndroid Build Coastguard Worker 
149*8975f5c5SAndroid Build Coastguard Worker     const Text *getDescriptionWidget() const override;
150*8975f5c5SAndroid Build Coastguard Worker 
151*8975f5c5SAndroid Build Coastguard Worker   protected:
152*8975f5c5SAndroid Build Coastguard Worker     std::vector<uint64_t> runningValues;
153*8975f5c5SAndroid Build Coastguard Worker     size_t lastValueIndex = 0;
154*8975f5c5SAndroid Build Coastguard Worker     Text description;
155*8975f5c5SAndroid Build Coastguard Worker     bool ignoreFirstValue = true;
156*8975f5c5SAndroid Build Coastguard Worker 
157*8975f5c5SAndroid Build Coastguard Worker     friend class gl::Overlay;
158*8975f5c5SAndroid Build Coastguard Worker     friend class gl::OverlayState;
159*8975f5c5SAndroid Build Coastguard Worker     friend class overlay_impl::AppendWidgetDataHelper;
160*8975f5c5SAndroid Build Coastguard Worker };
161*8975f5c5SAndroid Build Coastguard Worker 
162*8975f5c5SAndroid Build Coastguard Worker class RunningHistogram : public RunningGraph
163*8975f5c5SAndroid Build Coastguard Worker {
164*8975f5c5SAndroid Build Coastguard Worker   public:
RunningHistogram(size_t n)165*8975f5c5SAndroid Build Coastguard Worker     RunningHistogram(size_t n) : RunningGraph(n) {}
~RunningHistogram()166*8975f5c5SAndroid Build Coastguard Worker     ~RunningHistogram() override {}
167*8975f5c5SAndroid Build Coastguard Worker 
set(float n)168*8975f5c5SAndroid Build Coastguard Worker     void set(float n)
169*8975f5c5SAndroid Build Coastguard Worker     {
170*8975f5c5SAndroid Build Coastguard Worker         ASSERT(n >= 0.0f && n <= 1.0f);
171*8975f5c5SAndroid Build Coastguard Worker         uint64_t rank =
172*8975f5c5SAndroid Build Coastguard Worker             n == 1.0f ? runningValues.size() - 1 : static_cast<uint64_t>(n * runningValues.size());
173*8975f5c5SAndroid Build Coastguard Worker 
174*8975f5c5SAndroid Build Coastguard Worker         runningValues[lastValueIndex] = rank;
175*8975f5c5SAndroid Build Coastguard Worker     }
176*8975f5c5SAndroid Build Coastguard Worker 
177*8975f5c5SAndroid Build Coastguard Worker   private:
178*8975f5c5SAndroid Build Coastguard Worker     // Do not use the add() function from RunningGraph
179*8975f5c5SAndroid Build Coastguard Worker     using RunningGraph::add;
180*8975f5c5SAndroid Build Coastguard Worker };
181*8975f5c5SAndroid Build Coastguard Worker 
182*8975f5c5SAndroid Build Coastguard Worker // If overlay is disabled, all the above classes would be replaced with Mock, turning them into
183*8975f5c5SAndroid Build Coastguard Worker // noop.
184*8975f5c5SAndroid Build Coastguard Worker class Mock
185*8975f5c5SAndroid Build Coastguard Worker {
186*8975f5c5SAndroid Build Coastguard Worker   public:
reset()187*8975f5c5SAndroid Build Coastguard Worker     void reset() const {}
188*8975f5c5SAndroid Build Coastguard Worker     template <typename T>
set(T)189*8975f5c5SAndroid Build Coastguard Worker     void set(T) const
190*8975f5c5SAndroid Build Coastguard Worker     {}
191*8975f5c5SAndroid Build Coastguard Worker     template <typename T>
add(T)192*8975f5c5SAndroid Build Coastguard Worker     void add(T) const
193*8975f5c5SAndroid Build Coastguard Worker     {}
next()194*8975f5c5SAndroid Build Coastguard Worker     void next() const {}
195*8975f5c5SAndroid Build Coastguard Worker };
196*8975f5c5SAndroid Build Coastguard Worker 
197*8975f5c5SAndroid Build Coastguard Worker }  // namespace overlay
198*8975f5c5SAndroid Build Coastguard Worker 
199*8975f5c5SAndroid Build Coastguard Worker }  // namespace gl
200*8975f5c5SAndroid Build Coastguard Worker 
201*8975f5c5SAndroid Build Coastguard Worker #endif  // LIBANGLE_OVERLAYWIDGETS_H_
202