1 /*---------------------------------------------------------------------------*
2 Project: NintendoWare
3 File: demo_DebugUtility.cpp
4
5 Copyright (C)2009-2010 Nintendo Co., Ltd./HAL Laboratory, Inc. All rights reserved.
6
7 These coded instructions, statements, and computer programs contain
8 proprietary information of Nintendo of America Inc. and/or Nintendo
9 Company Ltd., and are protected by Federal copyright law. They may
10 not be disclosed to third parties or copied or duplicated in any form,
11 in whole or in part, without the prior written consent of Nintendo.
12
13 $Revision: 18943 $
14 *---------------------------------------------------------------------------*/
15
16 #include <nw/types.h>
17 #include <nw/os.h>
18 #include <nw/ut/ut_Inlines.h>
19 #include <nw/demo/demo_DebugUtility.h>
20
21 #include <nn/fs.h>
22
23
24 namespace nw {
25 namespace demo {
26
27 size_t DebugUtility::s_DeviceMemoryFreeSize = 0;
28 size_t DebugUtility::s_ParticleMemoryFreeSize = 0;
29 nw::demo::DemoAllocator* DebugUtility::s_DeviceAllocator = NULL;
30 nw::demo::DemoAllocator* DebugUtility::s_ParticleAllocator = NULL;
31 bool DebugUtility::s_IsForceCpuProfilingMode = false;
32 bool DebugUtility::s_SilentMode = false;
33 s32 DebugUtility::s_ProfileCallCount = 0;
34 s32 DebugUtility::s_DebugFrameCount = 0;
35
36 static bool s_LastCpuCountingMode = false;
37
38 //----------------------------------------
39 void
CalcLoadMeter(nw::demo::RenderSystem * renderSystem)40 DebugUtility::CalcLoadMeter(
41 nw::demo::RenderSystem* renderSystem
42 )
43 {
44 NW_POINTER_ASSERT(renderSystem);
45
46 ++s_DebugFrameCount;
47
48 if (nw::demo::DebugUtility::IsCpuProfilingMode() != s_LastCpuCountingMode)
49 {
50 if (!s_SilentMode)
51 {
52 if (nw::demo::DebugUtility::IsCpuProfilingMode())
53 {
54 NW_DEV_LOG("-------------------------------------------------------------------------------\n");
55 NW_DEV_LOG("| Entering CPU profiling mode. |\n");
56 NW_DEV_LOG("-------------------------------------------------------------------------------\n");
57 NW_DEV_LOG("Command list won't run.\n");
58 NW_DEV_LOG("Load meter will be output to log.\n");
59 NW_DEV_LOG("To leave profiling mode, turn DBG switch OFF.\n");
60 NW_DEV_LOG("\n");
61 }
62 else
63 {
64 NW_DEV_LOG("-------------------------------------------------------------------------------\n");
65 NW_DEV_LOG("| Leaving CPU profiling mode. |\n");
66 NW_DEV_LOG("-------------------------------------------------------------------------------\n");
67 }
68 }
69 s_LastCpuCountingMode = nw::demo::DebugUtility::IsCpuProfilingMode();
70 }
71
72 if (s_DebugFrameCount % NW_LOAD_METER_INTERVAL == 0)
73 {
74 if (nw::demo::DebugUtility::IsCpuProfilingMode())
75 {
76 if (s_DebugFrameCount % (NW_LOAD_METER_INTERVAL * 3) == 0)
77 {
78 renderSystem->CalcLoadMeter();
79 if (!s_SilentMode)
80 {
81 DumpLoadMeter(renderSystem);
82 NW_DEV_LOG("\n");
83 }
84 }
85 }
86 else
87 {
88 renderSystem->CalcLoadMeter();
89 }
90 }
91 }
92
93 //----------------------------------------
94 void
DrawLoadMeterText(nw::demo::RenderSystem * renderSystem,nw::demo::GraphicsDrawing * graphicsDrawing)95 DebugUtility::DrawLoadMeterText(
96 nw::demo::RenderSystem* renderSystem,
97 nw::demo::GraphicsDrawing* graphicsDrawing
98 )
99 {
100 NW_POINTER_ASSERT(renderSystem);
101 NW_POINTER_ASSERT(graphicsDrawing);
102
103 static const s32 POS_LOAD_METER_TEXT_X = POS_LOAD_METER_X + 15;
104 static const s32 POS_BAR_CHART_TEXT_X = POS_BAR_CHART_X + 14;
105
106
107 graphicsDrawing->DrawString(POS_COMMAND_SIZE_X, POS_COMMAND_SIZE_Y, "Cmd size : %d bytes\n",
108 renderSystem->GetLoadMeter().drawCommandBufferSize);
109
110 float loadRate =
111 renderSystem->GetLoadMeter().loadTime * nw::demo::RenderSystem::LoadMeterDescription::MILLI_TO_RATE;
112 graphicsDrawing->DrawString(POS_LOAD_METER_TEXT_X, POS_LOAD_METER_Y, "CPU :%5.2f ms/f\n",
113 renderSystem->GetLoadMeter().loadTime);
114
115 float loadGpuRate =
116 renderSystem->GetLoadMeter().loadGpuTime * nw::demo::RenderSystem::LoadMeterDescription::MILLI_TO_RATE;
117 graphicsDrawing->DrawString(POS_LOAD_METER_TEXT_X, POS_LOAD_METER_Y + HEIGHT_LOAD_METER,"GPU :%5.2f ms/f\n",
118 renderSystem->GetLoadMeter().loadGpuTime);
119
120
121 graphicsDrawing->DrawString(
122 POS_BAR_CHART_TEXT_X + WIDTH_LOAD_METER_BAR_CHART / 4 * loadRate,
123 POS_BAR_CHART_Y,
124 "%.2f %%",
125 loadRate * 100.0f
126 );
127
128 graphicsDrawing->DrawString(
129 POS_BAR_CHART_TEXT_X + WIDTH_LOAD_METER_BAR_CHART / 4 * loadGpuRate,
130 POS_BAR_CHART_Y + HEIGHT_LOAD_METER_BAR_CHART,
131 "%.2f %%",
132 loadGpuRate * 100.0f
133 );
134 }
135
136 //----------------------------------------
137 void
DrawLoadMeter(nw::demo::RenderSystem * renderSystem,nw::demo::GraphicsDrawing * graphicsDrawing)138 DebugUtility::DrawLoadMeter(
139 nw::demo::RenderSystem* renderSystem,
140 nw::demo::GraphicsDrawing* graphicsDrawing
141 )
142 {
143 NW_POINTER_ASSERT(renderSystem);
144 NW_POINTER_ASSERT(graphicsDrawing);
145
146 static const s32 POS_BAR_CHART_BACKGROUND_X = POS_BAR_CHART_X + 8;
147 static const s32 WIDTH_BAR_CHART_BACKGROUND = WIDTH_LOAD_METER_BAR_CHART + 2;
148 static const s32 HEIGHT_BAR_CHART_BACKGROUND = 15;
149 static const s32 WIDTH_BAR_CHART_LEFTBOX = 8;
150 static const s32 HEIGHT_BAR_CHART_LEFTBOX = 16;
151 static const s32 POS_BAR_CHART_LINE_Y = POS_BAR_CHART_Y + HEIGHT_BAR_CHART_LEFTBOX;
152 static const s32 POS_BAR_CHART_BAR_LEFT = POS_BAR_CHART_X + WIDTH_BAR_CHART_LEFTBOX + 2;
153 static const s32 HEIGHT_BAR_CHART_BAR = 14;
154 static const s32 WIDTH_COLORBOX = 10;
155 static const s32 HEIGHT_COLORBOX = 15;
156
157 static const u32 COLOR_CPU = 0x2DC400FF;
158 static const u32 COLOR_BAR_CHART_CPU = 0x6CFF52FF;
159 static const u32 COLOR_GPU = 0xFF0000FF;
160 static const u32 COLOR_BAR_CHART_GPU = 0xF464EFFF;
161 static const u32 COLOR_BAR_CHART_BACKGROUND = 0x4B4B4BFF;
162 static const u32 COLOR_BAR_CHART_HUNDRED_PERCENT = 0x808080FF;
163
164 float loadRate =
165 renderSystem->GetLoadMeter().loadTime * nw::demo::RenderSystem::LoadMeterDescription::MILLI_TO_RATE;
166 float loadGpuRate =
167 renderSystem->GetLoadMeter().loadGpuTime * nw::demo::RenderSystem::LoadMeterDescription::MILLI_TO_RATE;
168
169 // CPU メーターを描画します。
170 graphicsDrawing->FillRectangle(
171 nw::math::VEC2(POS_BAR_CHART_BACKGROUND_X, POS_BAR_CHART_Y),
172 nw::math::VEC2(WIDTH_BAR_CHART_BACKGROUND, HEIGHT_BAR_CHART_BACKGROUND),
173 COLOR_BAR_CHART_BACKGROUND
174 );
175
176 graphicsDrawing->FillRectangle(
177 nw::math::VEC2(POS_BAR_CHART_X, POS_BAR_CHART_Y),
178 nw::math::VEC2(WIDTH_BAR_CHART_LEFTBOX, HEIGHT_BAR_CHART_LEFTBOX),
179 COLOR_CPU
180 );
181
182 graphicsDrawing->DrawLine(
183 nw::math::VEC2(POS_BAR_CHART_X, POS_BAR_CHART_LINE_Y),
184 nw::math::VEC2(POS_BAR_CHART_BAR_LEFT + WIDTH_LOAD_METER_BAR_CHART, POS_BAR_CHART_LINE_Y),
185 COLOR_CPU
186 );
187
188 graphicsDrawing->FillRectangle(
189 nw::math::VEC2(POS_BAR_CHART_BAR_LEFT, POS_BAR_CHART_Y),
190 nw::math::VEC2(WIDTH_LOAD_METER_BAR_CHART / 4 * loadRate, HEIGHT_BAR_CHART_BAR),
191 COLOR_BAR_CHART_CPU
192 );
193
194 graphicsDrawing->DrawLine(
195 nw::math::VEC2(POS_BAR_CHART_BAR_LEFT + WIDTH_LOAD_METER_BAR_CHART / 4, POS_BAR_CHART_Y),
196 nw::math::VEC2(POS_BAR_CHART_BAR_LEFT + WIDTH_LOAD_METER_BAR_CHART / 4, POS_BAR_CHART_Y + HEIGHT_BAR_CHART_BACKGROUND),
197 COLOR_BAR_CHART_HUNDRED_PERCENT
198 );
199
200 graphicsDrawing->FillRectangle(
201 nw::math::VEC2(POS_LOAD_METER_X, POS_LOAD_METER_Y),
202 nw::math::VEC2(WIDTH_COLORBOX, HEIGHT_COLORBOX),
203 COLOR_CPU
204 );
205
206 // GPU メーターを描画します。
207 graphicsDrawing->FillRectangle(
208 nw::math::VEC2(POS_BAR_CHART_BACKGROUND_X, POS_BAR_CHART_Y + HEIGHT_LOAD_METER_BAR_CHART),
209 nw::math::VEC2(WIDTH_BAR_CHART_BACKGROUND, HEIGHT_BAR_CHART_BACKGROUND),
210 COLOR_BAR_CHART_BACKGROUND
211 );
212
213 graphicsDrawing->FillRectangle(
214 nw::math::VEC2(POS_BAR_CHART_X, POS_BAR_CHART_Y + HEIGHT_LOAD_METER_BAR_CHART),
215 nw::math::VEC2(WIDTH_BAR_CHART_LEFTBOX, HEIGHT_BAR_CHART_LEFTBOX),
216 COLOR_GPU
217 );
218
219 graphicsDrawing->DrawLine(
220 nw::math::VEC2(POS_BAR_CHART_X, POS_BAR_CHART_LINE_Y + HEIGHT_LOAD_METER_BAR_CHART),
221 nw::math::VEC2(POS_BAR_CHART_BAR_LEFT + WIDTH_LOAD_METER_BAR_CHART, POS_BAR_CHART_LINE_Y + HEIGHT_LOAD_METER_BAR_CHART),
222 COLOR_GPU
223 );
224
225 graphicsDrawing->FillRectangle(
226 nw::math::VEC2(POS_BAR_CHART_BAR_LEFT, POS_BAR_CHART_Y + HEIGHT_LOAD_METER_BAR_CHART),
227 nw::math::VEC2(WIDTH_LOAD_METER_BAR_CHART / 4 * loadGpuRate, HEIGHT_BAR_CHART_BAR),
228 COLOR_BAR_CHART_GPU
229 );
230
231 graphicsDrawing->DrawLine(
232 nw::math::VEC2(POS_BAR_CHART_BAR_LEFT + WIDTH_LOAD_METER_BAR_CHART / 4, POS_BAR_CHART_Y + HEIGHT_LOAD_METER_BAR_CHART),
233 nw::math::VEC2(POS_BAR_CHART_BAR_LEFT + WIDTH_LOAD_METER_BAR_CHART / 4, POS_BAR_CHART_Y + HEIGHT_BAR_CHART_BACKGROUND + HEIGHT_LOAD_METER_BAR_CHART),
234 COLOR_BAR_CHART_HUNDRED_PERCENT
235 );
236
237 graphicsDrawing->FillRectangle(
238 nw::math::VEC2(POS_LOAD_METER_X, POS_LOAD_METER_Y + HEIGHT_LOAD_METER),
239 nw::math::VEC2(WIDTH_COLORBOX, HEIGHT_COLORBOX),
240 COLOR_GPU
241 );
242 }
243
244 //----------------------------------------
245 void
DumpLoadMeter(nw::demo::RenderSystem * renderSystem)246 DebugUtility::DumpLoadMeter(
247 nw::demo::RenderSystem* renderSystem
248 )
249 {
250 float loadRate =
251 renderSystem->GetLoadMeter().loadTime * nw::demo::RenderSystem::LoadMeterDescription::MILLI_TO_RATE;
252 NW_DEV_LOG(" CPU :%5.2f ms/f (%6.2f %%)\n",
253 renderSystem->GetLoadMeter().loadTime, loadRate * 100.0f);
254
255 float loadGpuRate =
256 renderSystem->GetLoadMeter().loadGpuTime * nw::demo::RenderSystem::LoadMeterDescription::MILLI_TO_RATE;
257 NW_DEV_LOG(" GPU :%5.2f ms/f (%6.2f %%)\n",
258 renderSystem->GetLoadMeter().loadGpuTime, loadGpuRate * 100.0f);
259
260 NW_DEV_LOG(" Cmd size :% 8d bytes\n",
261 renderSystem->GetLoadMeter().drawCommandBufferSize);
262 }
263
264 } // namespace demo
265 } // namespace nw
266