X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Fegl%2Ffg_window_egl.c;h=48eb74856ba2ccf1c9d63e7ba093b1e44ecd07d5;hb=a00c7ee3552b527ac6b375d6a6ca42f90770ddc3;hp=6b980bd3ad326d3af9811d7f7756fcd3442357ff;hpb=7fbb15bc63c7937cab772bd942883e3811acbabf;p=freeglut diff --git a/src/egl/fg_window_egl.c b/src/egl/fg_window_egl.c index 6b980bd..48eb748 100644 --- a/src/egl/fg_window_egl.c +++ b/src/egl/fg_window_egl.c @@ -26,20 +26,16 @@ #include #include "fg_internal.h" -/** - * Initialize an EGL context for the current display. - */ -void fghCreateContext( ) { - /* - * Here specify the attributes of the desired configuration. - * Below, we select an EGLConfig with at least 8 bits per color - * component compatible with on-screen windows - */ - /* Ensure OpenGLES 2.0 context */ - printf("DisplayMode: %d (DEPTH %d)\n", fgState.DisplayMode, (fgState.DisplayMode & GLUT_DEPTH)); +int fghChooseConfig(EGLConfig* config) { const EGLint attribs[] = { EGL_SURFACE_TYPE, EGL_WINDOW_BIT, +#ifdef GL_ES_VERSION_2_0 EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, +#elif GL_VERSION_ES_CM_1_0 || GL_VERSION_ES_CL_1_0 || GL_VERSION_ES_CM_1_1 || GL_VERSION_ES_CL_1_1 + EGL_RENDERABLE_TYPE, EGL_OPENGL_ES_BIT, +#else + EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT, +#endif EGL_BLUE_SIZE, 1, EGL_GREEN_SIZE, 1, EGL_RED_SIZE, 1, @@ -50,80 +46,95 @@ void fghCreateContext( ) { EGL_SAMPLES, (fgState.DisplayMode & GLUT_MULTISAMPLE) ? fgState.SampleNumber : 0, EGL_NONE }; + + EGLint num_config; + if (!eglChooseConfig(fgDisplay.pDisplay.egl.Display, + attribs, config, 1, &num_config)) { + fgWarning("eglChooseConfig: error %x\n", eglGetError()); + return 0; + } - EGLint format; - EGLint numConfigs; - EGLConfig config; - EGLContext context; - - EGLDisplay eglDisplay = fgDisplay.pDisplay.eglDisplay; - - /* TODO : apply DisplayMode */ - /* (GLUT_DEPTH already applied in attribs[] above) */ - - /* Here, the application chooses the configuration it desires. In this - * sample, we have a very simplified selection process, where we pick - * the first EGLConfig that matches our criteria */ - eglChooseConfig(eglDisplay, attribs, &config, 1, &numConfigs); + return 1; +} - /* EGL_NATIVE_VISUAL_ID is an attribute of the EGLConfig that is - * guaranteed to be accepted by ANativeWindow_setBuffersGeometry(). - * As soon as we picked a EGLConfig, we can safely reconfigure the - * ANativeWindow buffers to match, using EGL_NATIVE_VISUAL_ID. */ - eglGetConfigAttrib(eglDisplay, config, EGL_NATIVE_VISUAL_ID, &format); +/** + * Initialize an EGL context for the current display. + */ +EGLContext fghCreateNewContextEGL( SFG_Window* window ) { + EGLContext context; - /* Default, but doesn't hurt */ - eglBindAPI(EGL_OPENGL_ES_API); + EGLDisplay eglDisplay = fgDisplay.pDisplay.egl.Display; + EGLConfig eglConfig = window->Window.pContext.egl.Config; /* Ensure OpenGLES 2.0 context */ static const EGLint ctx_attribs[] = { +#ifdef GL_ES_VERSION_2_0 EGL_CONTEXT_CLIENT_VERSION, 2, +#elif GL_VERSION_ES_CM_1_0 || GL_VERSION_ES_CL_1_0 || GL_VERSION_ES_CM_1_1 || GL_VERSION_ES_CL_1_1 + EGL_CONTEXT_CLIENT_VERSION, 1, +#endif EGL_NONE }; - context = eglCreateContext(eglDisplay, config, EGL_NO_CONTEXT, ctx_attribs); + context = eglCreateContext(eglDisplay, eglConfig, EGL_NO_CONTEXT, ctx_attribs); if (context == EGL_NO_CONTEXT) { fgWarning("Cannot initialize EGL context, err=%x\n", eglGetError()); fghContextCreationError(); } EGLint ver = -1; - eglQueryContext(fgDisplay.pDisplay.eglDisplay, context, EGL_CONTEXT_CLIENT_VERSION, &ver); + eglQueryContext(fgDisplay.pDisplay.egl.Display, context, EGL_CONTEXT_CLIENT_VERSION, &ver); +#ifdef GL_ES_VERSION_2_0 if (ver != 2) +#else + if (ver != 1) +#endif fgError("Wrong GLES major version: %d\n", ver); - fgDisplay.pDisplay.eglContext = context; - fgDisplay.pDisplay.eglContextConfig = config; - fgDisplay.pDisplay.eglContextFormat = format; + return context; +} + +void fgPlatformSetWindow ( SFG_Window *window ) +{ + if (eglMakeCurrent(fgDisplay.pDisplay.egl.Display, + window->Window.pContext.egl.Surface, + window->Window.pContext.egl.Surface, + window->Window.Context) == EGL_FALSE) + fgError("eglMakeCurrent: err=%x\n", eglGetError()); } /* * Really opens a window when handle is available */ -EGLSurface fghEGLPlatformOpenWindow( EGLNativeWindowType handle ) +void fghPlatformOpenWindowEGL( SFG_Window* window ) { - EGLDisplay display = fgDisplay.pDisplay.eglDisplay; - EGLContext context = fgDisplay.pDisplay.eglContext; - EGLConfig config = fgDisplay.pDisplay.eglContextConfig; + EGLDisplay display = fgDisplay.pDisplay.egl.Display; + EGLConfig config = window->Window.pContext.egl.Config; - EGLSurface surface = eglCreateWindowSurface(display, config, handle, NULL); + EGLSurface surface = eglCreateWindowSurface(display, config, window->Window.Handle, NULL); if (surface == EGL_NO_SURFACE) fgError("Cannot create EGL window surface, err=%x\n", eglGetError()); - if (eglMakeCurrent(display, surface, surface, context) == EGL_FALSE) - fgError("eglMakeCurrent: err=%x\n", eglGetError()); + window->Window.pContext.egl.Surface = surface; + + fgPlatformSetWindow(window); - //EGLint w, h; - //eglQuerySurface(display, surface, EGL_WIDTH, &w); - //eglQuerySurface(display, surface, EGL_HEIGHT, &h); + /* EGLint w, h; */ + /* eglQuerySurface(display, surface, EGL_WIDTH, &w); */ + /* eglQuerySurface(display, surface, EGL_HEIGHT, &h); */ - return surface; } /* * Closes a window, destroying the frame and OpenGL context */ -void fgPlatformCloseWindow( SFG_Window* window ) +void fghPlatformCloseWindowEGL( SFG_Window* window ) { - if (window->Window.pContext.eglSurface != EGL_NO_SURFACE) { - eglDestroySurface(fgDisplay.pDisplay.eglDisplay, window->Window.pContext.eglSurface); - window->Window.pContext.eglSurface = EGL_NO_SURFACE; + eglMakeCurrent(fgDisplay.pDisplay.egl.Display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); + if (window->Window.Context != EGL_NO_CONTEXT) { + eglDestroyContext(fgDisplay.pDisplay.egl.Display, window->Window.Context); + window->Window.Context = EGL_NO_CONTEXT; + } + + if (window->Window.pContext.egl.Surface != EGL_NO_SURFACE) { + eglDestroySurface(fgDisplay.pDisplay.egl.Display, window->Window.pContext.egl.Surface); + window->Window.pContext.egl.Surface = EGL_NO_SURFACE; } }