vbe: print rgb masks/shifts to the log
[retrobench] / src / rbench.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <math.h>
4 #include "rbench.h"
5 #include "treestor.h"
6 #include "util.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 int fb_rshift, fb_gshift, fb_bshift;
18 unsigned int fb_rmask, fb_gmask, fb_bmask;
19 void *framebuf;
20 unsigned int time_msec;
21
22 static const char *cpufeat[] = {
23         "fpu", "vme", "dbgext", "pse", "tsc", "msr", "pae", "mce", "cx8", "apic", 0,
24         "sep", "mtrr", "pge", "mca", "cmov", "pat", "pse36", "psn", "clf", 0,
25         "dtes", "acpi", "mmx", "fxsr", "sse", "sse2", "ss", "htt", "tm1", "ia64", "pbe"
26 };
27
28 static const char *cpufeat2[] = {
29         "sse3", "pclmul", "dtes64", "monitor", "dscpl", "vmx", "smx", "est", "tm2",
30         "ssse3", "cid", 0, "fma", "cx16", "etprd", "pdcm", 0, "pcide", "dca", "sse4.1",
31         "sse4.2", "x2apic", "movbe", "popcnt", 0, "aes", "xsave", "osxsave", "avx"
32 };
33
34 int init(void)
35 {
36         int i;
37         struct cpuid_info cpu;
38
39         if(read_cpuid(&cpu) != -1) {
40                 printf("CPUID information:\n");
41                 printf("  cpuid blocks: %d\n", (int)cpu.maxidx);
42                 printf("  CPU vendor: ");
43                 for(i=0; i<12; i++) {
44                         putchar(cpu.vendor[i]);
45                 }
46                 putchar('\n');
47                 printf("  stepping: %u, model: %u, family: %u\n", CPUID_STEPPING(cpu.id),
48                                 CPUID_MODEL(cpu.id), CPUID_FAMILY(cpu.id));
49                 printf("  features:");
50                 for(i=0; i<sizeof cpufeat / sizeof *cpufeat; i++) {
51                         if(cpufeat[i] && (cpu.feat & (1 << i))) {
52                                 printf(" %s", cpufeat[i]);
53                         }
54                 }
55                 for(i=0; i<sizeof cpufeat2 / sizeof *cpufeat2; i++) {
56                         if(cpufeat2[i] && (cpu.feat2 & (1 << i))) {
57                                 printf(" %s", cpufeat2[i]);
58                         }
59                 }
60                 putchar('\n');
61         }
62
63         printf("initialized graphics %dx%d %dbpp\n", fb_width, fb_height, fb_bpp);
64         printf("  rgb mask: %x %x %x\n", fb_rmask, fb_gmask, fb_bmask);
65         printf("  rgb shift: %d %d %d\n", fb_rshift, fb_gshift, fb_bshift);
66         return 0;
67 }
68
69 void cleanup(void)
70 {
71 }
72
73 #ifdef NOZOOM
74 #define XORRGB(x, y, dx, dy, zoom, r, g, b) \
75         do { \
76                 int xor = (((x) - fb_width/2) + (dx)) ^ (((y) - fb_height/2) + (dy)); \
77                 (r) = xor >> 2; \
78                 (g) = xor >> 1; \
79                 (b) = xor; \
80         } while(0)
81 #else
82 #define XORRGB(x, y, dx, dy, zoom, r, g, b) \
83         do { \
84                 int xor = ((((x) - fb_width/2) * (zoom) >> 16) + (dx)) ^ ((((y) - fb_height/2) * (zoom) >> 16) + (dy)); \
85                 (r) = xor >> 2; \
86                 (g) = xor >> 1; \
87                 (b) = xor; \
88         } while(0)
89 #endif
90
91 void redraw(void)
92 {
93         int i, j, r, g, b, xoffs, yoffs;
94 #ifndef NOZOOM
95         int zoom;
96 #endif
97         unsigned char *fbptr;
98         uint16_t *fbptr16;
99         uint32_t *fbptr32;
100
101         xoffs = COS(time_msec >> 2) * fb_width >> 14;
102         yoffs = SIN(time_msec >> 1) * fb_height >> 15;
103 #ifndef NOZOOM
104         zoom = (SIN(time_msec >> 3) << 1) + 0x18000;
105 #endif
106
107         switch(fb_bpp) {
108         case 15:
109         case 16:
110                 fbptr16 = framebuf;
111                 for(i=0; i<fb_height; i++) {
112                         for(j=0; j<fb_width; j++) {
113                                 XORRGB(j, i, xoffs, yoffs, zoom, r, g, b);
114                                 *fbptr16++ = (((r >> 3) << fb_rshift) & fb_rmask) |
115                                         (((g >> 2) << fb_gshift) & fb_gmask) |
116                                         (((b >> 3) << fb_bshift) & fb_bmask);
117                         }
118                         fbptr16 += (fb_pitch >> 1) - fb_width;
119                 }
120                 break;
121
122         case 24:
123                 fbptr = framebuf;
124                 for(i=0; i<fb_height; i++) {
125                         for(j=0; j<fb_width; j++) {
126                                 XORRGB(j, i, xoffs, yoffs, zoom, r, g, b);
127                                 *fbptr++ = r;
128                                 *fbptr++ = g;
129                                 *fbptr++ = b;
130                         }
131                         fbptr += fb_pitch - fb_width * 3;
132                 }
133                 break;
134
135         case 32:
136                 fbptr32 = framebuf;
137                 for(i=0; i<fb_height; i++) {
138                         for(j=0; j<fb_width; j++) {
139                                 XORRGB(j, i, xoffs, yoffs, zoom, r, g, b);
140                                 *fbptr32++ = (((r) << fb_rshift) & fb_rmask) |
141                                         (((g) << fb_gshift) & fb_gmask) |
142                                         (((b) << fb_bshift) & fb_bmask);
143                         }
144                         fbptr32 += (fb_pitch >> 2) - fb_width;
145                 }
146                 break;
147         }
148 }
149
150 void key_event(int key, int press)
151 {
152 }
153
154 int read_config(const char *fname)
155 {
156         FILE *fp;
157         struct ts_node *ts;
158
159         if(!(fp = fopen(fname, "rb"))) {
160                 return -1;
161         }
162         fclose(fp);
163
164         if(!(ts = ts_load(fname))) {
165                 return -1;
166         }
167
168         opt.width = ts_lookup_int(ts, "rbench.width", DEF_WIDTH);
169         opt.height = ts_lookup_int(ts, "rbench.height", DEF_HEIGHT);
170         opt.bpp = ts_lookup_int(ts, "rbench.bpp", DEF_BPP);
171
172         ts_free_tree(ts);
173         return 0;
174 }