【发布时间】:2016-01-31 19:50:40
【问题描述】:
当我发现以下代码及其许多变体产生非空内存地址时,我感到非常惊讶。我尝试过的变体包括:
- 调用
glXGetProcAddressARB而不是glXGetProcAddress。 - 拥有使用 GLFW 创建的活动 GL 上下文。
-
使用 GLFW 提供的跨平台替代方案:
glfwGetProcAddress。#include <GL/glx.h> #include <stdio.h> int main(int argc, char *argv[]) { void *ptr; ptr = glXGetProcAddress((const GLubyte *)"glottis"); printf("ptr: %x\n", ptr); return 0; }
程序使用-lGL(和-lglfw,如果需要)编译,没有警告也没有错误。
获得0 输出(NULL 指针)的唯一方法是询问名称不以gl 开头的函数的地址,例如manny。
我对这种行为感到非常惊讶,因为 glottis 和 manny 应该同样不存在,而且我本来希望两者都会产生一个 NULL 指针。
资源
这是glXGetProcAddress 文档的摘录。
注意事项
如果请求的函数不支持,则返回 NULL 指针 正在查询的实现。
GLU 函数不可查询,因为库可能 查询时未加载。
【问题讨论】:
-
嗯,从正确性的角度来看,您观察到的行为是合规的。您不能断定
glXGetProcAddress(或其他)的非空返回值意味着该函数存在或可以使用。您必须始终查询扩展字符串。尝试获取扩展未公布(或核心 GL 版本隐含)的函数的函数指针在概念上将是未定义的行为。但是,我确实发现观察到的行为对于现实世界的实现来说仍然有点奇怪。您正在尝试使用哪种实现方式?我在 nvidia 和 mesa (llvmpipe) 上得到 0。 -
@derhass:你应该把这个作为答案。
-
@derhass:谢谢。我担心是这种情况。我在 Arch Linux 上使用 Mesa(mesa 11.0.3-1,mesa-libgl 11.0.3-1)。升级到 mesa 11.1.1-1 似乎无法解决问题。事实上,在我的生产代码中,我使用
glfwExtensionSupported来检查扩展支持;然而,一个错字让我注意到了这种行为,我决定召集 StackOverflow 的 GL 专家。请把评论变成答案,我会接受的。