
- eglGetError是全程调用API时,若调用失败,用来获取失败原因的,所以单独列出。
- eglChooseConfig是让EGL自动帮你选择合适的配置,结果往往跟手动调用eglGetConfigs和eglGetConfigAttrib得到的结果相同,下面的代码就是使用eglChooseConfig。
例程:
// 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;
}