Stephane Hockenhull
Member
- Joined
- Sep 12, 2010
- Messages
- 282
for some reason eglCreateWindowSurface() fails now when running on OpenPandora when I build BetaBlockQuest, or anything using EGL.
on the OpenPandora it doesn't matter if I cross-build, if I build natively on OP in my debian chroot, or natively on OP using cdevtools1000,
I get the same result in all cases: "eglCreateWindowSurface() failed"
I've made a tiny EGL initialization test that creates a window then cycle the clear color to try to narrow down the issue.
on OP it just returns an error: EGL_BAD_NATIVE_WINDOW
on the PandaBoard it runs fine.
and from the EGL examples and documentation, it *should* work... and it does, just not on OP
so I can't update BetaBlockQuest
test_egl.cpp:
on the OpenPandora it doesn't matter if I cross-build, if I build natively on OP in my debian chroot, or natively on OP using cdevtools1000,
I get the same result in all cases: "eglCreateWindowSurface() failed"
I've made a tiny EGL initialization test that creates a window then cycle the clear color to try to narrow down the issue.
on OP it just returns an error: EGL_BAD_NATIVE_WINDOW
on the PandaBoard it runs fine.
and from the EGL examples and documentation, it *should* work... and it does, just not on OP
so I can't update BetaBlockQuest
test_egl.cpp:
Code:
/*
example command line to compile
for pandaboard (ubuntu hardfloat):
arm-linux-gnueabihf-g++ test_egl.cpp -o test_egl -I/usr/lib/pvr-omap4-egl/include -L/usr/X11/lib -L/usr/lib/pvr-omap4-egl -lX11 -lEGL -lGLESv1_CM
for pandora:
arm-linux-gnueabi-g++ test_egl.cpp -o test_egl -I$HOME/cross_build/pandora/usr/include/ -L$HOME/cross_build/pandora/usr/lib/ -L$HOME/cross_build/pandora/GFX_Linux_SDK/OGLES/SDKPackage/Builds/OGLES/LinuxOMAP3/lib/ -lX11 -lEGL -lGLES_CM
for pandora using cdevtools1000:
g++ -o test_egl test_egl.cpp -lX11 -lEGL -lGLES_CM
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <X11/Xutil.h>
#include <X11/Xlocale.h>
#include <X11/Xatom.h>
#include <X11/keysym.h>
#include <X11/Xresource.h>
#include <X11/Xos.h>
#include <X11/Xlib.h>
#include <X11/cursorfont.h>
#include <X11/extensions/dpms.h>
#include <X11/extensions/Xrandr.h>
#include <X11/extensions/Xinerama.h>
#include <X11/XKBlib.h>
#include <EGL/egl.h>
#include <GLES/gl.h>
#define WINDOW_EVENT_MASK ( \
ExposureMask | StructureNotifyMask | PropertyChangeMask | FocusChangeMask | \
PointerMotionMask | EnterWindowMask | LeaveWindowMask | \
ButtonPressMask | ButtonReleaseMask | \
KeyPressMask | KeyReleaseMask | KeymapStateMask \
)
int main(int argc, const char **argv)
{
setlocale(LC_ALL, "");
Display *display = 0;
const char *display_name = 0;
// open display, with retries
for(int i=0; !display && (i < 5); i++){
display = XOpenDisplay(display_name);
if(!display){
sleep(1);
}
}
if(!display){
printf("ERROR: XOpenDisplay()\n");
return -1;
}
Screen *screen = DefaultScreenOfDisplay(display);
int screen_number = DefaultScreen(display);
Atom WM_DELETE_WINDOW;
Atom WM_PROTOCOLS;
WM_DELETE_WINDOW = XInternAtom(display, "WM_DELETE_WINDOW", false);
WM_PROTOCOLS = XInternAtom(display, "WM_PROTOCOLS", false);
Window window = XCreateSimpleWindow(
display, RootWindow(display, screen_number),
0, 0, 320, 240, 0,
None, None);
if(!window){
printf("XCreateSimpleWindow() failed\n");
return -1;
}
XFlush(display);
XMapWindow(display, window);
XFlush(display);
const EGLint attrs[] = {
EGL_LEVEL, 0,
EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES_BIT,
//EGL_NATIVE_RENDERABLE, EGL_FALSE,
EGL_DEPTH_SIZE, EGL_DONT_CARE,
EGL_NONE
};
EGLint numConfig =0;
EGLSurface egl_surface;
EGLContext egl_context;
EGLDisplay egl_display;
if ((egl_display = eglGetDisplay((EGLNativeDisplayType) EGL_DEFAULT_DISPLAY)) == EGL_NO_DISPLAY){
printf("eglGetDisplay() failed\n");
return -1;
}
// Initialize the display
EGLint major = 0;
EGLint minor = 0;
if (!eglInitialize(egl_display, &major, &minor)){
printf("eglInitialize() failed\n");
return -1;
}
printf("EGL %d.%d\n", major, minor);
EGLConfig eglConfig;
// Obtain the first configuration with a depth buffer
if (!eglChooseConfig(egl_display, attrs, &eglConfig, 1, &numConfig)){
printf("eglChooseConfig() failed\n");
return -1;
}
// Create a surface for the main window
if ((egl_surface = eglCreateWindowSurface(egl_display, eglConfig, (EGLNativeWindowType)window, NULL)) == EGL_NO_SURFACE){
printf("eglCreateWindowSurface() failed\n");
return -1;
}
// Create an OpenGL ES context
if ((egl_context = eglCreateContext(egl_display, eglConfig, EGL_NO_CONTEXT, 0)) == EGL_NO_CONTEXT){
printf("eglCreateContext() failed\n");
return -1;
}
// Make the context and surface current
if (!eglMakeCurrent(egl_display, egl_surface, egl_surface, egl_context)){
printf("eglMakeCurrent() failed\n");
return -1;
}
XEvent xevent;
int anim = 0;
bool quit = false;
while(!quit){
while(XCheckTypedEvent(display, ClientMessage, &xevent))
{
if(xevent.xclient.message_type == WM_PROTOCOLS){
if(xevent.xclient.data.l[0] == WM_DELETE_WINDOW){
quit = true;
} else {
}
} else {
}
}
while(XCheckWindowEvent(display, window, WINDOW_EVENT_MASK, &xevent)){
}
++anim;
glClearColor(0.5f, (anim & 0xFF) * (1.0f/255.0f), 0.5f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT);
eglSwapBuffers(egl_display, egl_surface);
}
return 0;
}