/// // esCreateWindow() // // title - name for title bar of window // width - width of window to create // height - height of window to create // flags - bitwise or of window creation flags // ES_WINDOW_ALPHA - specifies that the framebuffer should have alpha // ES_WINDOW_DEPTH - specifies that a depth buffer should be created // ES_WINDOW_STENCIL - specifies that a stencil buffer should be created // ES_WINDOW_MULTISAMPLE - specifies that a multi-sample buffer should be created // GLboolean ESUTIL_API esCreateWindow ( ESContext *esContext, const char *title, GLint width, GLint height, GLuint flags ) { #ifndef __APPLE__ EGLConfig config; EGLint majorVersion; EGLint minorVersion; EGLint contextAttribs[] = { EGL_CONTEXT_CLIENT_VERSION, 3, EGL_NONE }; if ( esContext == NULL ) { return GL_FALSE; } #ifdef ANDROID // For Android, get the width/height from the window rather than what the // application requested. esContext->width = ANativeWindow_getWidth ( esContext->eglNativeWindow ); esContext->height = ANativeWindow_getHeight ( esContext->eglNativeWindow ); #else esContext->width = width; esContext->height = height; #endif if ( !WinCreate ( esContext, title ) ) { return GL_FALSE; } esContext->eglDisplay = eglGetDisplay( esContext->eglNativeDisplay ); if ( esContext->eglDisplay == EGL_NO_DISPLAY ) { return GL_FALSE; } // Initialize EGL if ( !eglInitialize ( esContext->eglDisplay, &majorVersion, &minorVersion ) ) { return GL_FALSE; } { EGLint numConfigs = 0; EGLint attribList[] = { EGL_RED_SIZE, 5, EGL_GREEN_SIZE, 6, EGL_BLUE_SIZE, 5, EGL_ALPHA_SIZE, ( flags & ES_WINDOW_ALPHA ) ? 8 : EGL_DONT_CARE, EGL_DEPTH_SIZE, ( flags & ES_WINDOW_DEPTH ) ? 8 : EGL_DONT_CARE, EGL_STENCIL_SIZE, ( flags & ES_WINDOW_STENCIL ) ? 8 : EGL_DONT_CARE, EGL_SAMPLE_BUFFERS, ( flags & ES_WINDOW_MULTISAMPLE ) ? 1 : 0, // if EGL_KHR_create_context extension is supported, then we will use // EGL_OPENGL_ES3_BIT_KHR instead of EGL_OPENGL_ES2_BIT in the attribute list EGL_RENDERABLE_TYPE, GetContextRenderableType ( esContext->eglDisplay ), EGL_NONE }; // Choose config if ( !eglChooseConfig ( esContext->eglDisplay, attribList, &config, 1, &numConfigs ) ) { return GL_FALSE; } if ( numConfigs < 1 ) { return GL_FALSE; } } #ifdef ANDROID // For Android, need to get the EGL_NATIVE_VISUAL_ID and set it using ANativeWindow_setBuffersGeometry { EGLint format = 0; eglGetConfigAttrib ( esContext->eglDisplay, config, EGL_NATIVE_VISUAL_ID, &format ); ANativeWindow_setBuffersGeometry ( esContext->eglNativeWindow, 0, 0, format ); } #endif // ANDROID // Create a surface esContext->eglSurface = eglCreateWindowSurface ( esContext->eglDisplay, config, esContext->eglNativeWindow, NULL ); if ( esContext->eglSurface == EGL_NO_SURFACE ) { return GL_FALSE; } // Create a GL context esContext->eglContext = eglCreateContext ( esContext->eglDisplay, config, EGL_NO_CONTEXT, contextAttribs ); if ( esContext->eglContext == EGL_NO_CONTEXT ) { return GL_FALSE; } // Make the context current if ( !eglMakeCurrent ( esContext->eglDisplay, esContext->eglSurface, esContext->eglSurface, esContext->eglContext ) ) { return GL_FALSE; } #endif // #ifndef __APPLE__ return GL_TRUE; }
GLboolean ESUTIL_API esCreateWindow(ESContext *esContext, const char *title, GLint width, GLint height, GLuint flags) { #ifndef __APPLE__ EGLConfig config; EGLint majorVersion; EGLint minorVersion; //OpenGL ES version 3.0 , set to 2 for 2.0 EGLint contextAttribs[] = { EGL_CONTEXT_CLIENT_VERSION, 3, EGL_NONE }; if (esContext == NULL) return GL_FALSE; esContext->width = width; esContext->height = height; if (!WinCreate(esContext, title)) { return GL_FALSE; } esContext->eglDisplay = eglGetDisplay(esContext->eglNativeDisplay); if (esContext->eglDisplay == EGL_NO_DISPLAY) { return GL_FALSE; } // Initialize EGL if (!eglInitialize(esContext->eglDisplay, &majorVersion, &minorVersion)) { return GL_FALSE; } { EGLint numConfigs = 0; EGLint attribList[] = { EGL_RED_SIZE, 5, EGL_GREEN_SIZE, 6, EGL_BLUE_SIZE, 5, EGL_ALPHA_SIZE, (flags & ES_WINDOW_ALPHA) ? 8 : EGL_DONT_CARE, EGL_DEPTH_SIZE, (flags & ES_WINDOW_DEPTH) ? 8 : EGL_DONT_CARE, EGL_STENCIL_SIZE, (flags & ES_WINDOW_STENCIL) ? 8 : EGL_DONT_CARE, EGL_SAMPLE_BUFFERS, (flags & ES_WINDOW_MULTISAMPLE) ? 1 : 0, // if EGL_KHR_create_context extension is supported, then we will use // EGL_OPENGL_ES3_BIT_KHR instead of EGL_OPENGL_ES2_BIT in the attribute list EGL_RENDERABLE_TYPE, GetContextRenderableType(esContext->eglDisplay), EGL_NONE }; // Choose config if (!eglChooseConfig(esContext->eglDisplay, attribList, &config, 1, &numConfigs)) { return GL_FALSE; } if (numConfigs < 1) { return GL_FALSE; } } // Create a surface esContext->eglSurface = eglCreateWindowSurface(esContext->eglDisplay, config, esContext->eglNativeWindow, NULL); if (esContext->eglSurface == EGL_NO_SURFACE) { return GL_FALSE; } // Create a GL context esContext->eglContext = eglCreateContext(esContext->eglDisplay, config, EGL_NO_CONTEXT, contextAttribs); if (esContext->eglContext == EGL_NO_CONTEXT) { return GL_FALSE; } // Make the context current if (!eglMakeCurrent(esContext->eglDisplay, esContext->eglSurface, esContext->eglSurface, esContext->eglContext)) { return GL_FALSE; } #endif // #ifndef __APPLE__ return GL_TRUE; }