1 | //************************************ bs::framework - Copyright 2018 Marko Pintera **************************************// |
2 | //*********** Licensed under the MIT license. See LICENSE.md for full terms. This notice is not to be removed. ***********// |
3 | #pragma once |
4 | |
5 | #include "BsPrerequisites.h" |
6 | #include "Scene/BsComponent.h" |
7 | #include "Profiling/BsProfilerGPU.h" |
8 | #include "Utility/BsEvent.h" |
9 | |
10 | namespace bs |
11 | { |
12 | /** @addtogroup GUI-Internal |
13 | * @{ |
14 | */ |
15 | |
16 | class ProfilerOverlay; |
17 | |
18 | /** Handles rendering of Profiler information as an overlay in a viewport. */ |
19 | class BS_EXPORT ProfilerOverlay |
20 | { |
21 | public: |
22 | /** Holds data about GUI elements in a single row of a "CPU basic" sample. */ |
23 | struct BasicRow |
24 | { |
25 | GUILayout* labelLayout; |
26 | GUILayout* contentLayout; |
27 | GUIFixedSpace* labelSpace; |
28 | |
29 | GUILabel* guiName; |
30 | GUILabel* guiPctOfParent; |
31 | GUILabel* guiNumCalls; |
32 | GUILabel* guiNumAllocs; |
33 | GUILabel* guiNumFrees; |
34 | GUILabel* guiAvgTime; |
35 | GUILabel* guiTotalTime; |
36 | GUILabel* guiAvgTimeSelf; |
37 | GUILabel* guiTotalTimeSelf; |
38 | |
39 | HString name; |
40 | HString pctOfParent; |
41 | HString numCalls; |
42 | HString numAllocs; |
43 | HString numFrees; |
44 | HString avgTime; |
45 | HString totalTime; |
46 | HString avgTimeSelf; |
47 | HString totalTimeSelf; |
48 | |
49 | bool disabled; |
50 | }; |
51 | |
52 | /** Holds data about GUI elements in a single row of a "CPU precise" sample. */ |
53 | struct PreciseRow |
54 | { |
55 | GUILayout* labelLayout; |
56 | GUILayout* contentLayout; |
57 | GUIFixedSpace* labelSpace; |
58 | |
59 | GUILabel* guiName; |
60 | GUILabel* guiPctOfParent; |
61 | GUILabel* guiNumCalls; |
62 | GUILabel* guiNumAllocs; |
63 | GUILabel* guiNumFrees; |
64 | GUILabel* guiAvgCycles; |
65 | GUILabel* guiTotalCycles; |
66 | GUILabel* guiAvgCyclesSelf; |
67 | GUILabel* guiTotalCyclesSelf; |
68 | |
69 | HString name; |
70 | HString pctOfParent; |
71 | HString numCalls; |
72 | HString numAllocs; |
73 | HString numFrees; |
74 | HString avgCycles; |
75 | HString totalCycles; |
76 | HString avgCyclesSelf; |
77 | HString totalCyclesSelf; |
78 | |
79 | bool disabled; |
80 | }; |
81 | |
82 | /** Holds data about GUI elements in a single row of a GPU sample. */ |
83 | struct GPUSampleRow |
84 | { |
85 | GUILayout* labelLayout; |
86 | GUILayout* contentLayout; |
87 | GUIFixedSpace* labelSpace; |
88 | |
89 | GUILabel* guiName; |
90 | GUILabel* guiTime; |
91 | |
92 | HString name; |
93 | HString time; |
94 | |
95 | bool disabled; |
96 | }; |
97 | |
98 | public: |
99 | /** Constructs a new overlay attached to the specified parent and displayed on the provided camera. */ |
100 | ProfilerOverlay(const SPtr<Camera>& camera); |
101 | ~ProfilerOverlay(); |
102 | |
103 | /** Changes the camera to display the overlay on. */ |
104 | void setTarget(const SPtr<Camera>& camera); |
105 | |
106 | /** Shows the overlay of the specified type. */ |
107 | void show(ProfilerOverlayType type); |
108 | |
109 | /** Hides the overlay. */ |
110 | void hide(); |
111 | |
112 | /** Updates overlay contents. Should be called once per frame. */ |
113 | void update(); |
114 | private: |
115 | /** Called whenever the viewport resizes in order to rearrange the GUI elements. */ |
116 | void targetResized(); |
117 | |
118 | /** Updates sizes of GUI areas used for displaying CPU sample data. To be called after viewport change or resize. */ |
119 | void updateCPUSampleAreaSizes(); |
120 | |
121 | /** Updates sizes of GUI areas used for displaying GPU sample data. To be called after viewport change or resize. */ |
122 | void updateGPUSampleAreaSizes(); |
123 | |
124 | /** |
125 | * Updates CPU GUI elements from the data in the provided profiler reports. To be called whenever a new report is |
126 | * received. |
127 | */ |
128 | void updateCPUSampleContents(const ProfilerReport& simReport, const ProfilerReport& coreReport); |
129 | |
130 | /** |
131 | * Updates GPU GUI elemnts from the data in the provided profiler report. To be called whenever a new report is |
132 | * received. |
133 | */ |
134 | void updateGPUSampleContents(const GPUProfilerReport& gpuReport); |
135 | |
136 | static constexpr UINT32 GPU_NUM_SAMPLE_COLUMNS = 3; |
137 | |
138 | ProfilerOverlayType mType; |
139 | SPtr<Viewport> mTarget; |
140 | |
141 | HSceneObject mWidgetSO; |
142 | HGUIWidget mWidget; |
143 | |
144 | GUILayout* mBasicLayoutLabels = nullptr; |
145 | GUILayout* mPreciseLayoutLabels = nullptr; |
146 | GUILayout* mBasicLayoutContents = nullptr; |
147 | GUILayout* mPreciseLayoutContents = nullptr; |
148 | |
149 | GUIElement* mTitleBasicName = nullptr; |
150 | GUIElement* mTitleBasicPctOfParent = nullptr; |
151 | GUIElement* mTitleBasicNumCalls = nullptr; |
152 | GUIElement* mTitleBasicNumAllocs = nullptr; |
153 | GUIElement* mTitleBasicNumFrees = nullptr; |
154 | GUIElement* mTitleBasicAvgTime = nullptr; |
155 | GUIElement* mTitleBasicTotalTime = nullptr; |
156 | GUIElement* mTitleBasicAvgTitleSelf = nullptr; |
157 | GUIElement* mTitleBasicTotalTimeSelf = nullptr; |
158 | |
159 | GUIElement* mTitlePreciseName = nullptr; |
160 | GUIElement* mTitlePrecisePctOfParent = nullptr; |
161 | GUIElement* mTitlePreciseNumCalls = nullptr; |
162 | GUIElement* mTitlePreciseNumAllocs = nullptr; |
163 | GUIElement* mTitlePreciseNumFrees = nullptr; |
164 | GUIElement* mTitlePreciseAvgCycles = nullptr; |
165 | GUIElement* mTitlePreciseTotalCycles = nullptr; |
166 | GUIElement* mTitlePreciseAvgCyclesSelf = nullptr; |
167 | GUIElement* mTitlePreciseTotalCyclesSelf = nullptr; |
168 | |
169 | GUILayout* mGPULayoutFrameContents = nullptr; |
170 | GUILayout* mGPULayoutFrameContentsLeft = nullptr; |
171 | GUILayout* mGPULayoutFrameContentsRight = nullptr; |
172 | GUILayout* mGPULayoutSamples = nullptr; |
173 | GUILayout* mGPULayoutSampleLabels[GPU_NUM_SAMPLE_COLUMNS] = { }; |
174 | GUILayout* mGPULayoutSampleContents[GPU_NUM_SAMPLE_COLUMNS] = { }; |
175 | |
176 | GUILabel* = nullptr; |
177 | GUILabel* mGPUTimeLbl = nullptr; |
178 | GUILabel* mGPUDrawCallsLbl = nullptr; |
179 | GUILabel* mGPURenTargetChangesLbl = nullptr; |
180 | GUILabel* mGPUPresentsLbl = nullptr; |
181 | GUILabel* mGPUClearsLbl = nullptr; |
182 | GUILabel* mGPUVerticesLbl = nullptr; |
183 | GUILabel* mGPUPrimitivesLbl = nullptr; |
184 | GUILabel* mGPUSamplesLbl = nullptr; |
185 | GUILabel* mGPUPipelineStateChangesLbl = nullptr; |
186 | |
187 | GUILabel* mGPUObjectsCreatedLbl = nullptr; |
188 | GUILabel* mGPUObjectsDestroyedLbl = nullptr; |
189 | GUILabel* mGPUResourceWritesLbl = nullptr; |
190 | GUILabel* mGPUResourceReadsLbl = nullptr; |
191 | GUILabel* mGPUParamBindsLbl = nullptr; |
192 | GUILabel* mGPUVertexBufferBindsLbl = nullptr; |
193 | GUILabel* mGPUIndexBufferBindsLbl = nullptr; |
194 | |
195 | HString ; |
196 | HString mGPUTimeStr; |
197 | HString mGPUDrawCallsStr; |
198 | HString mGPURenTargetChangesStr; |
199 | HString mGPUPresentsStr; |
200 | HString ; |
201 | HString mGPUVerticesStr; |
202 | HString mGPUPrimitivesStr; |
203 | HString mGPUSamplesStr; |
204 | HString mGPUPipelineStateChangesStr; |
205 | |
206 | HString mGPUObjectsCreatedStr; |
207 | HString mGPUObjectsDestroyedStr; |
208 | HString mGPUResourceWritesStr; |
209 | HString mGPUResourceReadsStr; |
210 | HString mGPUParamBindsStr; |
211 | HString mGPUVertexBufferBindsStr; |
212 | HString mGPUIndexBufferBindsStr; |
213 | |
214 | Vector<BasicRow> mBasicRows; |
215 | Vector<PreciseRow> mPreciseRows; |
216 | Vector<GPUSampleRow> mGPUSampleRows[GPU_NUM_SAMPLE_COLUMNS]; |
217 | |
218 | HEvent mTargetResizedConn; |
219 | bool mIsShown; |
220 | UINT32 mNumGPUSamplesPerColumn = 20; |
221 | }; |
222 | |
223 | /** @} */ |
224 | } |