How can one use EGL with X11?

I am trying to use EGL with X11, but I am having some trouble.

That’s the EGL related code. Error checking code has been stripped for brevity:


EGLBoolean CreateEGLContext ( EGLNativeWindowType hWnd, EGLDisplay* eglDisplay,
                              EGLContext* eglContext, EGLSurface* eglSurface,
                              EGLint attribList[])
{
    ...

    // Get Display
    display = eglGetDisplay(EGL_DEFAULT_DISPLAY);

    // Initialize EGL
    eglInitialize(display, &majorVersion, &minorVersion)

    // Get configs
    eglGetConfigs(display, NULL, 0, &numConfigs)

    // Choose config
    eglChooseConfig(display, attribList, &config, 1, &numConfigs)

    // Create a surface
    surface = eglCreateWindowSurface(display, config, (EGLNativeWindowType)hWnd, NULL);

    // Create a GL context
    context = eglCreateContext(display, config, EGL_NO_CONTEXT, contextAttribs );

    // Make the context current
    eglMakeCurrent(display, surface, surface, context)

    ...
}

And it chokes on eglMakeCurrent, throwing a segmentation fault signal and outputting these error messages:

X Error: code 146 major 135 minor 5: GLXBadDrawable.
X Error: code 3 major 3 minor 0: BadWindow (invalid Window parameter).
X Error: code 3 major 3 minor 0: BadWindow (invalid Window parameter).
Segmentation fault

Of course one would wonder where’s the connection with X11 here? It’s in the hWnd, which is obtained from this code:


scr = DefaultScreen(dpy);
rootwin = RootWindow(dpy, scr);
cmap = DefaultColormap(dpy, scr);

win=XCreateSimpleWindow(dpy, rootwin,
        0, 0, esContext->width, esContext->height, 0,
        BlackPixel(dpy, scr), BlackPixel(dpy, scr));

XStoreName(dpy, win, "opengles2.0");

gc=XCreateGC(dpy, win, 0, NULL);
XSetForeground(dpy, gc, WhitePixel(dpy, scr));

XSelectInput(dpy, win, ExposureMask|ButtonPressMask);

XMapWindow(dpy, win);

/*
 * Link the windows handle to EGL
 */
esContext->hWnd = win;

Now note that if I set hWnd to NULL it does not show an error but just doesn’t do anything (i.e. doesn’t open a window).

Any suggestions would be highly appreciated! Thanks!

The PVR initialization demo worked. Thanks anyway!

But hwnd is part of WinApi that’s why you use X11 then you need pass x_display in eglGetDisplay() of Display ^x_display = XOpenDisplay(NULL) then it will Initialize with egl subsystem.