diff options
author | notaz | 2010-11-19 19:22:13 +0200 |
---|---|---|
committer | notaz | 2010-11-19 19:22:13 +0200 |
commit | 14dffdb7a0457fc647103deafa5f1cac12e888fb (patch) | |
tree | db0b1a22f9beaaf535ebab0e0fda6d795055d3a4 /frontend | |
parent | b60f2812208aa36dc8b9e8e90f02b608dafd0c00 (diff) | |
download | pcsx_rearmed-14dffdb7a0457fc647103deafa5f1cac12e888fb.tar.gz pcsx_rearmed-14dffdb7a0457fc647103deafa5f1cac12e888fb.tar.bz2 pcsx_rearmed-14dffdb7a0457fc647103deafa5f1cac12e888fb.zip |
basic profiling
Diffstat (limited to 'frontend')
-rw-r--r-- | frontend/main.c | 2 | ||||
-rw-r--r-- | frontend/pcnt.h | 52 | ||||
-rw-r--r-- | frontend/plugin.c | 73 |
3 files changed, 127 insertions, 0 deletions
diff --git a/frontend/main.c b/frontend/main.c index e36ad48..884b617 100644 --- a/frontend/main.c +++ b/frontend/main.c @@ -14,6 +14,7 @@ #include <unistd.h> #include "plugin.h" +#include "pcnt.h" #include "../gui/Linux.h" #include "../libpcsxcore/misc.h" @@ -192,6 +193,7 @@ int main(int argc, char *argv[]) SysMessage("Failed loading plugins!"); return 1; } + pcnt_hook_plugins(); if (OpenPlugins() == -1) { return 1; diff --git a/frontend/pcnt.h b/frontend/pcnt.h new file mode 100644 index 0000000..57bc88a --- /dev/null +++ b/frontend/pcnt.h @@ -0,0 +1,52 @@ + +enum pcounters { + PCNT_ALL, + PCNT_GPU, + PCNT_SPU, + PCNT_CNT +}; + +extern unsigned int pcounters[PCNT_CNT]; +extern unsigned int pcounter_starts[PCNT_CNT]; + +#define pcnt_start(id) \ + pcounter_starts[id] = pcnt_get() + +#define pcnt_end(id) \ + pcounters[id] += pcnt_get() - pcounter_starts[id] + +void pcnt_hook_plugins(void); + +static inline void pcnt_print(float fps) +{ + unsigned int total, gpu, spu, rem; + int i; + + for (i = 0; i < PCNT_CNT; i++) + pcounters[i] >>= 10; + + total = pcounters[PCNT_ALL]; + gpu = pcounters[PCNT_GPU]; + spu = pcounters[PCNT_SPU]; + rem = total - gpu - spu; + if (!total) + total++; + + printf("%2.1f %6u %6u %6u (%2d %2d %2d)\n", fps, gpu, spu, rem, + gpu * 100 / total, spu * 100 / total, rem * 100 / total); + + memset(pcounters, 0, sizeof(pcounters)); +} + +static inline unsigned int pcnt_get(void) +{ + unsigned int val; +#ifdef __ARM_ARCH_7A__ + __asm__ volatile("mrc p15, 0, %0, c9, c13, 0" + : "=r"(val)); +#else + val = 0; +#endif + return val; +} + diff --git a/frontend/plugin.c b/frontend/plugin.c index bea6eb5..d6aca8a 100644 --- a/frontend/plugin.c +++ b/frontend/plugin.c @@ -199,3 +199,76 @@ void *plugin_link(enum builtint_plugins_e id, const char *sym) return NULL; } +/* basic profile stuff */ +#include "pcnt.h" + +unsigned int pcounters[PCNT_CNT]; +unsigned int pcounter_starts[PCNT_CNT]; + +#define pc_hook_func(name, args, pargs, cnt) \ +extern void (*name) args; \ +static void (*o_##name) args; \ +static void w_##name args \ +{ \ + unsigned int pc_start = pcnt_get(); \ + o_##name pargs; \ + pcounters[cnt] += pcnt_get() - pc_start; \ +} + +#define pc_hook_func_ret(retn, name, args, pargs, cnt) \ +extern retn (*name) args; \ +static retn (*o_##name) args; \ +static retn w_##name args \ +{ \ + retn ret; \ + unsigned int pc_start = pcnt_get(); \ + ret = o_##name pargs; \ + pcounters[cnt] += pcnt_get() - pc_start; \ + return ret; \ +} + +pc_hook_func (GPU_writeStatus, (uint32_t a0), (a0), PCNT_GPU) +pc_hook_func (GPU_writeData, (uint32_t a0), (a0), PCNT_GPU) +pc_hook_func (GPU_writeDataMem, (uint32_t *a0, int a1), (a0, a1), PCNT_GPU) +pc_hook_func_ret(uint32_t, GPU_readStatus, (void), (), PCNT_GPU) +pc_hook_func_ret(uint32_t, GPU_readData, (void), (), PCNT_GPU) +pc_hook_func (GPU_readDataMem, (uint32_t *a0, int a1), (a0, a1), PCNT_GPU) +pc_hook_func_ret(long, GPU_dmaChain, (uint32_t *a0, int32_t a1), (a0, a1), PCNT_GPU) +pc_hook_func (GPU_updateLace, (void), (), PCNT_GPU) + +pc_hook_func (SPU_writeRegister, (unsigned long a0, unsigned short a1), (a0, a1), PCNT_SPU) +pc_hook_func_ret(unsigned short,SPU_readRegister, (unsigned long a0), (a0), PCNT_SPU) +pc_hook_func (SPU_writeDMA, (unsigned short a0), (a0), PCNT_SPU) +pc_hook_func_ret(unsigned short,SPU_readDMA, (void), (), PCNT_SPU) +pc_hook_func (SPU_writeDMAMem, (unsigned short *a0, int a1), (a0, a1), PCNT_SPU) +pc_hook_func (SPU_readDMAMem, (unsigned short *a0, int a1), (a0, a1), PCNT_SPU) +pc_hook_func (SPU_playADPCMchannel, (void *a0), (a0), PCNT_SPU) +pc_hook_func (SPU_async, (unsigned int a0), (a0), PCNT_SPU) +pc_hook_func (SPU_playCDDAchannel, (short *a0, int a1), (a0, a1), PCNT_SPU) + +#define hook_it(name) { \ + o_##name = name; \ + name = w_##name; \ +} + +void pcnt_hook_plugins(void) +{ + hook_it(GPU_writeStatus); + hook_it(GPU_writeData); + hook_it(GPU_writeDataMem); + hook_it(GPU_readStatus); + hook_it(GPU_readData); + hook_it(GPU_readDataMem); + hook_it(GPU_dmaChain); + hook_it(GPU_updateLace); + hook_it(SPU_writeRegister); + hook_it(SPU_readRegister); + hook_it(SPU_writeDMA); + hook_it(SPU_readDMA); + hook_it(SPU_writeDMAMem); + hook_it(SPU_readDMAMem); + hook_it(SPU_playADPCMchannel); + hook_it(SPU_async); + hook_it(SPU_playCDDAchannel); +} + |