You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在GLX中获取当前对应的GLXFBConfig?

从XVisualInfo获取对应的GLXFBConfig方法

GLX确实没有提供直接从Visual反向获取GLXFBConfig的API,但可以通过枚举+匹配的方式实现,核心思路是用和你创建Visual时相同的属性枚举所有GLXFBConfig,再逐个对比找到对应Visual的配置。

具体实现步骤

  1. 用你调用glXChooseVisual时的相同属性数组,调用glXChooseFBConfig获取所有符合条件的FBConfig列表
  2. 遍历每个FBConfig,用glXGetVisualFromFBConfig提取对应的XVisualInfo
  3. 对比该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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 08:10:21