/*---------------------------------------------------------------------------* Project: NintendoWare File: SmPerf.h Copyright (C)2009-2010 Nintendo Co., Ltd./HAL Laboratory, Inc. All rights reserved. These coded instructions, statements, and computer programs contain proprietary information of Nintendo of America Inc. and/or Nintendo Company Ltd., and are protected by Federal copyright law. They may not be disclosed to third parties or copied or duplicated in any form, in whole or in part, without the prior written consent of Nintendo. $Revision: 1 $ *---------------------------------------------------------------------------*/ #ifndef SM_PERF_H_ #define SM_PERF_H_ //#include #include "../include/SmPrimitive.h" #include "../include/SmCommandUtility.h" //------------------------------------------------------------------------------ // //! @brief コスト struct Cost { uint constId; char costName[64]; s64 costMicro; s64 costStart; s64 costEnd; uint gpuStart; uint gpuEnd; nw::ut::Color8 costColor; void init() { constId = 0; std::memset( costName, 32, 0 ); costMicro = 0; costStart = 0; costEnd = 0; costColor = 0; gpuStart = 0; gpuEnd = 0; } }; typedef nw::ut::FixedSizeArray CostArray; //------------------------------------------------------------------------------ // 処理コストを計測するクラス class SmPerf { public: SmPerf() : m_CostArrayFlip( 0 ), m_CurrentCost( -1 ) { m_CostArray[0].clear(); m_CostArray[1].clear(); } ~SmPerf() { m_CostArray[0].clear(); m_CostArray[1].clear(); } // 計測を開始する virtual void Begin( const char* costName, u32 costColor ) { NW_UNUSED_VARIABLE(costName); NW_UNUSED_VARIABLE(costColor); } // 計測を終了する virtual void End(){} // リセットする // フレームの終了で今フレームの結果をリセットする virtual void Reset() { // フリップする if ( m_CostArrayFlip ) { m_CostArrayFlip = 0; } else { m_CostArrayFlip = 1; } m_CostArray[m_CostArrayFlip].clear(); m_CurrentCost = -1; } // 現在のタイムを取得する s64 GetTime() { return nn::os::Tick::GetSystemCurrent().ToTimeSpan().GetMicroSeconds(); } // 現在登録されているコスト数を取得する uint GetCostCount() { if ( m_CostArrayFlip ) { return m_CostArray[0].size(); } else { return m_CostArray[1].size(); } } // 登録されているコスト名を取得する const char* GetCostName( uint costNo ) { if ( m_CostArrayFlip ) { return m_CostArray[0][costNo].costName; } else { return m_CostArray[1][costNo].costName; } } // 登録されているコストカラーを取得する nw::ut::Color8 GetCostColor( uint costNo ) { if ( m_CostArrayFlip ) { return m_CostArray[0][costNo].costColor; } else { return m_CostArray[1][costNo].costColor; } } // 登録されているコスト(msec)を取得する virtual f32 GetCost( uint costNo ) { f32 millisec = 0.f; if ( m_CostArrayFlip ) { millisec = static_cast(m_CostArray[0][costNo].costMicro) / 1000.f; } else { millisec = static_cast(m_CostArray[1][costNo].costMicro) / 1000.f; } return millisec; } protected: CostArray m_CostArray[2]; uint m_CostArrayFlip; s32 m_CurrentCost; }; //------------------------------------------------------------------------------ // CPU処理コストを計測するクラス class SmCpuPerf : public SmPerf { public: // コンストラクタ SmCpuPerf(); // 計測を開始する virtual void Begin( const char* costName, u32 costColor ); // 計測を終了する virtual void End(); }; //------------------------------------------------------------------------------ // GPU処理コストを計測するクラス class SmGpuPerf : public SmPerf { public: // コンストラクタ SmGpuPerf(); // デストラクタ ~SmGpuPerf(); // 計測を開始する virtual void Begin( const char* costName, u32 costColor ); // 計測を終了する virtual void End(); // 登録するコールバック関数です void Invoke(GLint id); static void Callback(GLint id); // リセットする virtual void Reset(); // 登録されているコスト(msec)を取得する virtual f32 GetCost( uint costNo ); private: f32 m_MillisecCost; uint m_StartReqCount; uint m_EndReqCount; uint m_CurrentReqCount; }; //------------------------------------------------------------------------------ // コストを計測結果を描画するクラス class SmPerfDrawer : public SmBase { // 1frame の幅 #define PERF_ONE_FRAME_WIDTH (160.f) public: SmPerfDrawer(); ~SmPerfDrawer(); void Render( SmPerf* cpuPerf, SmPerf* gpuPerf ); void RenderBar(); private: Sm2DDynamicPrimPC m_PerfBar; Sm2DPrimPC* m_pPerfBarSplit; SmCommandReuser m_PerfBarSplitCmd; }; #endif // SM_PERF_H_