glXChooseFBConfig w/ GLX_BIND_TO_TEXTURE_*_EXT 在 Nvidia 驱动程序上不返回 FBConfigs

glXChooseFBConfig w/ GLX_BIND_TO_TEXTURE_*_EXT returning no FBConfigs on Nvidia driver

我有一个使用 GLX 扩展 texture_from_pixmap 的应用程序,根据规范,它需要使用具有 GLX_BIND_TO_TEXTURE_RGB_EXT 或 GLX_BIND_TO_TEXTURE_RGBA_EXT 的 FBConfig 创建的颜色缓冲区。

Only a color buffer of a GLX pixmap created using an FBConfig with attribute GLX_BIND_TO_TEXTURE_RGB_EXT or GLX_BIND_TO_TEXTURE_RGBA_EXT set to TRUE can be bound as a texture.

https://www.khronos.org/registry/OpenGL/extensions/EXT/GLX_EXT_texture_from_pixmap.txt

我的应用程序执行此操作,并且可以与 Mesa 和 Intel i965 驱动程序一起正常工作,但不能与专有的 Nvidia 驱动程序一起使用。

在 Nvidia 驱动程序中使用 glXChooseFBConfig 时,没有返回匹配的 FBConfig,我似乎不明白为什么。

我制作了一个重现此问题的最小代码示例。

#include <stdio.h>

#include <X11/Xlib.h>
#include <GL/glx.h>

int main()
{
        Display *display = XOpenDisplay(NULL);

        if (!display) {
                printf("Unable to connect to display.\n");
                return 1;
        }

        int pixmap_config[] = {
                GLX_BIND_TO_TEXTURE_RGB_EXT, True,
                GLX_NONE
        };

        int c = 0;
        GLXFBConfig *configs = glXChooseFBConfig(display, 0, pixmap_config, &c);
        if (!configs) {
                printf("No appropriate GLX FBConfig available!\n");
        } else {
                printf("Number of matching configs: %i\n", c);
        }

        return 0;
}

在我使用专有驱动程序测试的任何 Nvidia 显卡上,我得到:

No appropriate GLX FBConfig available!

在 Mesa 上使用英特尔显卡,我得到:

Number of matching configs: 82

我做错了什么?

我认为问题出在传递给 glXChooseFBConfig(您的 pixmap_config[])的属性列表中。

我猜某些驱动程序可能会用默认值填充必填字段,然后将其内部配置与请求的配置进行比较。

问题是 EXT_texture_from_pixmap 仅适用于像素图,不适用于 windows。
因此,您应该使用包含 GLX_PIXMAP_BIT 的掩码设置 GLX_DRAWABLE_TYPE 字段,而不是默认的 GLX_WINDOW_BIT.

引用 spec:

attrib_list
    Specifies a list of attribute/value pairs. The last attribute must be None.

一些 GL 实现,例如 Mesa,更加宽松,并且将接受 GLX_NONE (0x8000) 终止此属性列表。但是,Nvidia 驱动程序不会,并且会 return NULL。指定 Xlib 的 None (0) 有效。 glXCreatePixmap.

也是如此