struct wl_shell_surface *shell_surface;
EGLSurface egl_surface;
struct wl_callback *callback;
- int fullscreen, configured, opaque;
+ int fullscreen, configured, opaque, buffer_size;
};
static const char *vert_shader_text =
static int running = 1;
static void
-init_egl(struct display *display, int opaque)
+init_egl(struct display *display, struct window *window)
{
static const EGLint context_attribs[] = {
EGL_CONTEXT_CLIENT_VERSION, 2,
EGL_RED_SIZE, 1,
EGL_GREEN_SIZE, 1,
EGL_BLUE_SIZE, 1,
- EGL_ALPHA_SIZE, 1,
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
EGL_NONE
};
- EGLint major, minor, n;
+ EGLint major, minor, n, count, i, size;
+ EGLConfig *configs;
EGLBoolean ret;
- if (opaque)
+ if (window->opaque || window->buffer_size == 16)
config_attribs[9] = 0;
display->egl.dpy = eglGetDisplay(display->display);
ret = eglBindAPI(EGL_OPENGL_ES_API);
assert(ret == EGL_TRUE);
+ if (!eglGetConfigs(display->egl.dpy, NULL, 0, &count) || count < 1)
+ assert(0);
+
+ configs = calloc(count, sizeof *configs);
+ assert(configs);
+
ret = eglChooseConfig(display->egl.dpy, config_attribs,
- &display->egl.conf, 1, &n);
- assert(ret && n == 1);
+ configs, count, &n);
+ assert(ret && n >= 1);
+
+ for (i = 0; i < n; i++) {
+ eglGetConfigAttrib(display->egl.dpy,
+ configs[i], EGL_BUFFER_SIZE, &size);
+ if (window->buffer_size == size) {
+ display->egl.conf = configs[i];
+ break;
+ }
+ }
+ free(configs);
+ if (display->egl.conf == NULL) {
+ fprintf(stderr, "did not find config with buffer size %d\n",
+ window->buffer_size);
+ exit(EXIT_FAILURE);
+ }
display->egl.ctx = eglCreateContext(display->egl.dpy,
display->egl.conf,
fprintf(stderr, "Usage: simple-egl [OPTIONS]\n\n"
" -f\tRun in fullscreen mode\n"
" -o\tCreate an opaque surface\n"
+ " -s\tUse a 16 bpp EGL config\n"
" -h\tThis help text\n\n");
exit(error_code);
display.window = &window;
window.window_size.width = 250;
window.window_size.height = 250;
+ window.buffer_size = 32;
for (i = 1; i < argc; i++) {
if (strcmp("-f", argv[i]) == 0)
window.fullscreen = 1;
else if (strcmp("-o", argv[i]) == 0)
window.opaque = 1;
+ else if (strcmp("-s", argv[i]) == 0)
+ window.buffer_size = 16;
else if (strcmp("-h", argv[i]) == 0)
usage(EXIT_SUCCESS);
else
wl_display_dispatch(display.display);
- init_egl(&display, window.opaque);
+ init_egl(&display, &window);
create_surface(&window);
init_gl(&window);