xref: /aosp_15_r20/external/angle/src/libANGLE/OverlayWidgets.cpp (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.cpp:
7*8975f5c5SAndroid Build Coastguard Worker //    Implements functions that interpret widget data.  Data formats and limits correspond to the
8*8975f5c5SAndroid Build Coastguard Worker //    Vulkan implementation (as the only implementation).  They are generic enough so other backends
9*8975f5c5SAndroid Build Coastguard Worker //    could respect them too, if they implement the overlay.
10*8975f5c5SAndroid Build Coastguard Worker //
11*8975f5c5SAndroid Build Coastguard Worker 
12*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Overlay.h"
13*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Overlay_font_autogen.h"
14*8975f5c5SAndroid Build Coastguard Worker 
15*8975f5c5SAndroid Build Coastguard Worker #include <functional>
16*8975f5c5SAndroid Build Coastguard Worker 
17*8975f5c5SAndroid Build Coastguard Worker namespace gl
18*8975f5c5SAndroid Build Coastguard Worker {
19*8975f5c5SAndroid Build Coastguard Worker namespace
20*8975f5c5SAndroid Build Coastguard Worker {
21*8975f5c5SAndroid Build Coastguard Worker // Internally, every widget is either Text or Graph.
22*8975f5c5SAndroid Build Coastguard Worker enum class WidgetInternalType
23*8975f5c5SAndroid Build Coastguard Worker {
24*8975f5c5SAndroid Build Coastguard Worker     Text,
25*8975f5c5SAndroid Build Coastguard Worker     Graph,
26*8975f5c5SAndroid Build Coastguard Worker 
27*8975f5c5SAndroid Build Coastguard Worker     InvalidEnum,
28*8975f5c5SAndroid Build Coastguard Worker     EnumCount = InvalidEnum,
29*8975f5c5SAndroid Build Coastguard Worker };
30*8975f5c5SAndroid Build Coastguard Worker 
31*8975f5c5SAndroid Build Coastguard Worker // A map that says how the API-facing widget types map to internal types.
32*8975f5c5SAndroid Build Coastguard Worker constexpr angle::PackedEnumMap<WidgetType, WidgetInternalType> kWidgetTypeToInternalMap = {
33*8975f5c5SAndroid Build Coastguard Worker     {WidgetType::Count, WidgetInternalType::Text},
34*8975f5c5SAndroid Build Coastguard Worker     {WidgetType::Text, WidgetInternalType::Text},
35*8975f5c5SAndroid Build Coastguard Worker     {WidgetType::PerSecond, WidgetInternalType::Text},
36*8975f5c5SAndroid Build Coastguard Worker     {WidgetType::RunningGraph, WidgetInternalType::Graph},
37*8975f5c5SAndroid Build Coastguard Worker     {WidgetType::RunningHistogram, WidgetInternalType::Graph},
38*8975f5c5SAndroid Build Coastguard Worker };
39*8975f5c5SAndroid Build Coastguard Worker 
40*8975f5c5SAndroid Build Coastguard Worker // Structures and limits matching uniform buffers in vulkan/shaders/src/OverlayDraw.comp.  The size
41*8975f5c5SAndroid Build Coastguard Worker // of text and graph widgets is chosen such that they could fit in uniform buffers with minimum
42*8975f5c5SAndroid Build Coastguard Worker // required Vulkan size.
43*8975f5c5SAndroid Build Coastguard Worker constexpr size_t kMaxRenderableTextWidgets  = 32;
44*8975f5c5SAndroid Build Coastguard Worker constexpr size_t kMaxRenderableGraphWidgets = 32;
45*8975f5c5SAndroid Build Coastguard Worker constexpr size_t kMaxTextLength             = 256;
46*8975f5c5SAndroid Build Coastguard Worker constexpr size_t kMaxGraphDataSize          = 256;
47*8975f5c5SAndroid Build Coastguard Worker 
48*8975f5c5SAndroid Build Coastguard Worker constexpr angle::PackedEnumMap<WidgetInternalType, size_t> kWidgetInternalTypeMaxWidgets = {
49*8975f5c5SAndroid Build Coastguard Worker     {WidgetInternalType::Text, kMaxRenderableTextWidgets},
50*8975f5c5SAndroid Build Coastguard Worker     {WidgetInternalType::Graph, kMaxRenderableGraphWidgets},
51*8975f5c5SAndroid Build Coastguard Worker };
52*8975f5c5SAndroid Build Coastguard Worker 
53*8975f5c5SAndroid Build Coastguard Worker ANGLE_ENABLE_STRUCT_PADDING_WARNINGS
54*8975f5c5SAndroid Build Coastguard Worker 
55*8975f5c5SAndroid Build Coastguard Worker // Structure matching buffer in vulkan/shaders/src/OverlayCull.comp.
56*8975f5c5SAndroid Build Coastguard Worker struct WidgetCoordinates
57*8975f5c5SAndroid Build Coastguard Worker {
58*8975f5c5SAndroid Build Coastguard Worker     uint32_t coordinates[kMaxRenderableTextWidgets + kMaxRenderableGraphWidgets][4];
59*8975f5c5SAndroid Build Coastguard Worker };
60*8975f5c5SAndroid Build Coastguard Worker 
61*8975f5c5SAndroid Build Coastguard Worker // Structures matching buffers in vulkan/shaders/src/OverlayDraw.comp.
62*8975f5c5SAndroid Build Coastguard Worker struct TextWidgetData
63*8975f5c5SAndroid Build Coastguard Worker {
64*8975f5c5SAndroid Build Coastguard Worker     uint32_t coordinates[4];
65*8975f5c5SAndroid Build Coastguard Worker     float color[4];
66*8975f5c5SAndroid Build Coastguard Worker     uint32_t fontSize[3];
67*8975f5c5SAndroid Build Coastguard Worker     uint32_t padding;
68*8975f5c5SAndroid Build Coastguard Worker     uint8_t text[kMaxTextLength];
69*8975f5c5SAndroid Build Coastguard Worker };
70*8975f5c5SAndroid Build Coastguard Worker 
71*8975f5c5SAndroid Build Coastguard Worker struct GraphWidgetData
72*8975f5c5SAndroid Build Coastguard Worker {
73*8975f5c5SAndroid Build Coastguard Worker     uint32_t coordinates[4];
74*8975f5c5SAndroid Build Coastguard Worker     float color[4];
75*8975f5c5SAndroid Build Coastguard Worker     uint32_t valueWidth;
76*8975f5c5SAndroid Build Coastguard Worker     uint32_t padding[3];
77*8975f5c5SAndroid Build Coastguard Worker     uint32_t values[kMaxGraphDataSize];
78*8975f5c5SAndroid Build Coastguard Worker };
79*8975f5c5SAndroid Build Coastguard Worker 
80*8975f5c5SAndroid Build Coastguard Worker struct TextWidgets
81*8975f5c5SAndroid Build Coastguard Worker {
82*8975f5c5SAndroid Build Coastguard Worker     TextWidgetData widgets[kMaxRenderableTextWidgets];
83*8975f5c5SAndroid Build Coastguard Worker };
84*8975f5c5SAndroid Build Coastguard Worker 
85*8975f5c5SAndroid Build Coastguard Worker struct GraphWidgets
86*8975f5c5SAndroid Build Coastguard Worker {
87*8975f5c5SAndroid Build Coastguard Worker     GraphWidgetData widgets[kMaxRenderableGraphWidgets];
88*8975f5c5SAndroid Build Coastguard Worker };
89*8975f5c5SAndroid Build Coastguard Worker 
90*8975f5c5SAndroid Build Coastguard Worker ANGLE_DISABLE_STRUCT_PADDING_WARNINGS
91*8975f5c5SAndroid Build Coastguard Worker 
GetWidgetCoord(int32_t src,uint32_t extent)92*8975f5c5SAndroid Build Coastguard Worker uint32_t GetWidgetCoord(int32_t src, uint32_t extent)
93*8975f5c5SAndroid Build Coastguard Worker {
94*8975f5c5SAndroid Build Coastguard Worker     int32_t dst = src < 0 ? extent + src : src;
95*8975f5c5SAndroid Build Coastguard Worker 
96*8975f5c5SAndroid Build Coastguard Worker     return std::min<uint32_t>(std::max(dst, 0), extent - 1);
97*8975f5c5SAndroid Build Coastguard Worker }
98*8975f5c5SAndroid Build Coastguard Worker 
GetWidgetCoordinates(const int32_t srcCoords[4],const gl::Extents & imageExtent,uint32_t dstCoordsOut[4])99*8975f5c5SAndroid Build Coastguard Worker void GetWidgetCoordinates(const int32_t srcCoords[4],
100*8975f5c5SAndroid Build Coastguard Worker                           const gl::Extents &imageExtent,
101*8975f5c5SAndroid Build Coastguard Worker                           uint32_t dstCoordsOut[4])
102*8975f5c5SAndroid Build Coastguard Worker {
103*8975f5c5SAndroid Build Coastguard Worker     dstCoordsOut[0] = GetWidgetCoord(srcCoords[0], imageExtent.width);
104*8975f5c5SAndroid Build Coastguard Worker     dstCoordsOut[1] = GetWidgetCoord(srcCoords[1], imageExtent.height);
105*8975f5c5SAndroid Build Coastguard Worker     dstCoordsOut[2] = GetWidgetCoord(srcCoords[2], imageExtent.width);
106*8975f5c5SAndroid Build Coastguard Worker     dstCoordsOut[3] = GetWidgetCoord(srcCoords[3], imageExtent.height);
107*8975f5c5SAndroid Build Coastguard Worker }
108*8975f5c5SAndroid Build Coastguard Worker 
GetWidgetColor(const float srcColor[4],float dstColor[4])109*8975f5c5SAndroid Build Coastguard Worker void GetWidgetColor(const float srcColor[4], float dstColor[4])
110*8975f5c5SAndroid Build Coastguard Worker {
111*8975f5c5SAndroid Build Coastguard Worker     memcpy(dstColor, srcColor, 4 * sizeof(dstColor[0]));
112*8975f5c5SAndroid Build Coastguard Worker }
113*8975f5c5SAndroid Build Coastguard Worker 
GetTextFontSize(int srcFontSize,uint32_t dstFontSize[3])114*8975f5c5SAndroid Build Coastguard Worker void GetTextFontSize(int srcFontSize, uint32_t dstFontSize[3])
115*8975f5c5SAndroid Build Coastguard Worker {
116*8975f5c5SAndroid Build Coastguard Worker     // .xy contains the font glyph width/height
117*8975f5c5SAndroid Build Coastguard Worker     dstFontSize[0] = overlay::kFontGlyphWidth >> srcFontSize;
118*8975f5c5SAndroid Build Coastguard Worker     dstFontSize[1] = overlay::kFontGlyphHeight >> srcFontSize;
119*8975f5c5SAndroid Build Coastguard Worker     // .z contains the mip
120*8975f5c5SAndroid Build Coastguard Worker     dstFontSize[2] = srcFontSize;
121*8975f5c5SAndroid Build Coastguard Worker }
122*8975f5c5SAndroid Build Coastguard Worker 
GetGraphValueWidth(const int32_t srcCoords[4],size_t valueCount,uint32_t * dstValueWidth)123*8975f5c5SAndroid Build Coastguard Worker void GetGraphValueWidth(const int32_t srcCoords[4], size_t valueCount, uint32_t *dstValueWidth)
124*8975f5c5SAndroid Build Coastguard Worker {
125*8975f5c5SAndroid Build Coastguard Worker     const int32_t graphWidth = std::abs(srcCoords[2] - srcCoords[0]);
126*8975f5c5SAndroid Build Coastguard Worker 
127*8975f5c5SAndroid Build Coastguard Worker     // If valueCount doesn't divide graphWidth, the graph bars won't fit well in its frame.
128*8975f5c5SAndroid Build Coastguard Worker     // Fix initOverlayWidgets() in that case.
129*8975f5c5SAndroid Build Coastguard Worker     ASSERT(graphWidth % valueCount == 0);
130*8975f5c5SAndroid Build Coastguard Worker 
131*8975f5c5SAndroid Build Coastguard Worker     *dstValueWidth = graphWidth / valueCount;
132*8975f5c5SAndroid Build Coastguard Worker }
133*8975f5c5SAndroid Build Coastguard Worker 
GetTextString(const std::string & src,uint8_t textOut[kMaxTextLength])134*8975f5c5SAndroid Build Coastguard Worker void GetTextString(const std::string &src, uint8_t textOut[kMaxTextLength])
135*8975f5c5SAndroid Build Coastguard Worker {
136*8975f5c5SAndroid Build Coastguard Worker     for (size_t i = 0; i < src.length() && i < kMaxTextLength; ++i)
137*8975f5c5SAndroid Build Coastguard Worker     {
138*8975f5c5SAndroid Build Coastguard Worker         // The font image has 95 ASCII characters starting from ' '.
139*8975f5c5SAndroid Build Coastguard Worker         textOut[i] = src[i] - ' ';
140*8975f5c5SAndroid Build Coastguard Worker     }
141*8975f5c5SAndroid Build Coastguard Worker }
142*8975f5c5SAndroid Build Coastguard Worker 
GetGraphValues(const std::vector<uint64_t> srcValues,size_t startIndex,float scale,uint32_t valuesOut[kMaxGraphDataSize])143*8975f5c5SAndroid Build Coastguard Worker void GetGraphValues(const std::vector<uint64_t> srcValues,
144*8975f5c5SAndroid Build Coastguard Worker                     size_t startIndex,
145*8975f5c5SAndroid Build Coastguard Worker                     float scale,
146*8975f5c5SAndroid Build Coastguard Worker                     uint32_t valuesOut[kMaxGraphDataSize])
147*8975f5c5SAndroid Build Coastguard Worker {
148*8975f5c5SAndroid Build Coastguard Worker     ASSERT(srcValues.size() <= kMaxGraphDataSize);
149*8975f5c5SAndroid Build Coastguard Worker 
150*8975f5c5SAndroid Build Coastguard Worker     for (size_t i = 0; i < srcValues.size(); ++i)
151*8975f5c5SAndroid Build Coastguard Worker     {
152*8975f5c5SAndroid Build Coastguard Worker         size_t index = (startIndex + i) % srcValues.size();
153*8975f5c5SAndroid Build Coastguard Worker         valuesOut[i] = static_cast<uint32_t>(srcValues[index] * scale);
154*8975f5c5SAndroid Build Coastguard Worker     }
155*8975f5c5SAndroid Build Coastguard Worker }
156*8975f5c5SAndroid Build Coastguard Worker 
CreateHistogram(const std::vector<uint64_t> values)157*8975f5c5SAndroid Build Coastguard Worker std::vector<uint64_t> CreateHistogram(const std::vector<uint64_t> values)
158*8975f5c5SAndroid Build Coastguard Worker {
159*8975f5c5SAndroid Build Coastguard Worker     std::vector<uint64_t> histogram(values.size(), 0);
160*8975f5c5SAndroid Build Coastguard Worker 
161*8975f5c5SAndroid Build Coastguard Worker     for (uint64_t rank : values)
162*8975f5c5SAndroid Build Coastguard Worker     {
163*8975f5c5SAndroid Build Coastguard Worker         ++histogram[static_cast<size_t>(rank)];
164*8975f5c5SAndroid Build Coastguard Worker     }
165*8975f5c5SAndroid Build Coastguard Worker 
166*8975f5c5SAndroid Build Coastguard Worker     return histogram;
167*8975f5c5SAndroid Build Coastguard Worker }
168*8975f5c5SAndroid Build Coastguard Worker 
169*8975f5c5SAndroid Build Coastguard Worker using OverlayWidgetCounts  = angle::PackedEnumMap<WidgetInternalType, uint32_t>;
170*8975f5c5SAndroid Build Coastguard Worker using AppendWidgetDataFunc = void (*)(const overlay::Widget *widget,
171*8975f5c5SAndroid Build Coastguard Worker                                       const gl::Extents &imageExtent,
172*8975f5c5SAndroid Build Coastguard Worker                                       TextWidgetData *textWidget,
173*8975f5c5SAndroid Build Coastguard Worker                                       GraphWidgetData *graphWidget,
174*8975f5c5SAndroid Build Coastguard Worker                                       OverlayWidgetCounts *widgetCounts);
175*8975f5c5SAndroid Build Coastguard Worker }  // namespace
176*8975f5c5SAndroid Build Coastguard Worker 
177*8975f5c5SAndroid Build Coastguard Worker namespace overlay_impl
178*8975f5c5SAndroid Build Coastguard Worker {
179*8975f5c5SAndroid Build Coastguard Worker #define ANGLE_DECLARE_APPEND_WIDGET_PROC(WIDGET_ID)                                              \
180*8975f5c5SAndroid Build Coastguard Worker     static void Append##WIDGET_ID(const overlay::Widget *widget, const gl::Extents &imageExtent, \
181*8975f5c5SAndroid Build Coastguard Worker                                   TextWidgetData *textWidget, GraphWidgetData *graphWidget,      \
182*8975f5c5SAndroid Build Coastguard Worker                                   OverlayWidgetCounts *widgetCounts);
183*8975f5c5SAndroid Build Coastguard Worker 
184*8975f5c5SAndroid Build Coastguard Worker // This class interprets the generic data collected in every element into a human-understandable
185*8975f5c5SAndroid Build Coastguard Worker // widget.  This often means generating text specific to this item and scaling graph data to
186*8975f5c5SAndroid Build Coastguard Worker // something sensible.
187*8975f5c5SAndroid Build Coastguard Worker class AppendWidgetDataHelper
188*8975f5c5SAndroid Build Coastguard Worker {
189*8975f5c5SAndroid Build Coastguard Worker   public:
190*8975f5c5SAndroid Build Coastguard Worker     ANGLE_WIDGET_ID_X(ANGLE_DECLARE_APPEND_WIDGET_PROC)
191*8975f5c5SAndroid Build Coastguard Worker 
192*8975f5c5SAndroid Build Coastguard Worker   private:
193*8975f5c5SAndroid Build Coastguard Worker     static std::ostream &OutputPerSecond(std::ostream &out, const overlay::PerSecond *perSecond);
194*8975f5c5SAndroid Build Coastguard Worker 
195*8975f5c5SAndroid Build Coastguard Worker     static std::ostream &OutputText(std::ostream &out, const overlay::Text *text);
196*8975f5c5SAndroid Build Coastguard Worker 
197*8975f5c5SAndroid Build Coastguard Worker     static std::ostream &OutputCount(std::ostream &out, const overlay::Count *count);
198*8975f5c5SAndroid Build Coastguard Worker 
199*8975f5c5SAndroid Build Coastguard Worker     static void AppendTextCommon(const overlay::Widget *widget,
200*8975f5c5SAndroid Build Coastguard Worker                                  const gl::Extents &imageExtent,
201*8975f5c5SAndroid Build Coastguard Worker                                  const std::string &text,
202*8975f5c5SAndroid Build Coastguard Worker                                  TextWidgetData *textWidget,
203*8975f5c5SAndroid Build Coastguard Worker                                  OverlayWidgetCounts *widgetCounts);
204*8975f5c5SAndroid Build Coastguard Worker 
205*8975f5c5SAndroid Build Coastguard Worker     using FormatGraphTitleFunc = std::function<std::string(uint64_t curValue, uint64_t maxValue)>;
206*8975f5c5SAndroid Build Coastguard Worker     static void AppendRunningGraphCommon(const overlay::Widget *widget,
207*8975f5c5SAndroid Build Coastguard Worker                                          const gl::Extents &imageExtent,
208*8975f5c5SAndroid Build Coastguard Worker                                          TextWidgetData *textWidget,
209*8975f5c5SAndroid Build Coastguard Worker                                          GraphWidgetData *graphWidget,
210*8975f5c5SAndroid Build Coastguard Worker                                          OverlayWidgetCounts *widgetCounts,
211*8975f5c5SAndroid Build Coastguard Worker                                          FormatGraphTitleFunc formatFunc);
212*8975f5c5SAndroid Build Coastguard Worker 
213*8975f5c5SAndroid Build Coastguard Worker     using FormatHistogramTitleFunc =
214*8975f5c5SAndroid Build Coastguard Worker         std::function<std::string(size_t peakRange, size_t maxValueRange, size_t numRanges)>;
215*8975f5c5SAndroid Build Coastguard Worker     static void AppendRunningHistogramCommon(const overlay::Widget *widget,
216*8975f5c5SAndroid Build Coastguard Worker                                              const gl::Extents &imageExtent,
217*8975f5c5SAndroid Build Coastguard Worker                                              TextWidgetData *textWidget,
218*8975f5c5SAndroid Build Coastguard Worker                                              GraphWidgetData *graphWidget,
219*8975f5c5SAndroid Build Coastguard Worker                                              OverlayWidgetCounts *widgetCounts,
220*8975f5c5SAndroid Build Coastguard Worker                                              FormatHistogramTitleFunc formatFunc);
221*8975f5c5SAndroid Build Coastguard Worker 
222*8975f5c5SAndroid Build Coastguard Worker     static void AppendGraphCommon(const overlay::Widget *widget,
223*8975f5c5SAndroid Build Coastguard Worker                                   const gl::Extents &imageExtent,
224*8975f5c5SAndroid Build Coastguard Worker                                   const std::vector<uint64_t> runningValues,
225*8975f5c5SAndroid Build Coastguard Worker                                   size_t startIndex,
226*8975f5c5SAndroid Build Coastguard Worker                                   float scale,
227*8975f5c5SAndroid Build Coastguard Worker                                   GraphWidgetData *graphWidget,
228*8975f5c5SAndroid Build Coastguard Worker                                   OverlayWidgetCounts *widgetCounts);
229*8975f5c5SAndroid Build Coastguard Worker };
230*8975f5c5SAndroid Build Coastguard Worker 
AppendTextCommon(const overlay::Widget * widget,const gl::Extents & imageExtent,const std::string & text,TextWidgetData * textWidget,OverlayWidgetCounts * widgetCounts)231*8975f5c5SAndroid Build Coastguard Worker void AppendWidgetDataHelper::AppendTextCommon(const overlay::Widget *widget,
232*8975f5c5SAndroid Build Coastguard Worker                                               const gl::Extents &imageExtent,
233*8975f5c5SAndroid Build Coastguard Worker                                               const std::string &text,
234*8975f5c5SAndroid Build Coastguard Worker                                               TextWidgetData *textWidget,
235*8975f5c5SAndroid Build Coastguard Worker                                               OverlayWidgetCounts *widgetCounts)
236*8975f5c5SAndroid Build Coastguard Worker {
237*8975f5c5SAndroid Build Coastguard Worker     GetWidgetCoordinates(widget->coords, imageExtent, textWidget->coordinates);
238*8975f5c5SAndroid Build Coastguard Worker     GetWidgetColor(widget->color, textWidget->color);
239*8975f5c5SAndroid Build Coastguard Worker     GetTextFontSize(widget->fontSize, textWidget->fontSize);
240*8975f5c5SAndroid Build Coastguard Worker     GetTextString(text, textWidget->text);
241*8975f5c5SAndroid Build Coastguard Worker 
242*8975f5c5SAndroid Build Coastguard Worker     ++(*widgetCounts)[WidgetInternalType::Text];
243*8975f5c5SAndroid Build Coastguard Worker }
244*8975f5c5SAndroid Build Coastguard Worker 
AppendGraphCommon(const overlay::Widget * widget,const gl::Extents & imageExtent,const std::vector<uint64_t> runningValues,size_t startIndex,float scale,GraphWidgetData * graphWidget,OverlayWidgetCounts * widgetCounts)245*8975f5c5SAndroid Build Coastguard Worker void AppendWidgetDataHelper::AppendGraphCommon(const overlay::Widget *widget,
246*8975f5c5SAndroid Build Coastguard Worker                                                const gl::Extents &imageExtent,
247*8975f5c5SAndroid Build Coastguard Worker                                                const std::vector<uint64_t> runningValues,
248*8975f5c5SAndroid Build Coastguard Worker                                                size_t startIndex,
249*8975f5c5SAndroid Build Coastguard Worker                                                float scale,
250*8975f5c5SAndroid Build Coastguard Worker                                                GraphWidgetData *graphWidget,
251*8975f5c5SAndroid Build Coastguard Worker                                                OverlayWidgetCounts *widgetCounts)
252*8975f5c5SAndroid Build Coastguard Worker {
253*8975f5c5SAndroid Build Coastguard Worker     const overlay::RunningGraph *widgetAsGraph = static_cast<const overlay::RunningGraph *>(widget);
254*8975f5c5SAndroid Build Coastguard Worker 
255*8975f5c5SAndroid Build Coastguard Worker     GetWidgetCoordinates(widget->coords, imageExtent, graphWidget->coordinates);
256*8975f5c5SAndroid Build Coastguard Worker     GetWidgetColor(widget->color, graphWidget->color);
257*8975f5c5SAndroid Build Coastguard Worker     GetGraphValueWidth(widget->coords, widgetAsGraph->runningValues.size(),
258*8975f5c5SAndroid Build Coastguard Worker                        &graphWidget->valueWidth);
259*8975f5c5SAndroid Build Coastguard Worker     GetGraphValues(runningValues, startIndex, scale, graphWidget->values);
260*8975f5c5SAndroid Build Coastguard Worker 
261*8975f5c5SAndroid Build Coastguard Worker     ++(*widgetCounts)[WidgetInternalType::Graph];
262*8975f5c5SAndroid Build Coastguard Worker }
263*8975f5c5SAndroid Build Coastguard Worker 
AppendRunningGraphCommon(const overlay::Widget * widget,const gl::Extents & imageExtent,TextWidgetData * textWidget,GraphWidgetData * graphWidget,OverlayWidgetCounts * widgetCounts,AppendWidgetDataHelper::FormatGraphTitleFunc formatFunc)264*8975f5c5SAndroid Build Coastguard Worker void AppendWidgetDataHelper::AppendRunningGraphCommon(
265*8975f5c5SAndroid Build Coastguard Worker     const overlay::Widget *widget,
266*8975f5c5SAndroid Build Coastguard Worker     const gl::Extents &imageExtent,
267*8975f5c5SAndroid Build Coastguard Worker     TextWidgetData *textWidget,
268*8975f5c5SAndroid Build Coastguard Worker     GraphWidgetData *graphWidget,
269*8975f5c5SAndroid Build Coastguard Worker     OverlayWidgetCounts *widgetCounts,
270*8975f5c5SAndroid Build Coastguard Worker     AppendWidgetDataHelper::FormatGraphTitleFunc formatFunc)
271*8975f5c5SAndroid Build Coastguard Worker {
272*8975f5c5SAndroid Build Coastguard Worker     const overlay::RunningGraph *graph   = static_cast<const overlay::RunningGraph *>(widget);
273*8975f5c5SAndroid Build Coastguard Worker     const overlay::Widget *matchToWidget = widget->matchToWidget;
274*8975f5c5SAndroid Build Coastguard Worker 
275*8975f5c5SAndroid Build Coastguard Worker     if (matchToWidget == nullptr)
276*8975f5c5SAndroid Build Coastguard Worker     {
277*8975f5c5SAndroid Build Coastguard Worker         matchToWidget = widget;
278*8975f5c5SAndroid Build Coastguard Worker     }
279*8975f5c5SAndroid Build Coastguard Worker     const overlay::RunningGraph *matchToGraph =
280*8975f5c5SAndroid Build Coastguard Worker         static_cast<const overlay::RunningGraph *>(matchToWidget);
281*8975f5c5SAndroid Build Coastguard Worker 
282*8975f5c5SAndroid Build Coastguard Worker     const uint64_t maxValue =
283*8975f5c5SAndroid Build Coastguard Worker         *std::max_element(graph->runningValues.begin(), graph->runningValues.end());
284*8975f5c5SAndroid Build Coastguard Worker     const uint64_t maxValueInMatchToGraph =
285*8975f5c5SAndroid Build Coastguard Worker         *std::max_element(matchToGraph->runningValues.begin(), matchToGraph->runningValues.end());
286*8975f5c5SAndroid Build Coastguard Worker     const int32_t graphHeight = std::abs(widget->coords[3] - widget->coords[1]);
287*8975f5c5SAndroid Build Coastguard Worker     const float graphScale    = static_cast<float>(graphHeight) / maxValueInMatchToGraph;
288*8975f5c5SAndroid Build Coastguard Worker 
289*8975f5c5SAndroid Build Coastguard Worker     const size_t graphSize  = graph->runningValues.size();
290*8975f5c5SAndroid Build Coastguard Worker     const size_t currentIdx = graph->lastValueIndex - 1;
291*8975f5c5SAndroid Build Coastguard Worker 
292*8975f5c5SAndroid Build Coastguard Worker     const uint64_t curValue = graph->runningValues[(graphSize + currentIdx) % graphSize];
293*8975f5c5SAndroid Build Coastguard Worker 
294*8975f5c5SAndroid Build Coastguard Worker     AppendGraphCommon(widget, imageExtent, graph->runningValues, graph->lastValueIndex + 1,
295*8975f5c5SAndroid Build Coastguard Worker                       graphScale, graphWidget, widgetCounts);
296*8975f5c5SAndroid Build Coastguard Worker 
297*8975f5c5SAndroid Build Coastguard Worker     if ((*widgetCounts)[WidgetInternalType::Text] <
298*8975f5c5SAndroid Build Coastguard Worker         kWidgetInternalTypeMaxWidgets[WidgetInternalType::Text])
299*8975f5c5SAndroid Build Coastguard Worker     {
300*8975f5c5SAndroid Build Coastguard Worker         std::string text = formatFunc(curValue, maxValue);
301*8975f5c5SAndroid Build Coastguard Worker         AppendTextCommon(&graph->description, imageExtent, text, textWidget, widgetCounts);
302*8975f5c5SAndroid Build Coastguard Worker     }
303*8975f5c5SAndroid Build Coastguard Worker }
304*8975f5c5SAndroid Build Coastguard Worker 
305*8975f5c5SAndroid Build Coastguard Worker // static
AppendRunningHistogramCommon(const overlay::Widget * widget,const gl::Extents & imageExtent,TextWidgetData * textWidget,GraphWidgetData * graphWidget,OverlayWidgetCounts * widgetCounts,FormatHistogramTitleFunc formatFunc)306*8975f5c5SAndroid Build Coastguard Worker void AppendWidgetDataHelper::AppendRunningHistogramCommon(const overlay::Widget *widget,
307*8975f5c5SAndroid Build Coastguard Worker                                                           const gl::Extents &imageExtent,
308*8975f5c5SAndroid Build Coastguard Worker                                                           TextWidgetData *textWidget,
309*8975f5c5SAndroid Build Coastguard Worker                                                           GraphWidgetData *graphWidget,
310*8975f5c5SAndroid Build Coastguard Worker                                                           OverlayWidgetCounts *widgetCounts,
311*8975f5c5SAndroid Build Coastguard Worker                                                           FormatHistogramTitleFunc formatFunc)
312*8975f5c5SAndroid Build Coastguard Worker {
313*8975f5c5SAndroid Build Coastguard Worker     const overlay::RunningHistogram *runningHistogram =
314*8975f5c5SAndroid Build Coastguard Worker         static_cast<const overlay::RunningHistogram *>(widget);
315*8975f5c5SAndroid Build Coastguard Worker 
316*8975f5c5SAndroid Build Coastguard Worker     std::vector<uint64_t> histogram = CreateHistogram(runningHistogram->runningValues);
317*8975f5c5SAndroid Build Coastguard Worker     auto peakRangeIt                = std::max_element(histogram.rbegin(), histogram.rend());
318*8975f5c5SAndroid Build Coastguard Worker     const uint64_t peakRangeValue   = *peakRangeIt;
319*8975f5c5SAndroid Build Coastguard Worker     const int32_t graphHeight       = std::abs(widget->coords[3] - widget->coords[1]);
320*8975f5c5SAndroid Build Coastguard Worker     const float graphScale          = static_cast<float>(graphHeight) / peakRangeValue;
321*8975f5c5SAndroid Build Coastguard Worker     auto maxValueIter               = std::find_if(histogram.rbegin(), histogram.rend(),
322*8975f5c5SAndroid Build Coastguard Worker                                                    [](uint64_t value) { return value != 0; });
323*8975f5c5SAndroid Build Coastguard Worker 
324*8975f5c5SAndroid Build Coastguard Worker     AppendGraphCommon(widget, imageExtent, histogram, 0, graphScale, graphWidget, widgetCounts);
325*8975f5c5SAndroid Build Coastguard Worker 
326*8975f5c5SAndroid Build Coastguard Worker     if ((*widgetCounts)[WidgetInternalType::Text] <
327*8975f5c5SAndroid Build Coastguard Worker         kWidgetInternalTypeMaxWidgets[WidgetInternalType::Text])
328*8975f5c5SAndroid Build Coastguard Worker     {
329*8975f5c5SAndroid Build Coastguard Worker         size_t peakRange     = std::distance(peakRangeIt, histogram.rend() - 1);
330*8975f5c5SAndroid Build Coastguard Worker         size_t maxValueRange = std::distance(maxValueIter, histogram.rend() - 1);
331*8975f5c5SAndroid Build Coastguard Worker 
332*8975f5c5SAndroid Build Coastguard Worker         std::string text = formatFunc(peakRange, maxValueRange, histogram.size());
333*8975f5c5SAndroid Build Coastguard Worker         AppendTextCommon(&runningHistogram->description, imageExtent, text, textWidget,
334*8975f5c5SAndroid Build Coastguard Worker                          widgetCounts);
335*8975f5c5SAndroid Build Coastguard Worker     }
336*8975f5c5SAndroid Build Coastguard Worker }
337*8975f5c5SAndroid Build Coastguard Worker 
AppendFPS(const overlay::Widget * widget,const gl::Extents & imageExtent,TextWidgetData * textWidget,GraphWidgetData * graphWidget,OverlayWidgetCounts * widgetCounts)338*8975f5c5SAndroid Build Coastguard Worker void AppendWidgetDataHelper::AppendFPS(const overlay::Widget *widget,
339*8975f5c5SAndroid Build Coastguard Worker                                        const gl::Extents &imageExtent,
340*8975f5c5SAndroid Build Coastguard Worker                                        TextWidgetData *textWidget,
341*8975f5c5SAndroid Build Coastguard Worker                                        GraphWidgetData *graphWidget,
342*8975f5c5SAndroid Build Coastguard Worker                                        OverlayWidgetCounts *widgetCounts)
343*8975f5c5SAndroid Build Coastguard Worker {
344*8975f5c5SAndroid Build Coastguard Worker     const overlay::PerSecond *fps = static_cast<const overlay::PerSecond *>(widget);
345*8975f5c5SAndroid Build Coastguard Worker     std::ostringstream text;
346*8975f5c5SAndroid Build Coastguard Worker     text << "FPS: ";
347*8975f5c5SAndroid Build Coastguard Worker     OutputPerSecond(text, fps);
348*8975f5c5SAndroid Build Coastguard Worker 
349*8975f5c5SAndroid Build Coastguard Worker     AppendTextCommon(widget, imageExtent, text.str(), textWidget, widgetCounts);
350*8975f5c5SAndroid Build Coastguard Worker }
351*8975f5c5SAndroid Build Coastguard Worker 
AppendVulkanLastValidationMessage(const overlay::Widget * widget,const gl::Extents & imageExtent,TextWidgetData * textWidget,GraphWidgetData * graphWidget,OverlayWidgetCounts * widgetCounts)352*8975f5c5SAndroid Build Coastguard Worker void AppendWidgetDataHelper::AppendVulkanLastValidationMessage(const overlay::Widget *widget,
353*8975f5c5SAndroid Build Coastguard Worker                                                                const gl::Extents &imageExtent,
354*8975f5c5SAndroid Build Coastguard Worker                                                                TextWidgetData *textWidget,
355*8975f5c5SAndroid Build Coastguard Worker                                                                GraphWidgetData *graphWidget,
356*8975f5c5SAndroid Build Coastguard Worker                                                                OverlayWidgetCounts *widgetCounts)
357*8975f5c5SAndroid Build Coastguard Worker {
358*8975f5c5SAndroid Build Coastguard Worker     const overlay::Text *lastValidationMessage = static_cast<const overlay::Text *>(widget);
359*8975f5c5SAndroid Build Coastguard Worker     std::ostringstream text;
360*8975f5c5SAndroid Build Coastguard Worker     text << "Last VVL Message: ";
361*8975f5c5SAndroid Build Coastguard Worker     OutputText(text, lastValidationMessage);
362*8975f5c5SAndroid Build Coastguard Worker 
363*8975f5c5SAndroid Build Coastguard Worker     AppendTextCommon(widget, imageExtent, text.str(), textWidget, widgetCounts);
364*8975f5c5SAndroid Build Coastguard Worker }
365*8975f5c5SAndroid Build Coastguard Worker 
AppendVulkanValidationMessageCount(const overlay::Widget * widget,const gl::Extents & imageExtent,TextWidgetData * textWidget,GraphWidgetData * graphWidget,OverlayWidgetCounts * widgetCounts)366*8975f5c5SAndroid Build Coastguard Worker void AppendWidgetDataHelper::AppendVulkanValidationMessageCount(const overlay::Widget *widget,
367*8975f5c5SAndroid Build Coastguard Worker                                                                 const gl::Extents &imageExtent,
368*8975f5c5SAndroid Build Coastguard Worker                                                                 TextWidgetData *textWidget,
369*8975f5c5SAndroid Build Coastguard Worker                                                                 GraphWidgetData *graphWidget,
370*8975f5c5SAndroid Build Coastguard Worker                                                                 OverlayWidgetCounts *widgetCounts)
371*8975f5c5SAndroid Build Coastguard Worker {
372*8975f5c5SAndroid Build Coastguard Worker     const overlay::Count *validationMessageCount = static_cast<const overlay::Count *>(widget);
373*8975f5c5SAndroid Build Coastguard Worker     std::ostringstream text;
374*8975f5c5SAndroid Build Coastguard Worker     text << "VVL Message Count: ";
375*8975f5c5SAndroid Build Coastguard Worker     OutputCount(text, validationMessageCount);
376*8975f5c5SAndroid Build Coastguard Worker 
377*8975f5c5SAndroid Build Coastguard Worker     AppendTextCommon(widget, imageExtent, text.str(), textWidget, widgetCounts);
378*8975f5c5SAndroid Build Coastguard Worker }
379*8975f5c5SAndroid Build Coastguard Worker 
AppendVulkanRenderPassCount(const overlay::Widget * widget,const gl::Extents & imageExtent,TextWidgetData * textWidget,GraphWidgetData * graphWidget,OverlayWidgetCounts * widgetCounts)380*8975f5c5SAndroid Build Coastguard Worker void AppendWidgetDataHelper::AppendVulkanRenderPassCount(const overlay::Widget *widget,
381*8975f5c5SAndroid Build Coastguard Worker                                                          const gl::Extents &imageExtent,
382*8975f5c5SAndroid Build Coastguard Worker                                                          TextWidgetData *textWidget,
383*8975f5c5SAndroid Build Coastguard Worker                                                          GraphWidgetData *graphWidget,
384*8975f5c5SAndroid Build Coastguard Worker                                                          OverlayWidgetCounts *widgetCounts)
385*8975f5c5SAndroid Build Coastguard Worker {
386*8975f5c5SAndroid Build Coastguard Worker     auto format = [](uint64_t curValue, uint64_t maxValue) {
387*8975f5c5SAndroid Build Coastguard Worker         std::ostringstream text;
388*8975f5c5SAndroid Build Coastguard Worker         text << "RenderPass Count: " << maxValue;
389*8975f5c5SAndroid Build Coastguard Worker         return text.str();
390*8975f5c5SAndroid Build Coastguard Worker     };
391*8975f5c5SAndroid Build Coastguard Worker 
392*8975f5c5SAndroid Build Coastguard Worker     AppendRunningGraphCommon(widget, imageExtent, textWidget, graphWidget, widgetCounts, format);
393*8975f5c5SAndroid Build Coastguard Worker }
394*8975f5c5SAndroid Build Coastguard Worker 
AppendVulkanSecondaryCommandBufferPoolWaste(const overlay::Widget * widget,const gl::Extents & imageExtent,TextWidgetData * textWidget,GraphWidgetData * graphWidget,OverlayWidgetCounts * widgetCounts)395*8975f5c5SAndroid Build Coastguard Worker void AppendWidgetDataHelper::AppendVulkanSecondaryCommandBufferPoolWaste(
396*8975f5c5SAndroid Build Coastguard Worker     const overlay::Widget *widget,
397*8975f5c5SAndroid Build Coastguard Worker     const gl::Extents &imageExtent,
398*8975f5c5SAndroid Build Coastguard Worker     TextWidgetData *textWidget,
399*8975f5c5SAndroid Build Coastguard Worker     GraphWidgetData *graphWidget,
400*8975f5c5SAndroid Build Coastguard Worker     OverlayWidgetCounts *widgetCounts)
401*8975f5c5SAndroid Build Coastguard Worker {
402*8975f5c5SAndroid Build Coastguard Worker     auto format = [](size_t peakRange, size_t maxValueRange, size_t numRanges) {
403*8975f5c5SAndroid Build Coastguard Worker         std::ostringstream text;
404*8975f5c5SAndroid Build Coastguard Worker         size_t peakPercent = (peakRange * 100 + 50) / numRanges;
405*8975f5c5SAndroid Build Coastguard Worker         text << "CB Pool Waste (Peak: " << peakPercent << "%)";
406*8975f5c5SAndroid Build Coastguard Worker         return text.str();
407*8975f5c5SAndroid Build Coastguard Worker     };
408*8975f5c5SAndroid Build Coastguard Worker 
409*8975f5c5SAndroid Build Coastguard Worker     AppendRunningHistogramCommon(widget, imageExtent, textWidget, graphWidget, widgetCounts,
410*8975f5c5SAndroid Build Coastguard Worker                                  format);
411*8975f5c5SAndroid Build Coastguard Worker }
412*8975f5c5SAndroid Build Coastguard Worker 
AppendVulkanWriteDescriptorSetCount(const overlay::Widget * widget,const gl::Extents & imageExtent,TextWidgetData * textWidget,GraphWidgetData * graphWidget,OverlayWidgetCounts * widgetCounts)413*8975f5c5SAndroid Build Coastguard Worker void AppendWidgetDataHelper::AppendVulkanWriteDescriptorSetCount(const overlay::Widget *widget,
414*8975f5c5SAndroid Build Coastguard Worker                                                                  const gl::Extents &imageExtent,
415*8975f5c5SAndroid Build Coastguard Worker                                                                  TextWidgetData *textWidget,
416*8975f5c5SAndroid Build Coastguard Worker                                                                  GraphWidgetData *graphWidget,
417*8975f5c5SAndroid Build Coastguard Worker                                                                  OverlayWidgetCounts *widgetCounts)
418*8975f5c5SAndroid Build Coastguard Worker {
419*8975f5c5SAndroid Build Coastguard Worker     auto format = [](uint64_t curValue, uint64_t maxValue) {
420*8975f5c5SAndroid Build Coastguard Worker         std::ostringstream text;
421*8975f5c5SAndroid Build Coastguard Worker         text << "WriteDescriptorSet Count: " << maxValue;
422*8975f5c5SAndroid Build Coastguard Worker         return text.str();
423*8975f5c5SAndroid Build Coastguard Worker     };
424*8975f5c5SAndroid Build Coastguard Worker 
425*8975f5c5SAndroid Build Coastguard Worker     AppendRunningGraphCommon(widget, imageExtent, textWidget, graphWidget, widgetCounts, format);
426*8975f5c5SAndroid Build Coastguard Worker }
427*8975f5c5SAndroid Build Coastguard Worker 
AppendVulkanDescriptorSetAllocations(const overlay::Widget * widget,const gl::Extents & imageExtent,TextWidgetData * textWidget,GraphWidgetData * graphWidget,OverlayWidgetCounts * widgetCounts)428*8975f5c5SAndroid Build Coastguard Worker void AppendWidgetDataHelper::AppendVulkanDescriptorSetAllocations(const overlay::Widget *widget,
429*8975f5c5SAndroid Build Coastguard Worker                                                                   const gl::Extents &imageExtent,
430*8975f5c5SAndroid Build Coastguard Worker                                                                   TextWidgetData *textWidget,
431*8975f5c5SAndroid Build Coastguard Worker                                                                   GraphWidgetData *graphWidget,
432*8975f5c5SAndroid Build Coastguard Worker                                                                   OverlayWidgetCounts *widgetCounts)
433*8975f5c5SAndroid Build Coastguard Worker {
434*8975f5c5SAndroid Build Coastguard Worker     auto format = [](uint64_t curValue, uint64_t maxValue) {
435*8975f5c5SAndroid Build Coastguard Worker         std::ostringstream text;
436*8975f5c5SAndroid Build Coastguard Worker         text << "Descriptor Set Allocations: " << maxValue;
437*8975f5c5SAndroid Build Coastguard Worker         return text.str();
438*8975f5c5SAndroid Build Coastguard Worker     };
439*8975f5c5SAndroid Build Coastguard Worker 
440*8975f5c5SAndroid Build Coastguard Worker     AppendRunningGraphCommon(widget, imageExtent, textWidget, graphWidget, widgetCounts, format);
441*8975f5c5SAndroid Build Coastguard Worker }
442*8975f5c5SAndroid Build Coastguard Worker 
AppendVulkanShaderResourceDSHitRate(const overlay::Widget * widget,const gl::Extents & imageExtent,TextWidgetData * textWidget,GraphWidgetData * graphWidget,OverlayWidgetCounts * widgetCounts)443*8975f5c5SAndroid Build Coastguard Worker void AppendWidgetDataHelper::AppendVulkanShaderResourceDSHitRate(const overlay::Widget *widget,
444*8975f5c5SAndroid Build Coastguard Worker                                                                  const gl::Extents &imageExtent,
445*8975f5c5SAndroid Build Coastguard Worker                                                                  TextWidgetData *textWidget,
446*8975f5c5SAndroid Build Coastguard Worker                                                                  GraphWidgetData *graphWidget,
447*8975f5c5SAndroid Build Coastguard Worker                                                                  OverlayWidgetCounts *widgetCounts)
448*8975f5c5SAndroid Build Coastguard Worker {
449*8975f5c5SAndroid Build Coastguard Worker     auto format = [](uint64_t curValue, uint64_t maxValue) {
450*8975f5c5SAndroid Build Coastguard Worker         std::ostringstream text;
451*8975f5c5SAndroid Build Coastguard Worker         text << "Shader Resource DS Hit Rate (Max: " << maxValue << "%)";
452*8975f5c5SAndroid Build Coastguard Worker         return text.str();
453*8975f5c5SAndroid Build Coastguard Worker     };
454*8975f5c5SAndroid Build Coastguard Worker 
455*8975f5c5SAndroid Build Coastguard Worker     AppendRunningGraphCommon(widget, imageExtent, textWidget, graphWidget, widgetCounts, format);
456*8975f5c5SAndroid Build Coastguard Worker }
457*8975f5c5SAndroid Build Coastguard Worker 
AppendVulkanDynamicBufferAllocations(const overlay::Widget * widget,const gl::Extents & imageExtent,TextWidgetData * textWidget,GraphWidgetData * graphWidget,OverlayWidgetCounts * widgetCounts)458*8975f5c5SAndroid Build Coastguard Worker void AppendWidgetDataHelper::AppendVulkanDynamicBufferAllocations(const overlay::Widget *widget,
459*8975f5c5SAndroid Build Coastguard Worker                                                                   const gl::Extents &imageExtent,
460*8975f5c5SAndroid Build Coastguard Worker                                                                   TextWidgetData *textWidget,
461*8975f5c5SAndroid Build Coastguard Worker                                                                   GraphWidgetData *graphWidget,
462*8975f5c5SAndroid Build Coastguard Worker                                                                   OverlayWidgetCounts *widgetCounts)
463*8975f5c5SAndroid Build Coastguard Worker {
464*8975f5c5SAndroid Build Coastguard Worker     auto format = [](uint64_t curValue, uint64_t maxValue) {
465*8975f5c5SAndroid Build Coastguard Worker         std::ostringstream text;
466*8975f5c5SAndroid Build Coastguard Worker         text << "DynamicBuffer Allocations (Max: " << maxValue << ")";
467*8975f5c5SAndroid Build Coastguard Worker         return text.str();
468*8975f5c5SAndroid Build Coastguard Worker     };
469*8975f5c5SAndroid Build Coastguard Worker 
470*8975f5c5SAndroid Build Coastguard Worker     AppendRunningGraphCommon(widget, imageExtent, textWidget, graphWidget, widgetCounts, format);
471*8975f5c5SAndroid Build Coastguard Worker }
472*8975f5c5SAndroid Build Coastguard Worker 
AppendVulkanTextureDescriptorCacheSize(const overlay::Widget * widget,const gl::Extents & imageExtent,TextWidgetData * textWidget,GraphWidgetData * graphWidget,OverlayWidgetCounts * widgetCounts)473*8975f5c5SAndroid Build Coastguard Worker void AppendWidgetDataHelper::AppendVulkanTextureDescriptorCacheSize(
474*8975f5c5SAndroid Build Coastguard Worker     const overlay::Widget *widget,
475*8975f5c5SAndroid Build Coastguard Worker     const gl::Extents &imageExtent,
476*8975f5c5SAndroid Build Coastguard Worker     TextWidgetData *textWidget,
477*8975f5c5SAndroid Build Coastguard Worker     GraphWidgetData *graphWidget,
478*8975f5c5SAndroid Build Coastguard Worker     OverlayWidgetCounts *widgetCounts)
479*8975f5c5SAndroid Build Coastguard Worker {
480*8975f5c5SAndroid Build Coastguard Worker     auto format = [](uint64_t curValue, uint64_t maxValue) {
481*8975f5c5SAndroid Build Coastguard Worker         std::ostringstream text;
482*8975f5c5SAndroid Build Coastguard Worker         text << "Total Texture Descriptor Cache Size: " << curValue;
483*8975f5c5SAndroid Build Coastguard Worker         return text.str();
484*8975f5c5SAndroid Build Coastguard Worker     };
485*8975f5c5SAndroid Build Coastguard Worker 
486*8975f5c5SAndroid Build Coastguard Worker     AppendRunningGraphCommon(widget, imageExtent, textWidget, graphWidget, widgetCounts, format);
487*8975f5c5SAndroid Build Coastguard Worker }
488*8975f5c5SAndroid Build Coastguard Worker 
AppendVulkanUniformDescriptorCacheSize(const overlay::Widget * widget,const gl::Extents & imageExtent,TextWidgetData * textWidget,GraphWidgetData * graphWidget,OverlayWidgetCounts * widgetCounts)489*8975f5c5SAndroid Build Coastguard Worker void AppendWidgetDataHelper::AppendVulkanUniformDescriptorCacheSize(
490*8975f5c5SAndroid Build Coastguard Worker     const overlay::Widget *widget,
491*8975f5c5SAndroid Build Coastguard Worker     const gl::Extents &imageExtent,
492*8975f5c5SAndroid Build Coastguard Worker     TextWidgetData *textWidget,
493*8975f5c5SAndroid Build Coastguard Worker     GraphWidgetData *graphWidget,
494*8975f5c5SAndroid Build Coastguard Worker     OverlayWidgetCounts *widgetCounts)
495*8975f5c5SAndroid Build Coastguard Worker {
496*8975f5c5SAndroid Build Coastguard Worker     auto format = [](uint64_t curValue, uint64_t maxValue) {
497*8975f5c5SAndroid Build Coastguard Worker         std::ostringstream text;
498*8975f5c5SAndroid Build Coastguard Worker         text << "Total Uniform Descriptor Cache Size: " << curValue;
499*8975f5c5SAndroid Build Coastguard Worker         return text.str();
500*8975f5c5SAndroid Build Coastguard Worker     };
501*8975f5c5SAndroid Build Coastguard Worker 
502*8975f5c5SAndroid Build Coastguard Worker     AppendRunningGraphCommon(widget, imageExtent, textWidget, graphWidget, widgetCounts, format);
503*8975f5c5SAndroid Build Coastguard Worker }
504*8975f5c5SAndroid Build Coastguard Worker 
AppendVulkanDescriptorCacheSize(const overlay::Widget * widget,const gl::Extents & imageExtent,TextWidgetData * textWidget,GraphWidgetData * graphWidget,OverlayWidgetCounts * widgetCounts)505*8975f5c5SAndroid Build Coastguard Worker void AppendWidgetDataHelper::AppendVulkanDescriptorCacheSize(const overlay::Widget *widget,
506*8975f5c5SAndroid Build Coastguard Worker                                                              const gl::Extents &imageExtent,
507*8975f5c5SAndroid Build Coastguard Worker                                                              TextWidgetData *textWidget,
508*8975f5c5SAndroid Build Coastguard Worker                                                              GraphWidgetData *graphWidget,
509*8975f5c5SAndroid Build Coastguard Worker                                                              OverlayWidgetCounts *widgetCounts)
510*8975f5c5SAndroid Build Coastguard Worker {
511*8975f5c5SAndroid Build Coastguard Worker     auto format = [](uint64_t curValue, uint64_t maxValue) {
512*8975f5c5SAndroid Build Coastguard Worker         std::ostringstream text;
513*8975f5c5SAndroid Build Coastguard Worker         text << "Total Descriptor Cache Size: " << curValue;
514*8975f5c5SAndroid Build Coastguard Worker         return text.str();
515*8975f5c5SAndroid Build Coastguard Worker     };
516*8975f5c5SAndroid Build Coastguard Worker 
517*8975f5c5SAndroid Build Coastguard Worker     AppendRunningGraphCommon(widget, imageExtent, textWidget, graphWidget, widgetCounts, format);
518*8975f5c5SAndroid Build Coastguard Worker }
519*8975f5c5SAndroid Build Coastguard Worker 
AppendVulkanDescriptorCacheKeySize(const overlay::Widget * widget,const gl::Extents & imageExtent,TextWidgetData * textWidget,GraphWidgetData * graphWidget,OverlayWidgetCounts * widgetCounts)520*8975f5c5SAndroid Build Coastguard Worker void AppendWidgetDataHelper::AppendVulkanDescriptorCacheKeySize(const overlay::Widget *widget,
521*8975f5c5SAndroid Build Coastguard Worker                                                                 const gl::Extents &imageExtent,
522*8975f5c5SAndroid Build Coastguard Worker                                                                 TextWidgetData *textWidget,
523*8975f5c5SAndroid Build Coastguard Worker                                                                 GraphWidgetData *graphWidget,
524*8975f5c5SAndroid Build Coastguard Worker                                                                 OverlayWidgetCounts *widgetCounts)
525*8975f5c5SAndroid Build Coastguard Worker {
526*8975f5c5SAndroid Build Coastguard Worker     const overlay::Count *countWidget = static_cast<const overlay::Count *>(widget);
527*8975f5c5SAndroid Build Coastguard Worker     std::ostringstream text;
528*8975f5c5SAndroid Build Coastguard Worker     double kb = static_cast<double>(countWidget->count) / 1000.0;
529*8975f5c5SAndroid Build Coastguard Worker     text << "DS Cache Key Size: " << std::fixed << std::setprecision(1) << kb << " kb";
530*8975f5c5SAndroid Build Coastguard Worker 
531*8975f5c5SAndroid Build Coastguard Worker     AppendTextCommon(widget, imageExtent, text.str(), textWidget, widgetCounts);
532*8975f5c5SAndroid Build Coastguard Worker }
533*8975f5c5SAndroid Build Coastguard Worker 
AppendVulkanAttemptedSubmissions(const overlay::Widget * widget,const gl::Extents & imageExtent,TextWidgetData * textWidget,GraphWidgetData * graphWidget,OverlayWidgetCounts * widgetCounts)534*8975f5c5SAndroid Build Coastguard Worker void AppendWidgetDataHelper::AppendVulkanAttemptedSubmissions(const overlay::Widget *widget,
535*8975f5c5SAndroid Build Coastguard Worker                                                               const gl::Extents &imageExtent,
536*8975f5c5SAndroid Build Coastguard Worker                                                               TextWidgetData *textWidget,
537*8975f5c5SAndroid Build Coastguard Worker                                                               GraphWidgetData *graphWidget,
538*8975f5c5SAndroid Build Coastguard Worker                                                               OverlayWidgetCounts *widgetCounts)
539*8975f5c5SAndroid Build Coastguard Worker {
540*8975f5c5SAndroid Build Coastguard Worker     auto format = [](uint64_t curValue, uint64_t maxValue) {
541*8975f5c5SAndroid Build Coastguard Worker         std::ostringstream text;
542*8975f5c5SAndroid Build Coastguard Worker         text << "Attempted submissions (peak): " << maxValue;
543*8975f5c5SAndroid Build Coastguard Worker         return text.str();
544*8975f5c5SAndroid Build Coastguard Worker     };
545*8975f5c5SAndroid Build Coastguard Worker 
546*8975f5c5SAndroid Build Coastguard Worker     AppendRunningGraphCommon(widget, imageExtent, textWidget, graphWidget, widgetCounts, format);
547*8975f5c5SAndroid Build Coastguard Worker }
548*8975f5c5SAndroid Build Coastguard Worker 
AppendVulkanActualSubmissions(const overlay::Widget * widget,const gl::Extents & imageExtent,TextWidgetData * textWidget,GraphWidgetData * graphWidget,OverlayWidgetCounts * widgetCounts)549*8975f5c5SAndroid Build Coastguard Worker void AppendWidgetDataHelper::AppendVulkanActualSubmissions(const overlay::Widget *widget,
550*8975f5c5SAndroid Build Coastguard Worker                                                            const gl::Extents &imageExtent,
551*8975f5c5SAndroid Build Coastguard Worker                                                            TextWidgetData *textWidget,
552*8975f5c5SAndroid Build Coastguard Worker                                                            GraphWidgetData *graphWidget,
553*8975f5c5SAndroid Build Coastguard Worker                                                            OverlayWidgetCounts *widgetCounts)
554*8975f5c5SAndroid Build Coastguard Worker {
555*8975f5c5SAndroid Build Coastguard Worker     auto format = [](uint64_t curValue, uint64_t maxValue) {
556*8975f5c5SAndroid Build Coastguard Worker         std::ostringstream text;
557*8975f5c5SAndroid Build Coastguard Worker         text << "Actual submissions (peak): " << maxValue;
558*8975f5c5SAndroid Build Coastguard Worker         return text.str();
559*8975f5c5SAndroid Build Coastguard Worker     };
560*8975f5c5SAndroid Build Coastguard Worker 
561*8975f5c5SAndroid Build Coastguard Worker     AppendRunningGraphCommon(widget, imageExtent, textWidget, graphWidget, widgetCounts, format);
562*8975f5c5SAndroid Build Coastguard Worker }
563*8975f5c5SAndroid Build Coastguard Worker 
AppendVulkanPipelineCacheLookups(const overlay::Widget * widget,const gl::Extents & imageExtent,TextWidgetData * textWidget,GraphWidgetData * graphWidget,OverlayWidgetCounts * widgetCounts)564*8975f5c5SAndroid Build Coastguard Worker void AppendWidgetDataHelper::AppendVulkanPipelineCacheLookups(const overlay::Widget *widget,
565*8975f5c5SAndroid Build Coastguard Worker                                                               const gl::Extents &imageExtent,
566*8975f5c5SAndroid Build Coastguard Worker                                                               TextWidgetData *textWidget,
567*8975f5c5SAndroid Build Coastguard Worker                                                               GraphWidgetData *graphWidget,
568*8975f5c5SAndroid Build Coastguard Worker                                                               OverlayWidgetCounts *widgetCounts)
569*8975f5c5SAndroid Build Coastguard Worker {
570*8975f5c5SAndroid Build Coastguard Worker     auto format = [](uint64_t curValue, uint64_t maxValue) {
571*8975f5c5SAndroid Build Coastguard Worker         std::ostringstream text;
572*8975f5c5SAndroid Build Coastguard Worker         text << "Pipeline Cache Lookups (peak): " << maxValue;
573*8975f5c5SAndroid Build Coastguard Worker         return text.str();
574*8975f5c5SAndroid Build Coastguard Worker     };
575*8975f5c5SAndroid Build Coastguard Worker 
576*8975f5c5SAndroid Build Coastguard Worker     AppendRunningGraphCommon(widget, imageExtent, textWidget, graphWidget, widgetCounts, format);
577*8975f5c5SAndroid Build Coastguard Worker }
578*8975f5c5SAndroid Build Coastguard Worker 
AppendVulkanPipelineCacheMisses(const overlay::Widget * widget,const gl::Extents & imageExtent,TextWidgetData * textWidget,GraphWidgetData * graphWidget,OverlayWidgetCounts * widgetCounts)579*8975f5c5SAndroid Build Coastguard Worker void AppendWidgetDataHelper::AppendVulkanPipelineCacheMisses(const overlay::Widget *widget,
580*8975f5c5SAndroid Build Coastguard Worker                                                              const gl::Extents &imageExtent,
581*8975f5c5SAndroid Build Coastguard Worker                                                              TextWidgetData *textWidget,
582*8975f5c5SAndroid Build Coastguard Worker                                                              GraphWidgetData *graphWidget,
583*8975f5c5SAndroid Build Coastguard Worker                                                              OverlayWidgetCounts *widgetCounts)
584*8975f5c5SAndroid Build Coastguard Worker {
585*8975f5c5SAndroid Build Coastguard Worker     auto format = [](uint64_t curValue, uint64_t maxValue) {
586*8975f5c5SAndroid Build Coastguard Worker         std::ostringstream text;
587*8975f5c5SAndroid Build Coastguard Worker         text << "Pipeline Cache Misses (peak): " << maxValue;
588*8975f5c5SAndroid Build Coastguard Worker         return text.str();
589*8975f5c5SAndroid Build Coastguard Worker     };
590*8975f5c5SAndroid Build Coastguard Worker 
591*8975f5c5SAndroid Build Coastguard Worker     AppendRunningGraphCommon(widget, imageExtent, textWidget, graphWidget, widgetCounts, format);
592*8975f5c5SAndroid Build Coastguard Worker }
593*8975f5c5SAndroid Build Coastguard Worker 
AppendVulkanTotalPipelineCacheHitTimeMs(const overlay::Widget * widget,const gl::Extents & imageExtent,TextWidgetData * textWidget,GraphWidgetData * graphWidget,OverlayWidgetCounts * widgetCounts)594*8975f5c5SAndroid Build Coastguard Worker void AppendWidgetDataHelper::AppendVulkanTotalPipelineCacheHitTimeMs(
595*8975f5c5SAndroid Build Coastguard Worker     const overlay::Widget *widget,
596*8975f5c5SAndroid Build Coastguard Worker     const gl::Extents &imageExtent,
597*8975f5c5SAndroid Build Coastguard Worker     TextWidgetData *textWidget,
598*8975f5c5SAndroid Build Coastguard Worker     GraphWidgetData *graphWidget,
599*8975f5c5SAndroid Build Coastguard Worker     OverlayWidgetCounts *widgetCounts)
600*8975f5c5SAndroid Build Coastguard Worker {
601*8975f5c5SAndroid Build Coastguard Worker     const overlay::Count *totalTime = static_cast<const overlay::Count *>(widget);
602*8975f5c5SAndroid Build Coastguard Worker     std::ostringstream text;
603*8975f5c5SAndroid Build Coastguard Worker     text << "Total Pipeline Cache Hit Time: ";
604*8975f5c5SAndroid Build Coastguard Worker     OutputCount(text, totalTime);
605*8975f5c5SAndroid Build Coastguard Worker     text << "ms";
606*8975f5c5SAndroid Build Coastguard Worker 
607*8975f5c5SAndroid Build Coastguard Worker     AppendTextCommon(widget, imageExtent, text.str(), textWidget, widgetCounts);
608*8975f5c5SAndroid Build Coastguard Worker }
609*8975f5c5SAndroid Build Coastguard Worker 
AppendVulkanTotalPipelineCacheMissTimeMs(const overlay::Widget * widget,const gl::Extents & imageExtent,TextWidgetData * textWidget,GraphWidgetData * graphWidget,OverlayWidgetCounts * widgetCounts)610*8975f5c5SAndroid Build Coastguard Worker void AppendWidgetDataHelper::AppendVulkanTotalPipelineCacheMissTimeMs(
611*8975f5c5SAndroid Build Coastguard Worker     const overlay::Widget *widget,
612*8975f5c5SAndroid Build Coastguard Worker     const gl::Extents &imageExtent,
613*8975f5c5SAndroid Build Coastguard Worker     TextWidgetData *textWidget,
614*8975f5c5SAndroid Build Coastguard Worker     GraphWidgetData *graphWidget,
615*8975f5c5SAndroid Build Coastguard Worker     OverlayWidgetCounts *widgetCounts)
616*8975f5c5SAndroid Build Coastguard Worker {
617*8975f5c5SAndroid Build Coastguard Worker     const overlay::Count *totalTime = static_cast<const overlay::Count *>(widget);
618*8975f5c5SAndroid Build Coastguard Worker     std::ostringstream text;
619*8975f5c5SAndroid Build Coastguard Worker     text << "Total Pipeline Cache Miss Time: ";
620*8975f5c5SAndroid Build Coastguard Worker     OutputCount(text, totalTime);
621*8975f5c5SAndroid Build Coastguard Worker     text << "ms";
622*8975f5c5SAndroid Build Coastguard Worker 
623*8975f5c5SAndroid Build Coastguard Worker     AppendTextCommon(widget, imageExtent, text.str(), textWidget, widgetCounts);
624*8975f5c5SAndroid Build Coastguard Worker }
625*8975f5c5SAndroid Build Coastguard Worker 
OutputPerSecond(std::ostream & out,const overlay::PerSecond * perSecond)626*8975f5c5SAndroid Build Coastguard Worker std::ostream &AppendWidgetDataHelper::OutputPerSecond(std::ostream &out,
627*8975f5c5SAndroid Build Coastguard Worker                                                       const overlay::PerSecond *perSecond)
628*8975f5c5SAndroid Build Coastguard Worker {
629*8975f5c5SAndroid Build Coastguard Worker     return out << perSecond->lastPerSecondCount;
630*8975f5c5SAndroid Build Coastguard Worker }
631*8975f5c5SAndroid Build Coastguard Worker 
OutputText(std::ostream & out,const overlay::Text * text)632*8975f5c5SAndroid Build Coastguard Worker std::ostream &AppendWidgetDataHelper::OutputText(std::ostream &out, const overlay::Text *text)
633*8975f5c5SAndroid Build Coastguard Worker {
634*8975f5c5SAndroid Build Coastguard Worker     return out << text->text;
635*8975f5c5SAndroid Build Coastguard Worker }
636*8975f5c5SAndroid Build Coastguard Worker 
OutputCount(std::ostream & out,const overlay::Count * count)637*8975f5c5SAndroid Build Coastguard Worker std::ostream &AppendWidgetDataHelper::OutputCount(std::ostream &out, const overlay::Count *count)
638*8975f5c5SAndroid Build Coastguard Worker {
639*8975f5c5SAndroid Build Coastguard Worker     return out << count->count;
640*8975f5c5SAndroid Build Coastguard Worker }
641*8975f5c5SAndroid Build Coastguard Worker }  // namespace overlay_impl
642*8975f5c5SAndroid Build Coastguard Worker 
643*8975f5c5SAndroid Build Coastguard Worker namespace
644*8975f5c5SAndroid Build Coastguard Worker {
645*8975f5c5SAndroid Build Coastguard Worker #define ANGLE_APPEND_WIDGET_MAP_PROC(WIDGET_ID) \
646*8975f5c5SAndroid Build Coastguard Worker     {WidgetId::WIDGET_ID, overlay_impl::AppendWidgetDataHelper::Append##WIDGET_ID},
647*8975f5c5SAndroid Build Coastguard Worker 
648*8975f5c5SAndroid Build Coastguard Worker constexpr angle::PackedEnumMap<WidgetId, AppendWidgetDataFunc> kWidgetIdToAppendDataFuncMap = {
649*8975f5c5SAndroid Build Coastguard Worker     ANGLE_WIDGET_ID_X(ANGLE_APPEND_WIDGET_MAP_PROC)};
650*8975f5c5SAndroid Build Coastguard Worker }  // namespace
651*8975f5c5SAndroid Build Coastguard Worker 
652*8975f5c5SAndroid Build Coastguard Worker namespace overlay
653*8975f5c5SAndroid Build Coastguard Worker {
getDescriptionWidget() const654*8975f5c5SAndroid Build Coastguard Worker const Text *Widget::getDescriptionWidget() const
655*8975f5c5SAndroid Build Coastguard Worker {
656*8975f5c5SAndroid Build Coastguard Worker     return nullptr;
657*8975f5c5SAndroid Build Coastguard Worker }
RunningGraph(size_t n)658*8975f5c5SAndroid Build Coastguard Worker RunningGraph::RunningGraph(size_t n) : runningValues(n, 0) {}
659*8975f5c5SAndroid Build Coastguard Worker RunningGraph::~RunningGraph() = default;
getDescriptionWidget() const660*8975f5c5SAndroid Build Coastguard Worker const Text *RunningGraph::getDescriptionWidget() const
661*8975f5c5SAndroid Build Coastguard Worker {
662*8975f5c5SAndroid Build Coastguard Worker     return &description;
663*8975f5c5SAndroid Build Coastguard Worker }
664*8975f5c5SAndroid Build Coastguard Worker }  // namespace overlay
665*8975f5c5SAndroid Build Coastguard Worker 
getWidgetCoordinatesBufferSize() const666*8975f5c5SAndroid Build Coastguard Worker size_t OverlayState::getWidgetCoordinatesBufferSize() const
667*8975f5c5SAndroid Build Coastguard Worker {
668*8975f5c5SAndroid Build Coastguard Worker     return sizeof(WidgetCoordinates);
669*8975f5c5SAndroid Build Coastguard Worker }
670*8975f5c5SAndroid Build Coastguard Worker 
getTextWidgetsBufferSize() const671*8975f5c5SAndroid Build Coastguard Worker size_t OverlayState::getTextWidgetsBufferSize() const
672*8975f5c5SAndroid Build Coastguard Worker {
673*8975f5c5SAndroid Build Coastguard Worker     return sizeof(TextWidgets);
674*8975f5c5SAndroid Build Coastguard Worker }
675*8975f5c5SAndroid Build Coastguard Worker 
getGraphWidgetsBufferSize() const676*8975f5c5SAndroid Build Coastguard Worker size_t OverlayState::getGraphWidgetsBufferSize() const
677*8975f5c5SAndroid Build Coastguard Worker {
678*8975f5c5SAndroid Build Coastguard Worker     return sizeof(GraphWidgets);
679*8975f5c5SAndroid Build Coastguard Worker }
680*8975f5c5SAndroid Build Coastguard Worker 
fillWidgetData(const gl::Extents & imageExtents,uint8_t * textData,uint8_t * graphData,uint32_t * activeTextWidgetCountOut,uint32_t * activeGraphWidgetCountOut) const681*8975f5c5SAndroid Build Coastguard Worker void OverlayState::fillWidgetData(const gl::Extents &imageExtents,
682*8975f5c5SAndroid Build Coastguard Worker                                   uint8_t *textData,
683*8975f5c5SAndroid Build Coastguard Worker                                   uint8_t *graphData,
684*8975f5c5SAndroid Build Coastguard Worker                                   uint32_t *activeTextWidgetCountOut,
685*8975f5c5SAndroid Build Coastguard Worker                                   uint32_t *activeGraphWidgetCountOut) const
686*8975f5c5SAndroid Build Coastguard Worker {
687*8975f5c5SAndroid Build Coastguard Worker     TextWidgets *textWidgets   = reinterpret_cast<TextWidgets *>(textData);
688*8975f5c5SAndroid Build Coastguard Worker     GraphWidgets *graphWidgets = reinterpret_cast<GraphWidgets *>(graphData);
689*8975f5c5SAndroid Build Coastguard Worker 
690*8975f5c5SAndroid Build Coastguard Worker     memset(textWidgets, overlay::kFontCharacters, sizeof(*textWidgets));
691*8975f5c5SAndroid Build Coastguard Worker     memset(graphWidgets, 0, sizeof(*graphWidgets));
692*8975f5c5SAndroid Build Coastguard Worker 
693*8975f5c5SAndroid Build Coastguard Worker     OverlayWidgetCounts widgetCounts = {};
694*8975f5c5SAndroid Build Coastguard Worker 
695*8975f5c5SAndroid Build Coastguard Worker     for (WidgetId id : angle::AllEnums<WidgetId>())
696*8975f5c5SAndroid Build Coastguard Worker     {
697*8975f5c5SAndroid Build Coastguard Worker         const std::unique_ptr<overlay::Widget> &widget = mOverlayWidgets[id];
698*8975f5c5SAndroid Build Coastguard Worker         if (!widget->enabled)
699*8975f5c5SAndroid Build Coastguard Worker         {
700*8975f5c5SAndroid Build Coastguard Worker             continue;
701*8975f5c5SAndroid Build Coastguard Worker         }
702*8975f5c5SAndroid Build Coastguard Worker 
703*8975f5c5SAndroid Build Coastguard Worker         WidgetInternalType internalType = kWidgetTypeToInternalMap[widget->type];
704*8975f5c5SAndroid Build Coastguard Worker         ASSERT(internalType != WidgetInternalType::InvalidEnum);
705*8975f5c5SAndroid Build Coastguard Worker 
706*8975f5c5SAndroid Build Coastguard Worker         if (widgetCounts[internalType] >= kWidgetInternalTypeMaxWidgets[internalType])
707*8975f5c5SAndroid Build Coastguard Worker         {
708*8975f5c5SAndroid Build Coastguard Worker             continue;
709*8975f5c5SAndroid Build Coastguard Worker         }
710*8975f5c5SAndroid Build Coastguard Worker 
711*8975f5c5SAndroid Build Coastguard Worker         AppendWidgetDataFunc appendFunc = kWidgetIdToAppendDataFuncMap[id];
712*8975f5c5SAndroid Build Coastguard Worker         ASSERT(appendFunc);
713*8975f5c5SAndroid Build Coastguard Worker         appendFunc(widget.get(), imageExtents,
714*8975f5c5SAndroid Build Coastguard Worker                    &textWidgets->widgets[widgetCounts[WidgetInternalType::Text]],
715*8975f5c5SAndroid Build Coastguard Worker                    &graphWidgets->widgets[widgetCounts[WidgetInternalType::Graph]], &widgetCounts);
716*8975f5c5SAndroid Build Coastguard Worker     }
717*8975f5c5SAndroid Build Coastguard Worker 
718*8975f5c5SAndroid Build Coastguard Worker     *activeTextWidgetCountOut  = widgetCounts[WidgetInternalType::Text];
719*8975f5c5SAndroid Build Coastguard Worker     *activeGraphWidgetCountOut = widgetCounts[WidgetInternalType::Graph];
720*8975f5c5SAndroid Build Coastguard Worker }
721*8975f5c5SAndroid Build Coastguard Worker 
722*8975f5c5SAndroid Build Coastguard Worker }  // namespace gl
723