1. EGL的初始化
bool InitEgl(void)
{
EGLint majorVersion = 0;
EGLint minorVersion = 0;
//打开一个EGL显示服务器连接
EGLDisplay display;
display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
if (display == EGL_NO_DISPLAY || eglGetError() != EGL_SUCCESS)
return FALSE;
//初始化EGL内部数据, 返回EGL主次版本号
if (!eglInitialize(display, &majorVersion, &minorVersion) ||
eglGetError() != EGL_SUCCESS)
{
return FALSE;
}
}
2. EGL Configurations
查询窗口配置信息使用: EGLBoolean eglGetConfigs(EGLDisplay, EGLConfig *configs, EGLint maxReturnConfigs, EGLint *numConfigs);
eglGetConfigs有两种调用方式: ①如果参数#2为NULL, 系统将返回EGL_TURE, 并设定查找到的EGLConfigs可用数目numConfigs.
②参数#2不为空, 返回EGLConfig列表.
查询单个属性的使用: EGLBoolean eglGetConfigsAttrib(EGLDisplay, EGLConfig config, EGLint attribute, EGLint *value);
//获得EGL configurations are supported
bool GetEglConfigs( EGLDisplay &display)
{
EGLConfig *config_list = 0;
EGLint num_configs = 0;
//find out how many configurations are supported
if (eglGetConfigs(display, NULL, 0, &num_configs) == EGL_FALSE ||
eglGetError() != EGL_SUCCESS)
{
return FALSE;
}
config_list = (EGLConfig *)malloc(num_configs * sizeof(EGLConfig));
if (config_list == (EGLConfig *)0)
return FALSE;
//get configurations
if (eglGetConfigs(display, config_list, num_configs, &num_configs) == EGL_FALSE ||
eglGetError() != EGL_SUCCESS)
{
free(config_list);
return FALSE;
}
for (int i =0; i < num_configs; ++i)
std::cout<<*(config_list + i)<<std::endl;
return TRUE;
}
3. 使用eglChooseConfig去找出最匹配要求的窗口
对属性列表中没有明确指定的值, 使用下表中的默认值, 指定一个属性值, EGL将保证返回一个可以的最小的匹配.
如果eglChooseConfig返回成功, 可以用这些信息去创建窗口并绘制图形, 否则不能指定要渲染的窗口类型
//创建的窗口支持5位红蓝、6位绿色(RGB565格式)
bool EglChooseConfigs(EGLDisplay &display)
{
EGLint attribList[] =
{
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
EGL_RED_SIZE, 5,
EGL_GREEN_SIZE, 6,
EGL_BLUE_SIZE, 5,
EGL_DEPTH_SIZE, 1,
EGL_NONE
};
const EGLint MAXConfigs = 10;
EGLConfig configs[MAXConfigs];
EGLint numConfigs;
if (!eglChooseConfig(display, attribList, configs, MAXConfigs, &numConfigs))
return FALSE;
}
表 EGL 配置属性默认值和匹配法则
属性 | 数据类型 | 默认值 | 排序优先级 | 选择顺序 |
EGL_BUFFER_SIZE | int | 0 | 3 | Smaller value |
EGL_RED_SIZE | int | 0 | 2 | Larger value |
EGL_GREEN_SIZE | int | 0 | 2 | Larger value |
EGL_BLUE_SIZE | int | 0 | 2 | Larger value |
EGL_ALPHA_SIZE | int | 0 | 2 | Larger value |
EGL_CONFIG_CAVET | enum | EGL_DONT_CARE | 1(first) | Exact value |
EGL_CONFIG_ID | int | EGL_DONT_CARE | 9 | Exact value |
EGL_DEPTH_SIZE | int | 0 | 6 | Smaller value |
EGL_LEVEL | int | 0 | - | Equal value |
EGL_NATIVE_RENDERABLE | Boolean | EGL_DONT_CARE | - | Exact value |
EGL_NATIVE_VISUAL_TYPE | int | EGL_DONT_CARE | 8 | Exact value |
EGL_SAMPLE_BUFFERS | int | 0 | 4 | Smaller value |
EGL_SAMPLES | int | 0 | 5 | Smaller value |
EGL_STENCIL_SIZE | int | 0 | 7 | Smaller value |
EGL_SURFACE_TYPE | bitmask | EGL_WINDOW_BIT | - | Mask value |
EGL_TRANSPARENT_TYPE | enum | EGL_NONE | - | Exact value |
EGL_TRANSPARENT_RED_VALUE | int | EGL_DONT_CARE | - | Exact value |
EGL_TRANSPARENT_GREEN_VALUE | int | EGL_DONT_CARE | - | Exact value |
EGL_TRANSPARENT_BLUE_VALUE | int | EGL_DONT_CARE | - | Exact value |
{
const EGLint configAttribs[] =
{
EGL_RENDERABLE_TYPE, EGL_WINDOW_BIT,
EGL_RED_SIZE, 8,
EGL_GREEN_SIZE, 8,
EGL_BLUE_SIZE, 8,
EGL_DEPTH_SIZE, 24,
EGL_NONE
};
const EGLint contextAttribs[] =
{
EGL_CONTEXT_CLIENT_VERSION, 2,
EGL_NONE
};
EGLDisplay dpy;
dpy = eglGetDisplay(EGL_DEFAULT_DISPLAY);
if(dpy == EGL_NO_DISPLAY)
return FALSE;
EGLint major, minor;
if (!eglInitialize(dpy, &major, &minor))
return FALSE;
EGLConfig config;
EGLint numConfigs;
if (!eglChooseConfig(dpy, configAttribs, &config, 1, &numConfigs))
return FALSE;
EGLSurface window;
window = eglCreateWindowSurface(dpy, config, nativeWindow, NULL);
if (window == EGL_NO_SURFACE)
return EGL_FALSE;
EGLContext context;
context = eglCreateContext(dpy, config, EGL_NO_CONTEXT, contextAttribs);
if (context == EGL_NO_CONTEXT)
return FALSE;
if (!eglMakeCurrent(dpy, window, window, context))
return FALSE;
return TRUE;
}