最近我一直在研究OpenGL图形驱动程序(ICD)如何在Windows上实现OpenGL运行时(opengl32.dll)调用的OpenGL函数。
我知道我可以使用GetProcAddress
来获取 OpenGL 1.0 和 1.1 函数公开的函数指针opengl32.dll
,并且我必须调用wglGetProcAddress
返回GetProcAddress
来获取 OpenGL 1.2+ 函数的上下文相关函数指针。
为了查看 ICD 是否执行 OpenGL 函数,我编写了 opengl32.dll 和 ICD 的包装程序,并让它们在调用函数时打印函数名称。对于 OpenGL 1.2+ 函数,我看到我的测试程序首先调用了wglGetProcAddress
从 opengl32.dll 返回的函数指针,然后我看到它调用了DrvGetProcAddress
从 ICD 返回的函数指针(我为其中一些函数编写了钩子函数)。所以证明这些功能是由显卡驱动实现的。但是对于 OpenGL 1.0 和 1.1 函数,它们具有由 opengl32.dll 公开的 API 符号,当它们尝试通过函数名加载它们时wglGetProcAddress
,opengl32.dll 和ICD 都返回 NULL。DrvGetProcAddress
我也了解到,这两个 GetProcAddress 函数都只用于获取 OpenGL 扩展(OpenGL 1.2 或更高版本)函数的函数指针,但我不确定图形驱动程序现在是否实现了 OpenGL 1.0 和 1.1 函数。如果是这样,opengl32.dll 如何调用 ICD 中的这些函数?