繁体   English   中英

OpenGL function 加载机制如何工作?

[英]How does the OpenGL function loading mechanism work?

现代 OpenGL (>1.2) 函数必须在运行时加载。 具体如何完成取决于平台,但它似乎总是涉及调用“get-function”,该函数返回指向您请求的 function 的指针。 两个问题:

  1. 谁实现了这个神奇的 get 函数?
  2. 谁实现了它返回的 function(指针)?

让我们以 Linux 和 Mesa3D 为例。

我现在的理解是 Mesa3D 通过 libgl.so 和 gl.h 提供 get-function,它只在用户空间中运行。 实现get-function返回的函数的用户空间端也是Mesa3D,kernel端由GPU驱动实现。 这个对吗?

这意味着(在本例中)像glad/glew/gl3w 这样的加载库直接位于Mesa3D 之上并且除了Mesa3D 之外不与其他人对话?

  1. 谁实现了这个神奇的 get 函数?

这实际上有点棘手,因为这个 function 不是 OpenGL 的一部分,而是特定于平台的 OpenGL 绑定库的一部分。 例如,您在 Win32/ glxGetProcAddress上有wglGetProcAddress ,在 X11 上有elgGetProcAddress ,在 EGL 上有 elgGetProcAddress(多平台,更现代和更灵活的替代方案)。

在 Linux 上,EGL 和 glX 实现是 OpenGL 实现的一部分(例如 mesa,但 nivida 的专有驱动程序带有自己的 glX 和 egl 库),所以您的问题的答案是“Z6785E6B01EF75DB2CF26785E6B01EF71BCF26785E6B01EF75DB25

On windows, the answer is "Microsoft" but that is a meaningless answer as the microsoft function basically only calls some implementor-specific function in the OpenGL ICD (installable client driver), which does the real work, and that one comes from the opengl cousre 的实现者(通常是英特尔、英伟达、AMD,但您甚至可以在 Windows 上运行台面软件光栅化器)。

  1. 谁实现了它返回的 function(指针)?

OpenGL 实现器。 通常,OpenGL 实现是图形驱动程序的一部分。

我现在的理解是 Mesa3D 通过 libgl.so 和 gl.h 提供 get-function,它只在用户空间中运行。 实现get-function返回的函数的用户空间端也是Mesa3D,kernel端由GPU驱动实现。 这个对吗?

Mesa3D 有点特殊,因为它是一个多供应商 OpenGL 实现。 实际上,台面由一些共享前端(其中 forms 是libGL和其他的外部接口)和实用程序功能以及一些特定于供应商的后端组成。 这些 mesa 后端实际上被认为是图形驱动程序的一部分,驱动程序不仅仅是 mesa 与之通信的 kernel 模块。 大量的图形 API(尤其是在 GL 中)是在用户空间中实现的,并且仍然是高度特定于设备的。

这意味着(在本例中)像glad/glew/gl3w 这样的加载库直接位于Mesa3D 之上并且除了Mesa3D 之外不与其他人对话?

或多或少。 真相有点复杂和丑陋。 There are some platforms where the extension function pointer query function is not required to return pointers for functions which are in OpenGL 1.1 core, so most loaders work around this by resorting to GetProcAddress (win32) or dlsym to query those symbols at runtime, so they通常他们也可能在dlopen上使用libdl.so (并在你背后打开 GL lib)。 请注意,这也意味着当您使用像 GLAD 这样的 GL 加载器时,您不必(实际上也不应该)您的项目中手动链接到libGL.so - 无论如何它是在运行时完全加载的,您的程序可以如果用户系统上没有可用的 GL 库,也可以很好地摆脱困境,而不是由于缺少库而导致二进制文件甚至无法启动。

此外,现代 Linux 发行版使用libgvnd供应商中立的 GL 调度方案,这意味着即使您使用 Mesa3D,GL 加载程序实际上也会与 GLvnd 存根对话,后者会在内部将请求路由到您使用的实现(在您的情况下为 mesa3d )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM