gpt4 book ai didi

opengl - glXGetProcAddress 为以 "gl"开头的任何 procName 返回非空值

转载 作者:行者123 更新时间:2023-12-04 23:41:50 25 4
gpt4 key购买 nike

当我发现以下代码及其许多变体产生非空内存地址时,我感到非常惊讶。我尝试的变化包括:

  • 调用 glXGetProcAddressARB而不是 glXGetProcAddress .
  • 有一个事件的 GL 上下文,用 GLFW 创建。
  • 使用 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 .

    我对这种行为感到非常惊讶,因为 glottismanny应该同样不存在,我原以为两者都会产生 NULL指针。

    资源

    这是摘自 glXGetProcAddress文档。

    Notes

    A NULL pointer is returned if function requested is not suported in the implementation being queried.

    GLU functions are not queryable due to the fact that the library may not be loaded at the time of the query.



    Full document

    More info on this topic

    最佳答案

    好吧,从正确性的角度来看,您观察到的行为是合规的。您不能断定非 NULL glXGetProcAddress 的返回值(或其他)暗示该功能存在或可以使用。您必须始终查询扩展字符串。尝试获取扩展字符串未宣传的函数的函数指针(或上下文的核心 GL 版本暗示它的存在)在概念上将是未定义的行为。

    您确实引用了 reference page on glXGetProcAddress .不幸的是,这些引用页面是出了名的不精确、不完整,有时甚至是完全错误的。在这种情况下,措辞至少是不幸的。

    我通常建议使用官方规范来查找此类详细信息。在这种情况下,GLX 1.4 specification将是相关文件。第 3.3.12 节“获取扩展函数指针”说明了有关 glXGetProcAddress 的内容(强调我的):

    A return value of NULL indicates that the specified function does not exist for the implementation.

    A non-NULL return value for glXGetProcAddress does not guarantee that an extension function is actually supported at runtime. The client must also query glGetString(GL_EXTENSIONS) or glXQueryExtensionsString to determine if an extension is supported by a particular context. [...]

    glXGetProcAddress may be queried for all of the following functions:

    • All GL and GLX extension functions supported by the implementation (whether those extensions are supported by the current context or not).
    • All core (non-extension) functions in GL and GLX from version 1.0 up to and including the versions of those specifications supported by the implementation, as determined by glGetString(GL_VERSION) and glXQueryVersion queries.


    看起来 Mesa3D 实现实际上能够为每个以 gl 开始的查询函数动态生成一些 stub 。 .

    查看当前版本 /src/mapi/glapi/glapi_getproc.c 揭示功能 _glapi_get_proc_address()这样做:
    /**
    * Return pointer to the named function. If the function name isn't found
    * in the name of static functions, try generating a new API entrypoint on
    * the fly with assembly language.
    */
    _glapi_proc
    _glapi_get_proc_address(const char *funcName)
    {
    _glapi_proc func;
    struct _glapi_function * entry;

    init_glapi_relocs_once();

    #ifdef MANGLE
    /* skip the prefix on the name */
    if (funcName[1] != 'g' || funcName[2] != 'l')
    return NULL;
    #else
    if (funcName[0] != 'g' || funcName[1] != 'l')
    return NULL;
    #endif

    /* search extension functions first */
    func = get_extension_proc_address(funcName);
    if (func)
    return func;

    /* search static functions */
    func = get_static_proc_address(funcName);
    if (func)
    return func;

    /* generate entrypoint, dispatch offset must be filled in by the driver */
    entry = add_function_name(funcName);
    if (entry == NULL)
    return NULL;

    return entry->dispatch_stub;
    }

    所以它实际上检查 gl前缀,如果函数未知,它会动态地为它创建一个 stub 。稍后,当加载硬件后端驱动程序时,它可能会注册 gl 函数,并且 stub 代码会将调用转发给驱动程序(如果它提供了实现)。

    关于opengl - glXGetProcAddress 为以 "gl"开头的任何 procName 返回非空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35118628/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com