如何在GLX中获取当前对应的GLXFBConfig?
从XVisualInfo获取对应的GLXFBConfig方法
GLX确实没有提供直接从Visual反向获取GLXFBConfig的API,但可以通过枚举+匹配的方式实现,核心思路是用和你创建Visual时相同的属性枚举所有GLXFBConfig,再逐个对比找到对应Visual的配置。
具体实现步骤
- 用你调用
glXChooseVisual时的相同属性数组,调用glXChooseFBConfig获取所有符合条件的FBConfig列表 - 遍历每个FBConfig,用
glXGetVisualFromFBConfig提取对应的XVisualInfo - 对比该XVisualInfo的
visualid与你已有的CNFGVisualID,找到匹配的FBConfig
修改后的完整代码示例
int attribs[] = { GLX_RGBA, GLX_DOUBLEBUFFER, GLX_RED_SIZE, 1, GLX_GREEN_SIZE, 1, GLX_BLUE_SIZE, 1, GLX_DEPTH_SIZE, 1, None }; XVisualInfo * vis = glXChooseVisual(CNFGDisplay, screen, attribs); CNFGVisual = vis->visual; CNFGVisualID = vis->visualid; CNFGWinAtt.depth = vis->depth; CNFGCtx = glXCreateContext( CNFGDisplay, vis, NULL, True ); // 新增:获取对应GLXFBConfig的代码 GLXFBConfig target_fbc = NULL; int fbcount; GLXFBConfig* fbc_list = glXChooseFBConfig(CNFGDisplay, screen, attribs, &fbcount); if (fbc_list != NULL) { for (int i = 0; i < fbcount; i++) { XVisualInfo* fbc_vis = glXGetVisualFromFBConfig(CNFGDisplay, fbc_list[i]); if (fbc_vis != NULL) { if (fbc_vis->visualid == CNFGVisualID) { target_fbc = fbc_list[i]; XFree(fbc_vis); break; } XFree(fbc_vis); } } XFree(fbc_list); } // 此时target_fbc就是你要的GLXFBConfig,可用于OpenXR初始化 // 记得处理target_fbc为NULL的错误情况
注意事项
- 必须使用完全相同的属性数组调用
glXChooseFBConfig,否则可能枚举到不符合你原Visual配置的FBConfig,导致匹配失败 - 所有通过Xlib/glX分配的资源(
XVisualInfo、FBConfig列表)都要记得用XFree释放,避免内存泄漏 - 如果遍历结束后
target_fbc仍为NULL,说明没有找到匹配的配置,需要检查属性数组是否正确,或者系统是否支持该配置
内容的提问来源于stack exchange,提问作者Charles Lohr
相关产品推荐
相关产品推荐

