官方XCB文档告诉我们using OpenGL purely with XCB is impossible:还必须使用Xlib。
Bart Massey(XCB的创始人)的This post并未暗示这应该是不可能的。但我确定我错过了什么。
我花了好几个小时浏览xcb/glx.h
,这是一个组织得很好的here。在我看来,它就像一个完整的API。但我无法让它发挥作用。
xcb/glx.h
的目的是什么?(注意:这是了解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_visual
和0xa7
。它们正是Xlib / GLX例程(实际工作)返回的原因,所以我知道我选择的帧缓冲配置很好。
所以,问题似乎发生在0x24
和xcb_glx_create_window
之间...
xcb_glx_make_context_current
答案 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:
来自[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_*
。我当然在这上面浪费了足够多的时间,所以你不必?。