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
.
也是如此
我有一个使用 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
.