scrolling XOR benchmark
[retrobench] / src / rbench.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <stdint.h>
4 #include <math.h>
5 #include "rbench.h"
6 #include "treestor.h"
7
8 #define DEF_WIDTH       640
9 #define DEF_HEIGHT      480
10 #define DEF_BPP         24
11
12 struct options opt = {
13         DEF_WIDTH, DEF_HEIGHT, DEF_BPP
14 };
15
16 int fb_width, fb_height, fb_bpp, fb_pitch;
17 void *framebuf;
18 unsigned int time_msec;
19
20 int init(void)
21 {
22         return 0;
23 }
24
25 void cleanup(void)
26 {
27 }
28
29 #define XORRGB(x, y, zoom, r, g, b) \
30         do { \
31                 int xor = (((x) - fb_width/2) * (zoom) >> 10) ^ (((y) - fb_height/2) * (zoom) >> 10); \
32                 (r) = xor >> 2; \
33                 (g) = xor >> 1; \
34                 (b) = xor; \
35         } while(0)
36
37 void redraw(void)
38 {
39         int i, j, r, g, b, xoffs, yoffs, zoom;
40         unsigned char *fbptr;
41         uint16_t *fbptr16;
42         uint32_t *fbptr32;
43         float t = (float)time_msec / 1000.0f;
44
45         xoffs = cos(t * 0.5f) * DEF_WIDTH * 2;
46         yoffs = sin(t) * DEF_HEIGHT;
47         zoom = (sin(t * 0.75f) * 0.5f + 1.0f) * 1024.0f;
48
49         switch(fb_bpp) {
50         case 15:
51                 fbptr16 = framebuf;
52                 for(i=0; i<fb_height; i++) {
53                         for(j=0; j<fb_width; j++) {
54                                 XORRGB(j + xoffs, i + yoffs, zoom, r, g, b);
55                                 *fbptr16++ = ((r & 0x1f) << 10) | ((g & 0x1f) << 5) | (b & 0x1f);
56                         }
57                         fbptr16 += (fb_pitch >> 1) - fb_width;
58                 }
59                 break;
60
61         case 16:
62                 fbptr16 = framebuf;
63                 for(i=0; i<fb_height; i++) {
64                         for(j=0; j<fb_width; j++) {
65                                 XORRGB(j + xoffs, i + yoffs, zoom, r, g, b);
66                                 *fbptr16++ = ((r & 0x1f) << 11) | ((g & 0x3f) << 5) | (b & 0x1f);
67                         }
68                         fbptr16 += (fb_pitch >> 1) - fb_width;
69                 }
70                 break;
71
72         case 24:
73                 fbptr = framebuf;
74                 for(i=0; i<fb_height; i++) {
75                         for(j=0; j<fb_width; j++) {
76                                 XORRGB(j + xoffs, i + yoffs, zoom, r, g, b);
77                                 *fbptr++ = r;
78                                 *fbptr++ = g;
79                                 *fbptr++ = b;
80                         }
81                         fbptr += fb_pitch - fb_width * 3;
82                 }
83                 break;
84
85         case 32:
86                 fbptr32 = framebuf;
87                 for(i=0; i<fb_height; i++) {
88                         for(j=0; j<fb_width; j++) {
89                                 XORRGB(j + xoffs, i + yoffs, zoom, r, g, b);
90                                 *fbptr32++ = ((r & 0xff) << 16) | ((g & 0xff) << 8) | (b & 0xff);
91                         }
92                         fbptr32 += (fb_pitch >> 2) - fb_width;
93                 }
94                 break;
95         }
96 }
97
98 void key_event(int key, int press)
99 {
100 }
101
102 int read_config(const char *fname)
103 {
104         FILE *fp;
105         struct ts_node *ts;
106
107         if(!(fp = fopen(fname, "rb"))) {
108                 return -1;
109         }
110         fclose(fp);
111
112         if(!(ts = ts_load(fname))) {
113                 return -1;
114         }
115
116         opt.width = ts_lookup_int(ts, "rbench.width", DEF_WIDTH);
117         opt.height = ts_lookup_int(ts, "rbench.height", DEF_HEIGHT);
118         opt.bpp = ts_lookup_int(ts, "rbench.bpp", DEF_BPP);
119
120         ts_free_tree(ts);
121         return 0;
122 }