X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=pcsx_rearmed.git;a=blobdiff_plain;f=include%2Fpcnt.h;fp=include%2Fpcnt.h;h=9ddd50032033ab3671edef445d37b92e8b0b0ca8;hp=0000000000000000000000000000000000000000;hb=da710571b75db7031b82924ab3ad47eb645ce215;hpb=c02c3b656781a406fc4f586ac0923529de186916 diff --git a/include/pcnt.h b/include/pcnt.h new file mode 100644 index 00000000..9ddd5003 --- /dev/null +++ b/include/pcnt.h @@ -0,0 +1,132 @@ + +enum pcounters { + PCNT_ALL, + PCNT_GPU, + PCNT_SPU, + PCNT_BLIT, + PCNT_GTE, + PCNT_TEST, + PCNT_CNT +}; + +#ifdef PCNT + +#if defined(__ARM_ARCH_7A__) || defined(ARM1176) +#define PCNT_DIV 1000 +#else +#include +#define PCNT_DIV 1 +#endif + +static const char *pcnt_names[PCNT_CNT] = { "", "gpu", "spu", "blit", "gte", "test" }; + +#define PCNT_FRAMES 10 + +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) +{ + static int print_counter; + unsigned int total, rem; + int i; + + for (i = 0; i < PCNT_CNT; i++) + pcounters[i] /= PCNT_DIV * PCNT_FRAMES; + + rem = total = pcounters[PCNT_ALL]; + for (i = 1; i < PCNT_CNT; i++) + rem -= pcounters[i]; + if (!total) + total++; + + if (--print_counter < 0) { + printf(" "); + for (i = 1; i < PCNT_CNT; i++) + printf("%5s ", pcnt_names[i]); + printf("%5s\n", "rem"); + print_counter = 30; + } + + printf("%4.1f ", fps); +#if 0 + static float pcounters_all[PCNT_CNT+1]; + static int pcounter_samples; + pcounter_samples++; + + for (i = 1; i < PCNT_CNT; i++) { + pcounters_all[i] += pcounters[i]; + printf("%5.0f ", pcounters_all[i] / pcounter_samples); + } + pcounters_all[i] += rem; + printf("%5.0f\n", pcounters_all[i] / pcounter_samples); +#else + for (i = 1; i < PCNT_CNT; i++) + printf("%5u ", pcounters[i]); + printf("%5u (", rem); + for (i = 1; i < PCNT_CNT; i++) + printf("%2u ", pcounters[i] * 100 / total); + printf("%2u) %u\n", rem * 100 / total, total); +#endif + 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)); +#elif defined(ARM1176) + __asm__ volatile("mrc p15, 0, %0, c15, c12, 1" + : "=r"(val)); +#else + // all slow on ARM :( + //struct timespec tv; + //clock_gettime(CLOCK_MONOTONIC_RAW, &tv); + //val = tv.tv_sec * 1000000000 + tv.tv_nsec; + struct timeval tv; + gettimeofday(&tv, NULL); + val = tv.tv_sec * 1000000 + tv.tv_usec; +#endif + return val; +} + +static inline void pcnt_init(void) +{ +#ifdef __ARM_ARCH_7A__ + int v; + asm volatile("mrc p15, 0, %0, c9, c12, 0" : "=r"(v)); + v |= 5; // master enable, ccnt reset + v &= ~8; // ccnt divider 0 + asm volatile("mcr p15, 0, %0, c9, c12, 0" :: "r"(v)); + // enable cycle counter + asm volatile("mcr p15, 0, %0, c9, c12, 1" :: "r"(1<<31)); +#elif defined(ARM1176) + int v; + asm volatile("mrc p15, 0, %0, c15, c12, 0" : "=r"(v)); + v |= 5; // master enable, ccnt reset + v &= ~8; // ccnt divider 0 + asm volatile("mcr p15, 0, %0, c15, c12, 0" :: "r"(v)); +#endif +} + +void pcnt_gte_start(int op); +void pcnt_gte_end(int op); + +#else + +#define pcnt_start(id) +#define pcnt_end(id) +#define pcnt_hook_plugins() +#define pcnt_print(fps) + +#endif