frontend: handle 24bpp in sstate preview
[pcsx_rearmed.git] / frontend / pcnt.h
1
2 enum pcounters {
3         PCNT_ALL,
4         PCNT_GPU,
5         PCNT_SPU,
6         PCNT_BLIT,
7         PCNT_TEST,
8         PCNT_CNT
9 };
10
11 #ifdef PCNT
12
13 static const char *pcnt_names[PCNT_CNT] = { "", "gpu", "spu", "blit", "test" };
14
15 #define PCNT_FRAMES 10
16
17 extern unsigned int pcounters[PCNT_CNT];
18 extern unsigned int pcounter_starts[PCNT_CNT];
19
20 #define pcnt_start(id) \
21         pcounter_starts[id] = pcnt_get()
22
23 #define pcnt_end(id) \
24         pcounters[id] += pcnt_get() - pcounter_starts[id]
25
26 void pcnt_hook_plugins(void);
27
28 static inline void pcnt_print(float fps)
29 {
30         static int print_counter;
31         unsigned int total, rem;
32         int i;
33
34         for (i = 0; i < PCNT_CNT; i++)
35                 pcounters[i] /= 1000 * PCNT_FRAMES;
36
37         rem = total = pcounters[PCNT_ALL];
38         for (i = 1; i < PCNT_CNT; i++)
39                 rem -= pcounters[i];
40         if (!total)
41                 total++;
42
43         if (--print_counter < 0) {
44                 printf("     ");
45                 for (i = 1; i < PCNT_CNT; i++)
46                         printf("%5s ", pcnt_names[i]);
47                 printf("%5s\n", "rem");
48                 print_counter = 30;
49         }
50
51         printf("%4.1f ", fps);
52 #if 0
53         static float pcounters_all[PCNT_CNT+1];
54         static int pcounter_samples;
55         pcounter_samples++;
56
57         for (i = 1; i < PCNT_CNT; i++) {
58                 pcounters_all[i] += pcounters[i];
59                 printf("%5.0f ", pcounters_all[i] / pcounter_samples);
60         }
61         pcounters_all[i] += rem;
62         printf("%5.0f\n", pcounters_all[i] / pcounter_samples);
63 #else
64         for (i = 1; i < PCNT_CNT; i++)
65                 printf("%5u ", pcounters[i]);
66         printf("%5u (", rem);
67         for (i = 1; i < PCNT_CNT; i++)
68                 printf("%2u ", pcounters[i] * 100 / total);
69         printf("%2u) %u\n", rem * 100 / total, total);
70 #endif
71         memset(pcounters, 0, sizeof(pcounters));
72 }
73
74 static inline unsigned int pcnt_get(void)
75 {
76         unsigned int val;
77 #ifdef __ARM_ARCH_7A__
78         __asm__ volatile("mrc p15, 0, %0, c9, c13, 0"
79                          : "=r"(val));
80 #else
81         val = 0;
82 #endif
83         return val;
84 }
85
86 #else
87
88 #define pcnt_start(id)
89 #define pcnt_end(id)
90 #define pcnt_hook_plugins()
91 #define pcnt_print(fps)
92
93 #endif