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