simple-egl: Add support for using a 16 bpp EGLConfig
This commit is contained in:
parent
1641d14b82
commit
78fe75368a
|
@ -92,7 +92,7 @@ struct window {
|
||||||
struct wl_shell_surface *shell_surface;
|
struct wl_shell_surface *shell_surface;
|
||||||
EGLSurface egl_surface;
|
EGLSurface egl_surface;
|
||||||
struct wl_callback *callback;
|
struct wl_callback *callback;
|
||||||
int fullscreen, configured, opaque;
|
int fullscreen, configured, opaque, buffer_size;
|
||||||
};
|
};
|
||||||
|
|
||||||
static const char *vert_shader_text =
|
static const char *vert_shader_text =
|
||||||
|
@ -115,7 +115,7 @@ static const char *frag_shader_text =
|
||||||
static int running = 1;
|
static int running = 1;
|
||||||
|
|
||||||
static void
|
static void
|
||||||
init_egl(struct display *display, int opaque)
|
init_egl(struct display *display, struct window *window)
|
||||||
{
|
{
|
||||||
static const EGLint context_attribs[] = {
|
static const EGLint context_attribs[] = {
|
||||||
EGL_CONTEXT_CLIENT_VERSION, 2,
|
EGL_CONTEXT_CLIENT_VERSION, 2,
|
||||||
|
@ -128,15 +128,15 @@ init_egl(struct display *display, int opaque)
|
||||||
EGL_RED_SIZE, 1,
|
EGL_RED_SIZE, 1,
|
||||||
EGL_GREEN_SIZE, 1,
|
EGL_GREEN_SIZE, 1,
|
||||||
EGL_BLUE_SIZE, 1,
|
EGL_BLUE_SIZE, 1,
|
||||||
EGL_ALPHA_SIZE, 1,
|
|
||||||
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
|
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
|
||||||
EGL_NONE
|
EGL_NONE
|
||||||
};
|
};
|
||||||
|
|
||||||
EGLint major, minor, n;
|
EGLint major, minor, n, count, i, size;
|
||||||
|
EGLConfig *configs;
|
||||||
EGLBoolean ret;
|
EGLBoolean ret;
|
||||||
|
|
||||||
if (opaque)
|
if (window->opaque || window->buffer_size == 16)
|
||||||
config_attribs[9] = 0;
|
config_attribs[9] = 0;
|
||||||
|
|
||||||
display->egl.dpy = eglGetDisplay(display->display);
|
display->egl.dpy = eglGetDisplay(display->display);
|
||||||
|
@ -147,9 +147,30 @@ init_egl(struct display *display, int opaque)
|
||||||
ret = eglBindAPI(EGL_OPENGL_ES_API);
|
ret = eglBindAPI(EGL_OPENGL_ES_API);
|
||||||
assert(ret == EGL_TRUE);
|
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,
|
ret = eglChooseConfig(display->egl.dpy, config_attribs,
|
||||||
&display->egl.conf, 1, &n);
|
configs, count, &n);
|
||||||
assert(ret && n == 1);
|
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.ctx = eglCreateContext(display->egl.dpy,
|
||||||
display->egl.conf,
|
display->egl.conf,
|
||||||
|
@ -705,6 +726,7 @@ usage(int error_code)
|
||||||
fprintf(stderr, "Usage: simple-egl [OPTIONS]\n\n"
|
fprintf(stderr, "Usage: simple-egl [OPTIONS]\n\n"
|
||||||
" -f\tRun in fullscreen mode\n"
|
" -f\tRun in fullscreen mode\n"
|
||||||
" -o\tCreate an opaque surface\n"
|
" -o\tCreate an opaque surface\n"
|
||||||
|
" -s\tUse a 16 bpp EGL config\n"
|
||||||
" -h\tThis help text\n\n");
|
" -h\tThis help text\n\n");
|
||||||
|
|
||||||
exit(error_code);
|
exit(error_code);
|
||||||
|
@ -722,12 +744,15 @@ main(int argc, char **argv)
|
||||||
display.window = &window;
|
display.window = &window;
|
||||||
window.window_size.width = 250;
|
window.window_size.width = 250;
|
||||||
window.window_size.height = 250;
|
window.window_size.height = 250;
|
||||||
|
window.buffer_size = 32;
|
||||||
|
|
||||||
for (i = 1; i < argc; i++) {
|
for (i = 1; i < argc; i++) {
|
||||||
if (strcmp("-f", argv[i]) == 0)
|
if (strcmp("-f", argv[i]) == 0)
|
||||||
window.fullscreen = 1;
|
window.fullscreen = 1;
|
||||||
else if (strcmp("-o", argv[i]) == 0)
|
else if (strcmp("-o", argv[i]) == 0)
|
||||||
window.opaque = 1;
|
window.opaque = 1;
|
||||||
|
else if (strcmp("-s", argv[i]) == 0)
|
||||||
|
window.buffer_size = 16;
|
||||||
else if (strcmp("-h", argv[i]) == 0)
|
else if (strcmp("-h", argv[i]) == 0)
|
||||||
usage(EXIT_SUCCESS);
|
usage(EXIT_SUCCESS);
|
||||||
else
|
else
|
||||||
|
@ -743,7 +768,7 @@ main(int argc, char **argv)
|
||||||
|
|
||||||
wl_display_dispatch(display.display);
|
wl_display_dispatch(display.display);
|
||||||
|
|
||||||
init_egl(&display, window.opaque);
|
init_egl(&display, &window);
|
||||||
create_surface(&window);
|
create_surface(&window);
|
||||||
init_gl(&window);
|
init_gl(&window);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue