eglInitialize() Fails in X11. Always!

Hi everybody, I’m trying hard to solve this error but I can’t yet (for 5 months!).





The problem is when I try to use the X11 values, eg. the X11 visual Info, screen, display, WndHandle, etc, from X11 server to initialize the eglDisplay and then X11 window Handle to create the egl window surface.


I get succesive errors. First in eglInitialize(eglDisplay , Mayor , Minor), with eglDisplay obtained from eglGetDisplay( (EGLNativeDisplayType) x11Display), then in the eglCreateWindowSurface() with the x11WndHandle.





In order to summarize the errors, when i try to initialize the EGL display, the only parameter that can be seted in order to launch the app is set eglGetDisplay((EGLNativeDisplayType) EGL_DEFAULT_DISPLAY), after then I can initialize correctly the display. But the error goes to the eglCreateWindowSurface(), especifically to the window Handle that has to be seted to NULL.





Here below I’ve posted the code (it’s from the trainig course of the SDK “OGLES_HelloTriangle_LinuxX11.cpp”), with the conflicting lines in Bold, and after those, the commented lines in wich the program run correctly. The problem is that I need to run the program with a Window system, so I need to solve this!


I have to mention that the original code run in Linux machines with the OGLES Simulator (but not in the real embedded App)





// Initializes the display and screen





     x11Display = XOpenDisplay( 0 ); // the default display





     if (!x11Display)





     {





          printf(“Error: Unable to open X displayn”);





          goto cleanup;





     }





     x11Screen = XDefaultScreen( x11Display );











     // Gets the window parameters





     sRootWindow = RootWindow(x11Display, x11Screen);





     i32Depth = DefaultDepth(x11Display, x11Screen);





     x11Visual = new XVisualInfo;





     XMatchVisualInfo( x11Display, x11Screen, i32Depth, TrueColor, x11Visual);





     if (!x11Visual)





     {





          printf(“Error: Unable to acquire visualn”);





          goto cleanup;





     }





    x11Colormap = XCreateColormap( x11Display, sRootWindow, x11Visual->visual, AllocNone );





    sWA.colormap = x11Colormap;











    // Add to these for handling other events





    sWA.event_mask = StructureNotifyMask | ExposureMask | ButtonPressMask | ButtonReleaseMask | KeyPressMask | KeyReleaseMask;





    ui32Mask = CWBackPixel | CWBorderPixel | CWEventMask | CWColormap;











     i32Width = WINDOW_WIDTH < XDisplayWidth(x11Display, x11Screen) ? WINDOW_WIDTH : XDisplayWidth(x11Display, x11Screen);





     i32Height = WINDOW_HEIGHT < XDisplayHeight(x11Display,x11Screen) ? WINDOW_HEIGHT: XDisplayHeight(x11Display,x11Screen);











     // Creates the X11 window





    x11Window = XCreateWindow( x11Display, RootWindow(x11Display, x11Screen), 0, 0, i32Width, i32Height,





                                         0, CopyFromParent, InputOutput, CopyFromParent, ui32Mask, &sWA);





     XMapWindow(x11Display, x11Window);





     XFlush(x11Display);





//Up to here all it’s fine





     /





          Step 1 - Get the default display.





          EGL uses the concept of a “display” which in most environments





          corresponds to a single physical screen. Since we usually want





          to draw to the main screen or only have a single screen to begin





          with, we let EGL pick the default display.





          Querying other displays is platform specific.





     
/





     eglDisplay = eglGetDisplay((EGLNativeDisplayType)x11Display);


//The problems is solved when I set


//eglDisplay = eglGetDisplay((EGLNativeDisplayType)EGL_DEFAULT_DISPLAY);








     /





          Step 2 - Initialize EGL.





          EGL has to be initialized with the display obtained in the





          previous step. We cannot use other EGL functions except





          eglGetDisplay and eglGetError before eglInitialize has been





          called.





          If we’re not interested in the EGL version number we can just





          pass NULL for the second and third parameters.





     
/





     EGLint iMajorVersion, iMinorVersion;





     if (!eglInitialize(eglDisplay, &iMajorVersion, &iMinorVersion)) //HERE IT’S THE MAIN ERROR


     {


//With the above correction this is runnig well.





          printf(“Error: eglInitialize() failed.n”);





          goto cleanup;





     }











     /





          Step 3 - Make OpenGL ES the current API.





          EGL provides ways to set up OpenGL ES and OpenVG contexts





          (and possibly other graphics APIs in the future), so we need





          to specify the “current API”.





     
/





     eglBindAPI(EGL_OPENGL_ES_API);











     if (!TestEGLError(“eglBindAPI”))





     {





          goto cleanup;





     }











     /





          Step 4 - Specify the required configuration attributes.





          An EGL “configuration” describes the pixel format and type of





          surfaces that can be used for drawing.





          For now we just want to use a 16 bit RGB surface that is a





          Window surface, i.e. it will be visible on screen. The list





          has to contain key/value pairs, terminated with EGL_NONE.





      
/





     EGLint pi32ConfigAttribs[5];





     pi32ConfigAttribs[0] = EGL_SURFACE_TYPE;





     pi32ConfigAttribs[1] = EGL_WINDOW_BIT;





     pi32ConfigAttribs[2] = EGL_RENDERABLE_TYPE;





     pi32ConfigAttribs[3] = EGL_OPENGL_ES2_BIT;





     pi32ConfigAttribs[4] = EGL_NONE;











     /





          Step 5 - Find a config that matches all requirements.





          eglChooseConfig provides a list of all available configurations





          that meet or exceed the requirements given as the second





          argument. In most cases we just want the first config that meets





          all criteria, so we can limit the number of configs returned to 1.





     
/





     EGLint iConfigs;





     if (!eglChooseConfig(eglDisplay, pi32ConfigAttribs, &eglConfig, 1, &iConfigs) || (iConfigs != 1))





     {





          printf(“Error: eglChooseConfig() failed.n”);





          goto cleanup;





     }











     /





          Step 6 - Create a surface to draw to.





          Use the config picked in the previous step and the native window





          handle when available to create a window surface. A window surface





          is one that will be visible on screen inside the native display (or





          fullscreen if there is no windowing system).





          Pixmaps and pbuffers are surfaces which only exist in off-screen





          memory.





     
/





     eglSurface = eglCreateWindowSurface(eglDisplay, eglConfig, (EGLNativeWindowType)x11Window, NULL);


// the problem is solved with


//eglSurface = eglCreateWindowSurface(eglDisplay, eglConfig, NULL , NULL);


// and with the above correction in eglGetDisplay()





    if (!TestEGLError(“eglCreateWindowSurface”))





     {





          goto cleanup;





     }











     /





          Step 7 - Create a context.





     
/





     eglContext = eglCreateContext(eglDisplay, eglConfig, NULL, ai32ContextAttribs);





     if (!TestEGLError(“eglCreateContext”))





     {





          goto cleanup;





     }





aRc2011-12-13 20:31:26