added SDL tests
[glpixels] / sdl2pixels.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <math.h>
5 #include <SDL2/SDL.h>
6
7 int init(void);
8 void display(void);
9
10 int win_width, win_height;
11 int max_xscroll, max_yscroll;
12
13 #define IMG_W   1400
14 #define IMG_H   1200
15 unsigned int img[IMG_W * IMG_H];
16
17 unsigned int start_tm;
18 unsigned int num_frames;
19
20 int quit;
21 SDL_Window *win;
22 SDL_Renderer *sdlrend;
23 SDL_Texture *sdltex;
24
25
26 int main(int argc, char **argv)
27 {
28         SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER);
29
30         if(SDL_CreateWindowAndRenderer(800, 600, 0, &win, &sdlrend) == -1) {
31                 fprintf(stderr, "failed to set video mode\n");
32                 return 1;
33         }
34         SDL_SetWindowTitle(win, "SDL pixel drawing benchmark");
35
36         printf("SDL2 video driver: %s\n", SDL_GetCurrentVideoDriver());
37
38         if(init() == -1) {
39                 return 1;
40         }
41
42         start_tm = SDL_GetTicks();
43         while(!quit) {
44                 SDL_Event ev;
45                 while(SDL_PollEvent(&ev)) {
46                         switch(ev.type) {
47                         case SDL_QUIT:
48                                 goto done;
49
50                         case SDL_KEYDOWN:
51                                 if(ev.key.keysym.sym == 27) goto done;
52                                 break;
53
54                         default:
55                                 break;
56                         }
57                         if(quit) goto done;
58                 }
59
60                 display();
61         }
62
63 done:
64         SDL_Quit();
65         return 0;
66 }
67
68
69 int init(void)
70 {
71         int i, j, xor, r, g, b;
72         unsigned int *ptr;
73
74         ptr = img;
75         for(i=0; i<IMG_H; i++) {
76                 for(j=0; j<IMG_W; j++) {
77                         xor = i ^ j;
78                         r = (xor >> 1) & 0xff;
79                         g = xor & 0xff;
80                         b = (xor << 1) & 0xff;
81                         *ptr++ = b | (g << 8) | (r << 16);
82                 }
83         }
84
85         win_width = 800;
86         win_height = 600;
87
88         max_xscroll = IMG_W - win_width;
89         max_yscroll = IMG_H - win_height;
90
91         if(!(sdltex = SDL_CreateTexture(sdlrend, SDL_PIXELFORMAT_XRGB8888,
92                                         SDL_TEXTUREACCESS_STREAMING, win_width, win_height))) {
93                 fprintf(stderr, "failed to create SDL texture\n");
94                 return -1;
95         }
96
97         return 0;
98 }
99
100 void display(void)
101 {
102         int i, j;
103         unsigned int tm = SDL_GetTicks() - start_tm;
104         unsigned int interv;
105         float t = tm / 256.0f;
106         int xoffs = (int)((sin(t) * 0.5f + 0.5f) * max_xscroll);
107         int yoffs = (int)((cos(t) * 0.5f + 0.5f) * max_yscroll);
108         unsigned int *start = img + yoffs * IMG_W + xoffs;
109
110         SDL_UpdateTexture(sdltex, 0, start, IMG_W * 4);
111         SDL_RenderCopy(sdlrend, sdltex, 0, 0);
112         SDL_RenderPresent(sdlrend);
113
114         num_frames++;
115         tm = SDL_GetTicks();
116         interv = tm - start_tm;
117         if(interv >= 4000) {
118                 unsigned int fps = 100000 * num_frames / interv;
119                 printf("SDL2: %.2f fps\n", fps / 100.0f);
120                 num_frames = 0;
121                 start_tm = tm;
122                 quit = 1;
123         }
124 }