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.
88 lines
2.0 KiB
88 lines
2.0 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: Inner workings of Performance Monitor Counters on the xbox 360; |
|
// they let vprof track L2 dcache misses, LHS, etc. |
|
// |
|
//=============================================================================// |
|
|
|
#include "pch_tier0.h" |
|
|
|
#ifndef _X360 |
|
#error pmc360.cpp must only be compiled for XBOX360! |
|
#else |
|
|
|
#include "tier0/platform.h" |
|
#include "tier0/vprof.h" |
|
#include <pmcpbsetup.h> |
|
#include "tier0/dbg.h" |
|
#include "pmc360.h" |
|
|
|
#include "tier0/memdbgon.h" |
|
|
|
static bool s_bInitialized = false; |
|
|
|
CPMCData::CPMCData() |
|
{ |
|
} |
|
|
|
void CPMCData::InitializeOnceProgramWide( void ) |
|
{ |
|
#if !defined( _CERT ) |
|
// Select a set of sixteen counters |
|
DmPMCInstallAndStart( PMC_SETUP_FLUSHREASONS_PB0T0 ); |
|
// Reset the Performance Monitor Counters in preparation for a new sampling run. |
|
DmPMCResetCounters(); |
|
#endif |
|
s_bInitialized = true; |
|
} |
|
|
|
bool CPMCData::IsInitialized() |
|
{ |
|
return s_bInitialized; |
|
} |
|
|
|
void CPMCData::Start() |
|
{ |
|
#if !defined( _CERT ) |
|
// stop the stopwatches, save off the counter, start them again. |
|
DmPMCStop(); |
|
|
|
PMCState pmcstate; |
|
// Get the counters. |
|
DmPMCGetCounters( &pmcstate ); |
|
|
|
// in the default state as set up by InitializeOnceProgramWide, |
|
// counters 9 and 6 are L2 misses and LHS respectively |
|
m_OnStart.L2CacheMiss = pmcstate.pmc[9]; |
|
m_OnStart.LHS = pmcstate.pmc[6]; |
|
|
|
DmPMCStart(); |
|
#endif |
|
} |
|
|
|
void CPMCData::End() |
|
{ |
|
#if !defined( _CERT ) |
|
DmPMCStop(); |
|
|
|
// get end-state counters |
|
PMCState pmcstate; |
|
// Get the counters. |
|
DmPMCGetCounters( &pmcstate ); |
|
|
|
// in the default state as set up by InitializeOnceProgramWide, |
|
// counters 9 and 6 are l2 misses and LHS respectively |
|
const uint64 &endL2 = pmcstate.pmc[9]; |
|
const uint64 &endLHS = pmcstate.pmc[6]; |
|
|
|
// compute delta between end and start. Because these are |
|
// unsigned nums, even in overflow this still works out |
|
// correctly under modular arithmetic. |
|
m_Delta.L2CacheMiss = endL2 - m_OnStart.L2CacheMiss; |
|
m_Delta.LHS = endLHS - m_OnStart.LHS; |
|
|
|
DmPMCStart(); |
|
#endif |
|
} |
|
|
|
#endif
|
|
|