如果“纯XCB”OpenGL是不可能的,那么在xcb / glx.h中找到的XCB / GLX API的用途是什么?

时间:2016-12-09 21:16:23

标签: linux x11 framebuffer xcb glx

官方XCB文档告诉我们using OpenGL purely with XCB is impossible:还必须使用Xlib。

Bart Massey(XCB的创始人)的

This post并未暗示这应该是不可能的。但我确定我错过了什么。

我花了好几个小时浏览xcb/glx.h,这是一个组织得很好的here。在我看来,它就像一个完整的API。但我无法让它发挥作用。

问题

  1. XCB / GLX API无用吗? xcb/glx.h的目的是什么?
  2. 如何使用API​​?
  3. (注意:这是了解XCB如何运作的持续努力的一部分。)

    相关SO thread

    次要的,啰嗦的东西

    如果有人愿意对此进行抨击,请点击XCB邮件列表中原始帖子的来源,将其删除并放入单个文件中。

    您会注意到xcb_glx_make_context_current返回错误169 (不知道这意味着什么),但仅当 xcb_glx_create_window需要{{1}和0最后两个参数。这些参数涉及一系列属性,似乎由函数NULL返回,但我无法弄清楚如何使用它......

    xcb_glx_create_window_attribs之前的长辅助函数仅表示两个返回两个整数int main() xcb_glx_fbconfig_t fbconfig,对应于第一个“匹配”帧缓冲配置。在我的平台上,这些是xcb_visualid_t glx_visual0xa7。它们正是Xlib / GLX例程(实际工作)返回的原因,所以我知道我选择的帧缓冲配置很好。

    所以,问题似乎发生在0x24xcb_glx_create_window之间...

    xcb_glx_make_context_current

2 个答案:

答案 0 :(得分:3)

这里需要了解的重要事项是XCB函数直接映射到X11协议请求。这意味着xcb_glx_ *函数直接映射到X11 GLX协议请求。见"第4章"在https://www.khronos.org/registry/OpenGL/specs/gl/glx1.4.pdf中列出了所有可用的GLX请求。例如,glAreTexturesResident从xcb / glx.h(https://xcb.freedesktop.org/manual/glx_8h_source.html)映射到xcb_glx_are_textures_resident_ * API。在Khronos规范中,您可以阅读请求的内容。

  

xcb / glx.h的目的是什么?

XCB-GLX仅与X服务器通信,执行任何硬件初始化或触摸OpenGL客户端状态。因此,XCB-GLX不能用作GLX API的替代品。 [1]

硬件初始化和其他GL内容由openGL lib完成。这就是"另一半"规范的实施。在Linux上,libGL由mesa(https://cgit.freedesktop.org/mesa/mesa/tree/src/glx)提供。你可以看到glx目录中的文件包含Xlib.h,所以我想这就是Xlib依赖的来源。这解释了" GLX API与Xlib紧密结合。因此,X Windows上的OpenGL应用程序必须使用Xlib,因此不能仅使用XCB。" [1]。

  

XCB / GLX API无用吗?

虽然XCB-GLX API对最终用户XCB应用程序开发人员没什么价值,但它可以用于开发基于XCB的新OpenGL和GLX实现。 XCB可以提高OpenGL库的速度和质量。 [1]

为了获得纯XCB GLX,有人需要在openGL lib中重新实现GLX:

  • 公开基于XCB的API以初始化硬件等。
  • 应该使用xcb_glx API与X服务器通信,而不是Xlib。

来自[1]的文档说" GLX系统有两个角色,它与X服务器通信并初始化客户端和硬件状态。"

xcb-glx负责沟通角色。另一个角色(基于XCB的OpenGL和GLX实现)目前尚未实现,也不太可能实现。

" GLX API是根据Xlib指定的,glX函数使用Xlib Displays,Windows,Visuals等.GLX实现也是使用Xlib构建的。" (参见libGL.so的导出符号)。为了完成第二个角色,我们需要一个使用XCB连接,窗口,视觉效果的相同API。

[1] https://xcb.freedesktop.org/opengl/

免责声明:这是我对收集的理解。

答案 1 :(得分:1)

为了使接受的答案更加明确:xcb_glx_* 函数完全没有用。不要使用它们,甚至不要在文件中包含 xcb/glx.h(示例 on the xcb website 也不包含它们)。它们将不起作用,因为供应商没有为它们实现全部功能。他们的存在是因为他们决定开始为 xcb 实现此功能,而不仅仅是为 Xlib 实现此功能。任何时候您需要 glx 函数时,您的唯一选项是 Xlib,即使某些 xcb 函数恰好可以工作并提供相同的输出。

显示的示例代码可能在不同程度上起作用。在我的电脑上,窗口打开但上下文无效。您可能会获得更多或更少的功能。在任何情况下,您的代码几乎肯定不会在其他任何地方工作,因此请根本不要使用 xcb_glx_*。我当然在这上面浪费了足够多的时间,所以你不必?。