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