如何检测需要但禁用了间接 GLX?

How to detect that Indirect GLX is needed but disabled?

几年来,在 xorg 和其他 X 服务器中默认禁用间接 GLX (IGLX)。我正在编写一个应用程序,如果可用,它将使用 OpenGL,但如果不可用,则可以回退到其他图形。除了尝试和响应错误之外,是否有一种标准方法来检测它是否会失败?

我目前的测试(大约 20 年前写的)只是检查 XOpenDisplayglXQueryExtension 是否有效,但这还不够:稍后调用 glXCreateContext 和其他函数时会失败。

我不想尝试打开一个 window 并检查是否成功,因为当时我想做测试我不知道用户是否需要一个。我的偏好是在启动时进行不可见测试,这样我就可以警告用户他们将要使用备用图形方法。

使用 GLX 创建 OpenGL 上下文不需要 window。 glxCreateContextglxCreateNewContext 都不采用可绘制参数。即使他们这样做了,您也可以创建一个 window 而无需映射它,即使其可见,甚至可以触发 window 管理器的某些操作。

在 X11 中创建 windows 是一个相当便宜的操作,特别是如果 window 的初始大小是 0×0 并且 window 永远不会被映射。您仍然可以执行所有 X11 和 GLX 操作。

所有这一切的结果是,为了测试 OpenGL 功能是否可用,通常的方法是实际尝试创建一个 window 和具有所需属性的 OpenGL 上下文,看看是否这成功。

由于不必映射用于探测的 X11 资源,因此不会创建任何可见的输出;除了不断轮询 X 服务器以获取 window 树之外,甚至 window 管理器也不会注意到(因为这取决于 window 的映射)。

当然,为了保持便宜和快速,此类测试应该直接针对 X11 / Xlib 进行编程,中间没有任何工具包(因为 GLX 是针对 Xlib 编写的,即使使用 Xcb,您也必须使用 Xlib ,至少对于那部分,但无论如何你都必须这样做)。