Counter Strike : Global Offensive Source Code
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

127 lines
2.6 KiB

//===== Copyright © 1996-2007, Valve Corporation, All rights reserved. ======//
//
// Purpose:
//
// Simple data structure keeping track
//
// $NoKeywords: $
//
//===========================================================================//
#ifndef PERFSTATS_H
#define PERFSTATS_H
#include "tier0/fasttimer.h"
//-----------------------------------------------------------------------------
//
// Slot ID for which we will be collecting performance stats
//
enum PerfStatsSlot_t
{
PERF_STATS_SLOT_MAINTHREAD, // stats collected in CPerfStatsData::Tick()
PERF_STATS_SLOT_MAINTHREAD_NOWAIT, // time spent in the main thread - time spent in EndFrame
PERF_STATS_SLOT_RENDERTHREAD,
PERF_STATS_SLOT_END_FRAME,
PERF_STATS_SLOT_FORCE_HARDWARE_SYNC,
PERF_STATS_SLOT_MAX
};
//-----------------------------------------------------------------------------
//
// PerfStatsSlotData struct
// Contains performance stats for a single slot
//
class CPerfStatsSlotData
{
public:
void Reset()
{
m_pszName = NULL;
m_CurrFrameTime.Init();
m_PrevFrameTime.Init();
m_AccTotalTime.Init();
}
void ResetFrameStats()
{
m_CurrFrameTime.Init();
}
void StartTimer( const char* pszName )
{
m_pszName = pszName;
m_Timer.Start();
}
void EndTimer( void )
{
m_Timer.End();
const CCycleCount& duration = m_Timer.GetDuration();
m_CurrFrameTime += duration;
m_AccTotalTime += duration;
}
const char* m_pszName;
CFastTimer m_Timer;
CCycleCount m_CurrFrameTime; // Accumulated time over a single frame
CCycleCount m_PrevFrameTime; // This is used to display cl_showfps
CCycleCount m_AccTotalTime; // Total accumulated time
};
//-----------------------------------------------------------------------------
//
// PerfStatsData struct
//
class PLATFORM_CLASS CPerfStatsData
{
public:
CPerfStatsData();
void Tick();
void Reset();
uint64 m_nFrames;
CPerfStatsSlotData m_Slots[PERF_STATS_SLOT_MAX];
};
PLATFORM_INTERFACE CPerfStatsData g_PerfStats;
//-----------------------------------------------------------------------------
//
// Helper class that times whatever block of code it's in
// and collect data for the given slot
//
class CPerfStatsScope
{
public:
CPerfStatsScope( const char* pszName, PerfStatsSlot_t slotId ) : m_SlotData( NULL )
{
if ( slotId < PERF_STATS_SLOT_MAX )
{
m_SlotData = &g_PerfStats.m_Slots[slotId];
m_SlotData->StartTimer( pszName );
}
}
~CPerfStatsScope()
{
if ( m_SlotData )
{
m_SlotData->EndTimer();
}
}
private:
CPerfStatsSlotData* m_SlotData;
};
#define PERF_STATS_BLOCK( name, slot ) CPerfStatsScope _perfStatsScope##__LINE__( name, slot );
#endif // PERFSTATS_H