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