最近我一直在研究 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
返回的函数指针,然后我看到它调用了 DrvGetProcAddress
返回的函数指针ICD(我为其中一些函数编写了 Hook 函数)。所以证明这些功能都是由显卡驱动实现的。但是对于 OpenGL 1.0 和 1.1 函数,它们具有由 opengl32.dll 公开的 API 符号,当它们尝试加载它们时,opengl32.dll 的 wglGetProcAddress
和 ICD 的 DrvGetProcAddress
都返回 NULL通过它们的函数名称。
我也明白这两个GetProcAddress函数只是用来获取OpenGL扩展(OpenGL 1.2或更高版本)函数的函数指针,但我不确定图形驱动程序现在是否实现了OpenGL 1.0和1.1函数。如果是,那么 opengl32.dll 如何调用 ICD 中的这些函数?
最佳答案
ICD 提供了一个 dispatch table对于所有 OpenGL 1.0 和 1.1 函数以及从 opengl32.dll
导出的函数,只需跳转到 ICD 中的入口点。 Here is how ReactOS does this .
关于windows - Windows 上的 OpenGL ICD 如何加载 OpenGL 1.0 和 1.1 功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65734384/