xref: /aosp_15_r20/external/angle/src/libANGLE/Overlay.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 // 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