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