Files
GTASource/game/system/gcmPerfmon.h
expvintl 419f2e4752 init
2025-02-23 17:40:52 +08:00

90 lines
2.7 KiB
C

#ifndef GCMPERFMON_H__
#define GCMPERFMON_H__
#define USE_GCMPERFMON 0
#if (1 == __PPU) && (1 == USE_GCMPERFMON)
#include <cell/gcm_pm.h>
#include "grcore/wrapper_gcm.h"
// Timer Definition
extern uint32_t pm_Events_IDs[CELL_GCM_PM_DOMAIN_NUM][4];
// Timer Result
extern u32 pm_Cycles[CELL_GCM_PM_DOMAIN_NUM];
extern u32 pm_Events[CELL_GCM_PM_DOMAIN_NUM][4];
extern void pm_Init();
inline void pm_Exit()
{
// We're done..
cellGcmExitPerfMon();
// No String kill... I rely on the static destructor to do his job
}
inline void pm_EventSet(uint32_t domainID,
uint32_t event0,
uint32_t event1,
uint32_t event2,
uint32_t event3)
{
pm_Events_IDs[domainID][0] = event0;
pm_Events_IDs[domainID][1] = event1;
pm_Events_IDs[domainID][2] = event2;
pm_Events_IDs[domainID][3] = event3;
}
inline void pm_EventSetup()
{
// Tell gcm_pm what we'll be recording, for each domain
cellGcmSetPerfMonEvent( CELL_GCM_PM_DOMAIN_GCLK, pm_Events_IDs[CELL_GCM_PM_DOMAIN_GCLK] );
cellGcmSetPerfMonEvent( CELL_GCM_PM_DOMAIN_SCLK, pm_Events_IDs[CELL_GCM_PM_DOMAIN_SCLK] );
cellGcmSetPerfMonEvent( CELL_GCM_PM_DOMAIN_RCLK, pm_Events_IDs[CELL_GCM_PM_DOMAIN_RCLK] );
cellGcmSetPerfMonEvent( CELL_GCM_PM_DOMAIN_MCLK, pm_Events_IDs[CELL_GCM_PM_DOMAIN_MCLK] );
cellGcmSetPerfMonEvent( CELL_GCM_PM_DOMAIN_ICLK, pm_Events_IDs[CELL_GCM_PM_DOMAIN_ICLK] );
}
inline void pm_Start()
{
// Trigger will store the result internally and reset the timers,
// So we trigger at start
cellGcmSetPerfMonTrigger(GCM_CONTEXT);
}
inline void pm_End()
{
// Trigger will store the result internally and reset the timers,
// And we trigger at end
cellGcmSetPerfMonTrigger(GCM_CONTEXT);
}
inline void pm_Get()
{
// Gather the actual datam for display or dump
cellGcmGetPerfMonCounter(CELL_GCM_PM_DOMAIN_GCLK,pm_Events[CELL_GCM_PM_DOMAIN_GCLK],&pm_Cycles[CELL_GCM_PM_DOMAIN_GCLK]);
cellGcmGetPerfMonCounter(CELL_GCM_PM_DOMAIN_SCLK,pm_Events[CELL_GCM_PM_DOMAIN_SCLK],&pm_Cycles[CELL_GCM_PM_DOMAIN_SCLK]);
cellGcmGetPerfMonCounter(CELL_GCM_PM_DOMAIN_RCLK,pm_Events[CELL_GCM_PM_DOMAIN_RCLK],&pm_Cycles[CELL_GCM_PM_DOMAIN_RCLK]);
cellGcmGetPerfMonCounter(CELL_GCM_PM_DOMAIN_MCLK,pm_Events[CELL_GCM_PM_DOMAIN_MCLK],&pm_Cycles[CELL_GCM_PM_DOMAIN_MCLK]);
cellGcmGetPerfMonCounter(CELL_GCM_PM_DOMAIN_ICLK,pm_Events[CELL_GCM_PM_DOMAIN_ICLK],&pm_Cycles[CELL_GCM_PM_DOMAIN_ICLK]);
}
extern void pm_Display(int startX = 80, int startY = 10);
#else // (1 == __PPU) && (1 == USE_GCMPERFMON)
#define pm_Init() /* NoOp*/
#define pm_Exit() /* NoOp*/
#define pm_EventSet(a, b, c, d, e)
#define pm_EventSetup() /* NoOp*/
#define pm_Start() /* NoOp*/
#define pm_End() /* NoOp*/
#define pm_Get() /* NoOp*/
#define pm_Display(...) /* NoOp */
#endif // (1 == __PPU) && (1 == USE_GCMPERFMON)
#endif // GCMPERFMON_H__