diff options
Diffstat (limited to 'progs/egl/demo1.c')
-rw-r--r-- | progs/egl/demo1.c | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/progs/egl/demo1.c b/progs/egl/demo1.c new file mode 100644 index 000000000..9ef17e38b --- /dev/null +++ b/progs/egl/demo1.c @@ -0,0 +1,145 @@ +/* + * Exercise EGL API functions + */ + +#include <GLES/egl.h> +#include <assert.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + + +/** + * Test EGL_MESA_screen_surface functions + */ +static void +TestScreens(EGLDisplay dpy) +{ +#define MAX 8 + EGLScreenMESA screens[MAX]; + EGLint numScreens; + EGLint i; + + eglGetScreensMESA(dpy, screens, MAX, &numScreens); + printf("Found %d screens\n", numScreens); + for (i = 0; i < numScreens; i++) { + printf(" Screen %d handle: %d\n", i, (int) screens[i]); + } +} + +/** + * Print table of all available configurations. + */ +static void +PrintConfigs(EGLDisplay d) +{ + EGLConfig *configs; + EGLint numConfigs, i; + + eglGetConfigs(d, NULL, 0, &numConfigs); + configs = malloc(sizeof(*configs) *numConfigs); + eglGetConfigs(d, configs, numConfigs, &numConfigs); + + printf("Configurations:\n"); + printf(" bf lv d st colorbuffer dp st supported \n"); + printf(" id sz l b ro r g b a th cl surfaces \n"); + printf("----------------------------------------------\n"); + for (i = 0; i < numConfigs; i++) { + EGLint id, size, level; + EGLint red, green, blue, alpha; + EGLint depth, stencil; + EGLint surfaces; + EGLint doubleBuf = 1, stereo = 0; + char surfString[100] = ""; + + eglGetConfigAttrib(d, configs[i], EGL_CONFIG_ID, &id); + eglGetConfigAttrib(d, configs[i], EGL_BUFFER_SIZE, &size); + eglGetConfigAttrib(d, configs[i], EGL_LEVEL, &level); + + eglGetConfigAttrib(d, configs[i], EGL_RED_SIZE, &red); + eglGetConfigAttrib(d, configs[i], EGL_GREEN_SIZE, &green); + eglGetConfigAttrib(d, configs[i], EGL_BLUE_SIZE, &blue); + eglGetConfigAttrib(d, configs[i], EGL_ALPHA_SIZE, &alpha); + eglGetConfigAttrib(d, configs[i], EGL_DEPTH_SIZE, &depth); + eglGetConfigAttrib(d, configs[i], EGL_STENCIL_SIZE, &stencil); + eglGetConfigAttrib(d, configs[i], EGL_SURFACE_TYPE, &surfaces); + + if (surfaces & EGL_WINDOW_BIT) + strcat(surfString, "win,"); + if (surfaces & EGL_PBUFFER_BIT) + strcat(surfString, "pb,"); + if (surfaces & EGL_PIXMAP_BIT) + strcat(surfString, "pix,"); + if (strlen(surfString) > 0) + surfString[strlen(surfString) - 1] = 0; + + printf("0x%02x %2d %2d %c %c %2d %2d %2d %2d %2d %2d %-12s\n", + id, size, level, + doubleBuf ? 'y' : '.', + stereo ? 'y' : '.', + red, green, blue, alpha, + depth, stencil, surfString); + } + free(configs); +} + + + +int +main(int argc, char *argv[]) +{ + int maj, min; + EGLContext ctx; + EGLSurface pbuffer; + EGLConfig configs[10]; + EGLBoolean b; + const EGLint pbufAttribs[] = { + EGL_WIDTH, 500, + EGL_HEIGHT, 500, + EGL_NONE + }; + + /* + EGLDisplay d = eglGetDisplay(EGL_DEFAULT_DISPLAY); + */ + EGLDisplay d = eglGetDisplay("!fb_dri"); + assert(d); + + if (!eglInitialize(d, &maj, &min)) { + printf("demo: eglInitialize failed\n"); + exit(1); + } + + printf("EGL version = %d.%d\n", maj, min); + printf("EGL_VENDOR = %s\n", eglQueryString(d, EGL_VENDOR)); + + PrintConfigs(d); + + ctx = eglCreateContext(d, configs[0], EGL_NO_CONTEXT, NULL); + if (ctx == EGL_NO_CONTEXT) { + printf("failed to create context\n"); + return 0; + } + + pbuffer = eglCreatePbufferSurface(d, configs[0], pbufAttribs); + if (pbuffer == EGL_NO_SURFACE) { + printf("failed to create pbuffer\n"); + return 0; + } + + b = eglMakeCurrent(d, pbuffer, pbuffer, ctx); + if (!b) { + printf("make current failed\n"); + return 0; + } + + b = eglMakeCurrent(d, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); + + TestScreens(d); + + eglDestroySurface(d, pbuffer); + eglDestroyContext(d, ctx); + eglTerminate(d); + + return 0; +} |