wglGetProcAddress/glXGetProcAddress 如何与图形驱动程序通信?
How does wglGetProcAddress/glXGetProcAddress communicate with a graphics driver?
当我在 Windows 10 上构建 OpenGL 应用程序时,我必须 link 到 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,在相同的程序)。
wglGetProcAddress
函数是该集合的一部分,这就是为什么您必须在 Windows 上为每个上下文分别加载 extending/newer 函数的原因。所以基本上当你调用 wglGetProcAddress
时,它只会调用 ICD 的实际 ...GetProcAddress
。
在 Linux 我们从来没有 ICD 的概念。几年前,我们终于得到了 GLvnd(GL 供应商中立调度),它本质上提供了 Linux 类似 ICD 的机制。然而,GLX 规范明确指出,通过 glXGetProcAddress
获得的地址对于所有 OpenGL 上下文都是不变且相同的。这意味着,根据上下文分派函数是 OpenGL 实现的任务(而不是中间层)。 Mesa 开发人员在此处对其进行了描述:https://docs.mesa3d.org/dispatch.html
简而言之:一团糟。
当我在 Windows 10 上构建 OpenGL 应用程序时,我必须 link 到 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,在相同的程序)。
wglGetProcAddress
函数是该集合的一部分,这就是为什么您必须在 Windows 上为每个上下文分别加载 extending/newer 函数的原因。所以基本上当你调用 wglGetProcAddress
时,它只会调用 ICD 的实际 ...GetProcAddress
。
在 Linux 我们从来没有 ICD 的概念。几年前,我们终于得到了 GLvnd(GL 供应商中立调度),它本质上提供了 Linux 类似 ICD 的机制。然而,GLX 规范明确指出,通过 glXGetProcAddress
获得的地址对于所有 OpenGL 上下文都是不变且相同的。这意味着,根据上下文分派函数是 OpenGL 实现的任务(而不是中间层)。 Mesa 开发人员在此处对其进行了描述:https://docs.mesa3d.org/dispatch.html
简而言之:一团糟。