/* GPU example: the application owns context binding, drawing and swap pacing. */ #include #include #include #include #include typedef void (*clear_color_fn)(float, float, float, float); typedef void (*clear_fn)(unsigned); typedef void (*viewport_fn)(int, int, int, int); int main(int argc, char **argv) { bool smoke = argc == 2 && !strcmp(argv[1], "--smoke-test"); yasl_surface *s = yasl_gl_surface_create("YASL OpenGL", 800, 600, 0, NULL, NULL); if (!s || !yasl_gl_make_current(s)) { const char *error; yasl_get_error(&error); fprintf(stderr, "%s\n", error); yasl_shutdown(); return 1; } clear_color_fn clear_color = (clear_color_fn)yasl_gl_get_proc_address("glClearColor"); clear_fn clear = (clear_fn)yasl_gl_get_proc_address("glClear"); viewport_fn viewport = (viewport_fn)yasl_gl_get_proc_address("glViewport"); if (!clear_color || !clear || !viewport) { yasl_shutdown(); return 1; } yasl_gl_swap_interval(s, 1); int result = 0, frames = 0; for (bool running = true; running;) { yasl_event e; int n; while ((n = yasl_wait_event(&e, 0)) > 0) { if (e.type == YASL_EVENT_CLOSE || e.type == YASL_EVENT_QUIT || (e.type == YASL_EVENT_KEY && e.key.key == YASL_KEY_ESCAPE)) running = false; if (e.type == YASL_EVENT_DISPLAY_LOST) { result = 1; running = false; } } if (n < 0) { result = 1; break; } int w, h; yasl_surface_get_framebuffer_size(s, &w, &h); viewport(0, 0, w, h); double t = yasl_time_ns() / 1e9; clear_color((float)(0.3 + 0.2 * sin(t)), 0.2f, 0.4f, 1); clear(0x00004000u); if (!yasl_gl_swap_buffers(s)) { result = 1; break; } if (smoke && ++frames == 3) break; } yasl_gl_make_current(NULL); yasl_shutdown(); return result; }