【问题标题】:How does wglGetProcAddress/glXGetProcAddress communicate with a graphics driver?wglGetProcAddress/glXGetProcAddress 如何与图形驱动程序通信?
【发布时间】:2021-02-17 14:52:01
【问题描述】:

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

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

【问题讨论】:

  • wglGetProcAddress 大概使用了基于运行时动态链接的方案。运行时动态链接不依赖于导入库,而是在实现模块中查询导出的符号。
  • 我只链接到 opengl32.lib/dll。 opengl32.dll 是否链接到专有驱动程序? (例如英伟达)

标签: linux winapi opengl driver


【解决方案1】:

在 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 上下文都是不变且相同的。这意味着,基于上下文调度函数是 OpenGL 实现的任务(而不是中间层)。 Mesa 开发人员在此处对其进行了描述:https://docs.mesa3d.org/dispatch.html

简而言之:一团糟。

【讨论】:

    猜你喜欢
    • 2020-07-18
    • 1970-01-01
    • 2021-11-20
    • 2016-10-01
    • 2011-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-17
    相关资源
    最近更新 更多