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 // Overlay.h: 7*8975f5c5SAndroid Build Coastguard Worker // Defines the Overlay class that handles overlay widgets. 8*8975f5c5SAndroid Build Coastguard Worker // 9*8975f5c5SAndroid Build Coastguard Worker 10*8975f5c5SAndroid Build Coastguard Worker #ifndef LIBANGLE_OVERLAY_H_ 11*8975f5c5SAndroid Build Coastguard Worker #define LIBANGLE_OVERLAY_H_ 12*8975f5c5SAndroid Build Coastguard Worker 13*8975f5c5SAndroid Build Coastguard Worker #include "common/PackedEnums.h" 14*8975f5c5SAndroid Build Coastguard Worker #include "common/angleutils.h" 15*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Error.h" 16*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/OverlayWidgets.h" 17*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/angletypes.h" 18*8975f5c5SAndroid Build Coastguard Worker 19*8975f5c5SAndroid Build Coastguard Worker namespace rx 20*8975f5c5SAndroid Build Coastguard Worker { 21*8975f5c5SAndroid Build Coastguard Worker class OverlayImpl; 22*8975f5c5SAndroid Build Coastguard Worker class GLImplFactory; 23*8975f5c5SAndroid Build Coastguard Worker } // namespace rx 24*8975f5c5SAndroid Build Coastguard Worker 25*8975f5c5SAndroid Build Coastguard Worker namespace gl 26*8975f5c5SAndroid Build Coastguard Worker { 27*8975f5c5SAndroid Build Coastguard Worker class Context; 28*8975f5c5SAndroid Build Coastguard Worker 29*8975f5c5SAndroid Build Coastguard Worker class OverlayState : angle::NonCopyable 30*8975f5c5SAndroid Build Coastguard Worker { 31*8975f5c5SAndroid Build Coastguard Worker public: 32*8975f5c5SAndroid Build Coastguard Worker OverlayState(); 33*8975f5c5SAndroid Build Coastguard Worker ~OverlayState(); 34*8975f5c5SAndroid Build Coastguard Worker 35*8975f5c5SAndroid Build Coastguard Worker size_t getWidgetCoordinatesBufferSize() const; 36*8975f5c5SAndroid Build Coastguard Worker size_t getTextWidgetsBufferSize() const; 37*8975f5c5SAndroid Build Coastguard Worker size_t getGraphWidgetsBufferSize() const; 38*8975f5c5SAndroid Build Coastguard Worker 39*8975f5c5SAndroid Build Coastguard Worker const uint8_t *getFontData() const; 40*8975f5c5SAndroid Build Coastguard Worker void fillWidgetData(const gl::Extents &imageExtents, 41*8975f5c5SAndroid Build Coastguard Worker uint8_t *textData, 42*8975f5c5SAndroid Build Coastguard Worker uint8_t *graphData, 43*8975f5c5SAndroid Build Coastguard Worker uint32_t *activeTextWidgetCountOut, 44*8975f5c5SAndroid Build Coastguard Worker uint32_t *activeGraphWidgetCountOut) const; 45*8975f5c5SAndroid Build Coastguard Worker getEnabledWidgetCount()46*8975f5c5SAndroid Build Coastguard Worker uint32_t getEnabledWidgetCount() const { return mEnabledWidgetCount; } 47*8975f5c5SAndroid Build Coastguard Worker 48*8975f5c5SAndroid Build Coastguard Worker private: 49*8975f5c5SAndroid Build Coastguard Worker friend class Overlay; 50*8975f5c5SAndroid Build Coastguard Worker 51*8975f5c5SAndroid Build Coastguard Worker uint32_t mEnabledWidgetCount; 52*8975f5c5SAndroid Build Coastguard Worker 53*8975f5c5SAndroid Build Coastguard Worker angle::PackedEnumMap<WidgetId, std::unique_ptr<overlay::Widget>> mOverlayWidgets; 54*8975f5c5SAndroid Build Coastguard Worker }; 55*8975f5c5SAndroid Build Coastguard Worker 56*8975f5c5SAndroid Build Coastguard Worker class Overlay : angle::NonCopyable 57*8975f5c5SAndroid Build Coastguard Worker { 58*8975f5c5SAndroid Build Coastguard Worker public: 59*8975f5c5SAndroid Build Coastguard Worker Overlay(rx::GLImplFactory *implFactory); 60*8975f5c5SAndroid Build Coastguard Worker ~Overlay(); 61*8975f5c5SAndroid Build Coastguard Worker 62*8975f5c5SAndroid Build Coastguard Worker void init(); 63*8975f5c5SAndroid Build Coastguard Worker void destroy(const gl::Context *context); 64*8975f5c5SAndroid Build Coastguard Worker 65*8975f5c5SAndroid Build Coastguard Worker void onSwap() const; 66*8975f5c5SAndroid Build Coastguard Worker getTextWidget(WidgetId id)67*8975f5c5SAndroid Build Coastguard Worker overlay::Text *getTextWidget(WidgetId id) const 68*8975f5c5SAndroid Build Coastguard Worker { 69*8975f5c5SAndroid Build Coastguard Worker return getWidgetAs<overlay::Text, WidgetType::Text>(id); 70*8975f5c5SAndroid Build Coastguard Worker } getCountWidget(WidgetId id)71*8975f5c5SAndroid Build Coastguard Worker overlay::Count *getCountWidget(WidgetId id) const 72*8975f5c5SAndroid Build Coastguard Worker { 73*8975f5c5SAndroid Build Coastguard Worker return getWidgetAs<overlay::Count, WidgetType::Count>(id); 74*8975f5c5SAndroid Build Coastguard Worker } getPerSecondWidget(WidgetId id)75*8975f5c5SAndroid Build Coastguard Worker overlay::PerSecond *getPerSecondWidget(WidgetId id) const 76*8975f5c5SAndroid Build Coastguard Worker { 77*8975f5c5SAndroid Build Coastguard Worker return getWidgetAs<overlay::PerSecond, WidgetType::PerSecond>(id); 78*8975f5c5SAndroid Build Coastguard Worker } getRunningGraphWidget(WidgetId id)79*8975f5c5SAndroid Build Coastguard Worker overlay::RunningGraph *getRunningGraphWidget(WidgetId id) const 80*8975f5c5SAndroid Build Coastguard Worker { 81*8975f5c5SAndroid Build Coastguard Worker return getWidgetAs<overlay::RunningGraph, WidgetType::RunningGraph>(id); 82*8975f5c5SAndroid Build Coastguard Worker } getRunningHistogramWidget(WidgetId id)83*8975f5c5SAndroid Build Coastguard Worker overlay::RunningHistogram *getRunningHistogramWidget(WidgetId id) const 84*8975f5c5SAndroid Build Coastguard Worker { 85*8975f5c5SAndroid Build Coastguard Worker return getWidgetAs<overlay::RunningHistogram, WidgetType::RunningHistogram>(id); 86*8975f5c5SAndroid Build Coastguard Worker } 87*8975f5c5SAndroid Build Coastguard Worker getImplementation()88*8975f5c5SAndroid Build Coastguard Worker rx::OverlayImpl *getImplementation() const { return mImplementation.get(); } 89*8975f5c5SAndroid Build Coastguard Worker isEnabled()90*8975f5c5SAndroid Build Coastguard Worker bool isEnabled() const 91*8975f5c5SAndroid Build Coastguard Worker { 92*8975f5c5SAndroid Build Coastguard Worker return mImplementation != nullptr && mState.getEnabledWidgetCount() > 0; 93*8975f5c5SAndroid Build Coastguard Worker } 94*8975f5c5SAndroid Build Coastguard Worker 95*8975f5c5SAndroid Build Coastguard Worker private: 96*8975f5c5SAndroid Build Coastguard Worker template <typename Widget, WidgetType Type> getWidgetAs(WidgetId id)97*8975f5c5SAndroid Build Coastguard Worker Widget *getWidgetAs(WidgetId id) const 98*8975f5c5SAndroid Build Coastguard Worker { 99*8975f5c5SAndroid Build Coastguard Worker ASSERT(mState.mOverlayWidgets[id] != nullptr); 100*8975f5c5SAndroid Build Coastguard Worker ASSERT(mState.mOverlayWidgets[id]->type == Type); 101*8975f5c5SAndroid Build Coastguard Worker return rx::GetAs<Widget>(mState.mOverlayWidgets[id].get()); 102*8975f5c5SAndroid Build Coastguard Worker } 103*8975f5c5SAndroid Build Coastguard Worker void initOverlayWidgets(); 104*8975f5c5SAndroid Build Coastguard Worker void enableOverlayWidgetsFromEnvironment(); 105*8975f5c5SAndroid Build Coastguard Worker 106*8975f5c5SAndroid Build Coastguard Worker // Time tracking for PerSecond items. 107*8975f5c5SAndroid Build Coastguard Worker mutable double mLastPerSecondUpdate; 108*8975f5c5SAndroid Build Coastguard Worker 109*8975f5c5SAndroid Build Coastguard Worker OverlayState mState; 110*8975f5c5SAndroid Build Coastguard Worker std::unique_ptr<rx::OverlayImpl> mImplementation; 111*8975f5c5SAndroid Build Coastguard Worker }; 112*8975f5c5SAndroid Build Coastguard Worker 113*8975f5c5SAndroid Build Coastguard Worker class MockOverlay 114*8975f5c5SAndroid Build Coastguard Worker { 115*8975f5c5SAndroid Build Coastguard Worker public: 116*8975f5c5SAndroid Build Coastguard Worker MockOverlay(rx::GLImplFactory *implFactory); 117*8975f5c5SAndroid Build Coastguard Worker ~MockOverlay(); 118*8975f5c5SAndroid Build Coastguard Worker init()119*8975f5c5SAndroid Build Coastguard Worker void init() {} destroy(const Context * context)120*8975f5c5SAndroid Build Coastguard Worker void destroy(const Context *context) {} 121*8975f5c5SAndroid Build Coastguard Worker onSwap()122*8975f5c5SAndroid Build Coastguard Worker void onSwap() const {} 123*8975f5c5SAndroid Build Coastguard Worker getTextWidget(WidgetId id)124*8975f5c5SAndroid Build Coastguard Worker const overlay::Mock *getTextWidget(WidgetId id) const { return &mMock; } getCountWidget(WidgetId id)125*8975f5c5SAndroid Build Coastguard Worker const overlay::Mock *getCountWidget(WidgetId id) const { return &mMock; } getPerSecondWidget(WidgetId id)126*8975f5c5SAndroid Build Coastguard Worker const overlay::Mock *getPerSecondWidget(WidgetId id) const { return &mMock; } getRunningGraphWidget(WidgetId id)127*8975f5c5SAndroid Build Coastguard Worker const overlay::Mock *getRunningGraphWidget(WidgetId id) const { return &mMock; } getRunningHistogramWidget(WidgetId id)128*8975f5c5SAndroid Build Coastguard Worker const overlay::Mock *getRunningHistogramWidget(WidgetId id) const { return &mMock; } 129*8975f5c5SAndroid Build Coastguard Worker isEnabled()130*8975f5c5SAndroid Build Coastguard Worker bool isEnabled() const { return false; } 131*8975f5c5SAndroid Build Coastguard Worker 132*8975f5c5SAndroid Build Coastguard Worker private: 133*8975f5c5SAndroid Build Coastguard Worker overlay::Mock mMock; 134*8975f5c5SAndroid Build Coastguard Worker }; 135*8975f5c5SAndroid Build Coastguard Worker 136*8975f5c5SAndroid Build Coastguard Worker #if ANGLE_ENABLE_OVERLAY 137*8975f5c5SAndroid Build Coastguard Worker using OverlayType = Overlay; 138*8975f5c5SAndroid Build Coastguard Worker using CountWidget = overlay::Count; 139*8975f5c5SAndroid Build Coastguard Worker using PerSecondWidget = overlay::PerSecond; 140*8975f5c5SAndroid Build Coastguard Worker using RunningGraphWidget = overlay::RunningGraph; 141*8975f5c5SAndroid Build Coastguard Worker using RunningHistogramWidget = overlay::RunningHistogram; 142*8975f5c5SAndroid Build Coastguard Worker using TextWidget = overlay::Text; 143*8975f5c5SAndroid Build Coastguard Worker #else // !ANGLE_ENABLE_OVERLAY 144*8975f5c5SAndroid Build Coastguard Worker using OverlayType = MockOverlay; 145*8975f5c5SAndroid Build Coastguard Worker using CountWidget = const overlay::Mock; 146*8975f5c5SAndroid Build Coastguard Worker using PerSecondWidget = const overlay::Mock; 147*8975f5c5SAndroid Build Coastguard Worker using RunningGraphWidget = const overlay::Mock; 148*8975f5c5SAndroid Build Coastguard Worker using RunningHistogramWidget = const overlay::Mock; 149*8975f5c5SAndroid Build Coastguard Worker using TextWidget = const overlay::Mock; 150*8975f5c5SAndroid Build Coastguard Worker #endif // ANGLE_ENABLE_OVERLAY 151*8975f5c5SAndroid Build Coastguard Worker 152*8975f5c5SAndroid Build Coastguard Worker } // namespace gl 153*8975f5c5SAndroid Build Coastguard Worker 154*8975f5c5SAndroid Build Coastguard Worker #endif // LIBANGLE_OVERLAY_H_ 155