我们都知道 Windows 提供了一个通用的 OpenGL 驱动程序。但一些显卡供应商提供特定的openGL 驱动程序。我想知道操作系统如何选择要使用的驱动程序?
2 回答
有 WGL 函数用于获取指向较新 OpenGL 的适当函数的指针。Windows 在创建上下文时任意选择 GPU。
因此,例如,当您请求 4.3 核心上下文时,它会查看驱动程序列表,表示该驱动程序将处理此特定上下文,然后进行所有wgl
调用,以便它们从特定驱动程序的 dll 加载适当的函数。
解释其工作原理的最简单平台是 Microsoft Windows。它们具有“可安装客户端驱动程序”(ICD) 模型,其中 Windows SDK 提供最低限度的 OpenGL 功能 (OpenGL 1.1) 和可扩展窗口系统接口 (WGL)。
在 Microsoft Windows 中使用 WGL API 创建上下文时,可以枚举特定设备的所有像素格式。一些像素格式将被硬件加速,一些将使用备用软件 OpenGL 1.1 参考实现。如果您获得了硬件加速格式,您的所有 OpenGL 命令都将由显卡驱动程序处理,并且您将拥有一组在参考 (1.1) 实现中不可用的 GL 和 WGL 扩展。
这就是为什么必须通过 Microsoft Windows 上的扩展加载来处理这么多现代 OpenGL 的原因,在最低级别您只能获得 OpenGL 1.1,对于任何更新的版本,您必须向驱动程序询问您想要的函数的地址利用。
许多平台在硬件/软件共存方面都有类似的系统。Mac OS X 甚至更棘手,因为您可以从硬件加速的 OpenGL 实现开始,但调用错误的函数(无法在已安装 GPU 上的硬件中实现的函数),它会让您脱离“快速路径”并回退到软件。
然而,Mac OS X 的好处在于,这种回退只适用于流水线的各个阶段。只要一切都可以在硬件中实现,它将在下一阶段回到硬件加速。美妙之处在于,在 OS X 中,OpenGL 的软件实现是完整的(例如,3.2 上下文将支持整个 OpenGL 3.2 功能集,即使这样做需要部分/完整的软件实现)。如果 GPU 不支持某些东西,你不会失去功能,只是很多性能。这与 Windows 形成了巨大的对比,现代 OpenGL 都没有软件回退。