aboutsummaryrefslogtreecommitdiff
path: root/frontend/pcnt.h
blob: 0aca901edfe01042324ca361a2e906139aca5452 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
enum pcounters {
	PCNT_ALL,
	PCNT_GPU,
	PCNT_SPU,
	PCNT_BLIT,
	PCNT_TEST,
	PCNT_CNT
};

#ifdef PCNT

static const char *pcnt_names[PCNT_CNT] = { "", "gpu", "spu", "blit", "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] /= 1000 * 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);
	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);

	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;
}

#else

#define pcnt_start(id)
#define pcnt_end(id)
#define pcnt_hook_plugins()
#define pcnt_print(fps)

#endif