QNX eglChooseConfig源码实现
时间: 2023-09-10 21:07:53 浏览: 64
QNX的`eglChooseConfig`函数实现主要包括以下几个步骤:
1. 检查输入参数的有效性,比如`display`是否为有效值,`attrib_list`是否为NULL等。
2. 解析`attrib_list`列表,获取客户端程序指定的EGL属性,比如EGL_SURFACE_TYPE、EGL_RENDERABLE_TYPE等。
3. 遍历系统中所有的可用配置,对每一个配置进行属性匹配,判断该配置是否符合客户端程序的需求。
4. 将符合要求的配置存入一个配置列表中,并为每一个匹配成功的配置计算一个权值,以便后续排序。
5. 对配置列表进行排序,按照权值从高到低的顺序排列,以便客户端程序可以选择最适合的配置。
6. 返回排序后的配置列表。
下面是一个简单的`eglChooseConfig`函数的代码实现示例:
```c
EGLBoolean eglChooseConfig(EGLDisplay dpy, const EGLint *attrib_list,
EGLConfig *configs, EGLint config_size, EGLint *num_config)
{
EGLPlatform *plat = EGL_GET_PLATFORM(dpy);
EGLConfigList cfgList;
EGLint i, count = 0;
if (!plat)
return EGL_FALSE;
// 检查输入参数的有效性
if (!num_config || !plat->configs)
return EGL_FALSE;
if (config_size > 0 && !configs)
return EGL_FALSE;
if (attrib_list && !eglIsValidAttribList(attrib_list))
return EGL_FALSE;
// 解析attrib_list列表
EGLint surfaceType = EGL_WINDOW_BIT;
EGLint renderableType = EGL_OPENGL_ES2_BIT;
if (attrib_list)
{
for (i = 0; attrib_list[i] != EGL_NONE; i += 2)
{
switch (attrib_list[i])
{
case EGL_SURFACE_TYPE:
surfaceType = attrib_list[i + 1];
break;
case EGL_RENDERABLE_TYPE:
renderableType = attrib_list[i + 1];
break;
// 其他属性解析
default:
break;
}
}
}
// 遍历系统中所有的可用配置
for (EGLint i = 0; i < plat->numConfigs; i++)
{
EGLConfig config = &plat->configs[i];
// 判断该配置是否符合客户端程序的需求
if (eglMatchConfig(config, surfaceType, renderableType))
{
// 将符合要求的配置存入一个配置列表中
if (count < config_size)
{
configs[count] = config;
count++;
}
}
}
// 对配置列表进行排序
cfgList.configs = configs;
cfgList.count = count;
eglSortConfigList(&cfgList, attrib_list);
// 返回排序后的配置列表
*num_config = count;
return EGL_TRUE;
}
```