]> git.bts.cx Git - benzene.git/blob - src/bz/debug/perfgraph.c
Sprites
[benzene.git] / src / bz / debug / perfgraph.c
1 #include <bz/debug/perfgraph_internal.h>
2
3 #include <bz/types/common.h>
4 #include <bz/gfx/gfx.h>
5
6 extern void resetSystemTimer(void);
7 extern float getSystemTimer(void);
8
9 struct BZPerfTimer {
10 const char *identifier;
11 float startTime;
12 float elapsedTime;
13 };
14 typedef struct BZPerfTimer BZPerfTimer;
15
16 BZPerfTimer perfTimers[32];
17
18 void bzPerfReset() {
19 resetSystemTimer();
20
21 for (size_t i = 0; i < 32; ++i) { // FIXME
22 perfTimers[i].identifier = NULL;
23 perfTimers[i].elapsedTime = 0.0f;
24 }
25 }
26
27 static BZPerfTimer *bzPerfTimerFind(const char *identifier) {
28 BZPerfTimer *timer = NULL;
29
30 for (size_t i = 0; i < 32; ++i) {
31 if (perfTimers[i].identifier == NULL && timer == NULL) {
32 timer = &perfTimers[i];
33 } else if (perfTimers[i].identifier == identifier) {
34 timer = &perfTimers[i];
35 break;
36 }
37 }
38
39 bzAssert(timer != NULL);
40 return timer;
41 }
42
43 void _bzPerfTimerStart(const char *identifier) {
44 BZPerfTimer *timer = bzPerfTimerFind(identifier);
45 timer->identifier = identifier;
46 timer->startTime = getSystemTimer();
47 }
48
49 void _bzPerfTimerStop(const char *identifier) {
50 float endTime = getSystemTimer();
51 BZPerfTimer *timer = bzPerfTimerFind(identifier);
52 timer->elapsedTime += endTime - timer->startTime;
53 }
54
55 void _bzPerfTimerOutput() {
56 for (size_t i = 0; i < 32; ++i) {
57 if (perfTimers[i].identifier != NULL) {
58 bzLog("Timer '%s': %fs", perfTimers[i].identifier, perfTimers[i].elapsedTime);
59 }
60 }
61 }
62
63 void _bzPerfTimerDraw() {
64 int y = 10;
65 int width = 50;
66 for (size_t i = 0; i < 32; ++i) {
67 if (perfTimers[i].identifier != NULL) {
68 bzRectFill(10, y, 10 + width, y+3, 5);
69 float t = perfTimers[i].elapsedTime / (1 / 30.0f);
70 bzRectFill(10, y, 10 + width * t, y + 3, 8);
71 bzPrint(10 + width, y, 7, perfTimers[i].identifier);
72 y += 5;
73 }
74 }
75 }