/* * Exercise EGL API functions */ #include #include #include #include #include /** * 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; }