linux - wglGetProcAddress/glXGetProcAddress 如何与图形驱动程序通信?

标签 linux winapi opengl driver

当我在 Windows 10 上构建 OpenGL 应用程序时,我必须链接到 opengl32.lib。我使用 GLEW 加载 OpenGL 函数。 GLEW 内部使用 wglGetProcAddress()opengl32.lib 仅提供对 OpenGL 1.1 的支持。当 wglGetProcAddress() 请求一些更新的 OpenGL 功能时,opengl32.lib 如何工作?它是否充当代理并与图形驱动程序通信,例如 OpenGL nvidia 库?

它在 Linux 上的工作方式是否相同?

最佳答案

在 Windows 上,您有一个所谓的 OpenGL ICD(= 可安装客户端驱动程序)。本质上,对于 OpenGL-1.1 规范定义的每个函数,此 ICD 都提供了一个适当的实现,该实现由 opengl32.dll 基于当前事件的 OpenGL 上下文(即,您可以安装多个 ICD,提供服务)同一程序中的不同 OpenGL 上下文)。

wglGetProcAddress 函数是该集合的一部分,这就是为什么您必须在 Windows 上为每个上下文单独加载扩展/更新函数的原因。因此,本质上,当您调用 wglGetProcAddress 时,它只会调用 ICD 的实际 ...GetProcAddress

在 Linux 上我们从来没有 ICD 的概念。几年前,我们终于得到了 GLvnd(GL 供应商中立调度),它本质上为 Linux 提供了类似 ICD 的机制。然而,GLX 规范明确指出,通过 glXGetProcAddress 获取的地址对于所有 OpenGL 上下文都是不变且相同的。这意味着,基于上下文分派(dispatch)函数是 OpenGL 实现的任务(而不是中间层)。 Mesa 开发人员在此描述:https://docs.mesa3d.org/dispatch.html

简而言之:一团糟。

关于linux - wglGetProcAddress/glXGetProcAddress 如何与图形驱动程序通信?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66244387/

相关文章:

c# - 在 Windows 消息上设置 Hook

windows - VC++获取子进程的环境变量

opengl - 将多个四边形条转换为单个四边形 strip

c++ - OpenGL 图像加载 64 位深度

android - 直接使用 adb 无法识别我的平板电脑,但 eclipse 可以

c++ - 在 MFC 中创建标尺栏

linux - 为什么使用 "set var = value"采购脚本会破坏 $@?

c++ - opengl顶点颜色插值

c++ - ctags 忽略 libc6、libstdc++ 和 boost 的列表

c - C 中的 Perl alarm() 等价物?