VBE fix: wrong bpp reported (24) with 32bpp modes
[retrobench] / src / dos / main.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <conio.h>
4 #include "rbench.h"
5 #include "timer.h"
6 #include "gfx.h"
7 #include "logger.h"
8 #include "cdpmi.h"
9
10 static int parse_args(int argc, char **argv);
11
12 static struct video_mode *vidmode;
13
14 int main(int argc, char **argv)
15 {
16         int vmidx;
17         int num_frames = 0;
18         void *vmem;
19
20         read_config("rbench.cfg");
21
22         if(parse_args(argc, argv) == -1) {
23                 return 1;
24         }
25
26 #ifdef __DJGPP__
27         __djgpp_nearptr_enable();
28 #endif
29
30         init_logger("rbench.log");
31
32         if(init_video() == -1) {
33                 return 1;
34         }
35
36         if((vmidx = match_video_mode(opt.width, opt.height, opt.bpp)) == -1) {
37                 return 1;
38         }
39         if(!(vmem = set_video_mode(vmidx, 1))) {
40                 return 1;
41         }
42         vidmode = get_video_mode(vmidx);
43
44         fb_rmask = vidmode->rmask;
45         fb_gmask = vidmode->gmask;
46         fb_bmask = vidmode->bmask;
47         fb_rshift = vidmode->rshift;
48         fb_gshift = vidmode->gshift;
49         fb_bshift = vidmode->bshift;
50
51         init_timer(100);
52
53         for(;;) {
54                 while(kbhit()) {
55                         int c = getch();
56                         if(c == 27) goto end;
57                         key_event(c, 1);
58                 }
59
60                 time_msec = get_msec();
61                 num_frames++;
62                 redraw();
63
64                 blit_frame(framebuf, 0);
65         }
66
67 end:
68         set_text_mode();
69         cleanup_video();
70
71         if(num_frames) {
72                 printf("avg framerate: %.1f fps\n", (10000 * num_frames / time_msec) / 10.0f);
73         }
74         return 0;
75 }
76
77 int resizefb(int x, int y, int bpp, int pitch)
78 {
79         printf("resizefb %dx%d %dbpp (pitch: %d)\n", x, y, bpp, pitch);
80
81         free(framebuf);
82
83         fb_width = x;
84         fb_height = y;
85         fb_bpp = bpp;
86         fb_pitch = pitch;
87
88         if(!(framebuf = malloc(fb_pitch * fb_height))) {
89                 fprintf(stderr, "failed to allocate %dx%d (%dbpp) framebuffer\n",
90                                 fb_width, fb_height, fb_bpp);
91                 return -1;
92         }
93         return 0;
94 }
95
96 static const char *usage_str =
97         "Usage: %s [options]\n"
98         "Options:\n"
99         "  -s <WxH>: resolution\n"
100         "  -b <bpp>: color depth\n"
101         "  -h: print usage and exit\n";
102
103 static int parse_args(int argc, char **argv)
104 {
105         int i;
106
107         for(i=1; i<argc; i++) {
108                 if(argv[i][0] == '-') {
109                         if(argv[i][2]) {
110                                 goto inval_arg;
111                         }
112                         switch(argv[i][1]) {
113                         case 's':
114                                 if(!argv[++i] || sscanf(argv[i], "%dx%d", &opt.width, &opt.height) != 2) {
115                                         fprintf(stderr, "-s must be followed by WxH\n");
116                                         return -1;
117                                 }
118                                 break;
119
120                         case 'b':
121                                 if(!argv[++i] || !(opt.bpp = atoi(argv[i]))) {
122                                         fprintf(stderr, "-b must be followed by the color depth\n");
123                                         return -1;
124                                 }
125                                 break;
126
127                         case 'h':
128                                 printf(usage_str, argv[0]);
129                                 exit(0);
130
131                         default:
132                                 goto inval_arg;
133                         }
134                 } else {
135 inval_arg:      fprintf(stderr, "invalid argument: %s\n", argv[i]);
136                         return -1;
137                 }
138         }
139         return 0;
140 }
141