From: Sylvain Beucler Date: Sat, 17 Mar 2012 10:09:19 +0000 (+0000) Subject: EGL: separate config and context code X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=commitdiff_plain;h=44856885ba35db9526d24d140b84ce492f4871d2;p=freeglut EGL: separate config and context code git-svn-id: svn+ssh://svn.code.sf.net/p/freeglut/code/trunk/freeglut/freeglut@1173 7f0cb862-5218-0410-a997-914c9d46530a --- diff --git a/src/android/fg_window_android.c b/src/android/fg_window_android.c index bbd17fd..6b51091 100644 --- a/src/android/fg_window_android.c +++ b/src/android/fg_window_android.c @@ -52,6 +52,7 @@ void fgPlatformOpenWindow( SFG_Window* window, const char* title, return; } + fghChooseConfigEGL(&window->Window.pContext.egl.Config); fghCreateNewContextEGL(window); /* Wait until window is available and OpenGL context is created */ @@ -67,8 +68,16 @@ void fgPlatformOpenWindow( SFG_Window* window, const char* title, } EGLDisplay display = fgDisplay.pDisplay.egl.Display; - EGLint format = fgDisplay.pDisplay.single_window->Window.pContext.egl.ContextFormat; - ANativeWindow_setBuffersGeometry(window->Window.Handle, 0, 0, format); + + /* 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. */ + EGLint vid; + eglGetConfigAttrib(display, window->Window.pContext.egl.Config, + EGL_NATIVE_VISUAL_ID, &vid); + + ANativeWindow_setBuffersGeometry(window->Window.Handle, 0, 0, vid); fghPlatformOpenWindowEGL(window); window->State.Visible = GL_TRUE; diff --git a/src/egl/fg_init_egl.c b/src/egl/fg_init_egl.c index 1bd4b14..c6ceb63 100644 --- a/src/egl/fg_init_egl.c +++ b/src/egl/fg_init_egl.c @@ -47,6 +47,12 @@ void fgPlatformInitialize( const char* displayName ) if (!eglInitialize(fgDisplay.pDisplay.egl.Display, NULL, NULL)) fgError("eglInitialize: error %x\n", eglGetError()); +# ifdef GL_VERSION_1_1 /* or later */ + eglBindAPI(EGL_OPENGL_API); +# else + eglBindAPI(EGL_OPENGL_ES_API); +# endif + // fgDisplay.ScreenWidth = ...; // fgDisplay.ScreenHeight = ...; // fgDisplay.ScreenWidthMM = ...; diff --git a/src/egl/fg_internal_egl.h b/src/egl/fg_internal_egl.h index a10383d..f2015b9 100644 --- a/src/egl/fg_internal_egl.h +++ b/src/egl/fg_internal_egl.h @@ -47,8 +47,7 @@ typedef EGLContext SFG_WindowContextType ; struct tagSFG_PlatformContextEGL { EGLSurface Surface; - EGLConfig ContextConfig; - EGLint ContextFormat; + EGLConfig Config; }; diff --git a/src/egl/fg_structure_egl.c b/src/egl/fg_structure_egl.c index d636bf8..adc3cea 100644 --- a/src/egl/fg_structure_egl.c +++ b/src/egl/fg_structure_egl.c @@ -31,5 +31,5 @@ extern SFG_Structure fgStructure; void fgPlatformCreateWindow ( SFG_Window *window ) { window->Window.pContext.egl.Surface = EGL_NO_SURFACE; - window->Window.pContext.egl.ContextConfig = NULL; + window->Window.pContext.egl.Config = NULL; } diff --git a/src/egl/fg_window_egl.c b/src/egl/fg_window_egl.c index f8536fc..75547ba 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 fghCreateNewContextEGL( SFG_Window* window ) { - /* - * 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)); +void fghChooseConfigEGL(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,34 +46,32 @@ void fghCreateNewContextEGL( SFG_Window* window ) { 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)) + fgError("eglChooseConfig: error %x\n", eglGetError()); +} - EGLint format; - EGLint numConfigs; - EGLConfig config; +/** + * Initialize an EGL context for the current display. + */ +void fghCreateNewContextEGL( SFG_Window* window ) { EGLContext context; EGLDisplay eglDisplay = fgDisplay.pDisplay.egl.Display; - - /* 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); - - /* 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); - - /* Default, but doesn't hurt */ - eglBindAPI(EGL_OPENGL_ES_API); + 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(); @@ -88,8 +82,6 @@ void fghCreateNewContextEGL( SFG_Window* window ) { fgError("Wrong GLES major version: %d\n", ver); window->Window.Context = context; - window->Window.pContext.egl.ContextConfig = config; - window->Window.pContext.egl.ContextFormat = format; } /* @@ -98,7 +90,7 @@ void fghCreateNewContextEGL( SFG_Window* window ) { void fghPlatformOpenWindowEGL( SFG_Window* window ) { EGLDisplay display = fgDisplay.pDisplay.egl.Display; - EGLConfig config = window->Window.pContext.egl.ContextConfig; + EGLConfig config = window->Window.pContext.egl.Config; EGLSurface surface = eglCreateWindowSurface(display, config, window->Window.Handle, NULL); if (surface == EGL_NO_SURFACE)