我有一个使用GLX扩展名texture_from_pixmap
的应用程序,该应用程序需要根据规范使用FBConfig和GLX_BIND_TO_TEXTURE_RGB_EXT或GLX_BIND_TO_TEXTURE_RGBA_EXT创建的颜色缓冲区。
仅使用通过FBConfig创建的GLX像素图的颜色缓冲区 属性GLX_BIND_TO_TEXTURE_RGB_EXT或GLX_BIND_TO_TEXTURE_RGBA_EXT 设置为TRUE可以绑定为纹理。
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显卡上,我得到:
没有合适的GLX FBConfig!
将Intel Graphics与Mesa结合使用,我得到:
匹配配置数:82
我在这里做什么错了?
答案 0 :(得分:0)
我认为问题出在传递给glXChooseFBConfig的属性列表(您的pixmap_config [])上。
我想某些驱动程序可能会用默认值填充必填字段,然后将其内部配置与请求的内部配置进行比较。
问题在于EXT_texture_from_pixmap
仅适用于像素图,不适用于Windows。
因此,您应该在GLX_DRAWABLE_TYPE
字段中设置一个包含GLX_PIXMAP_BIT
而不是默认GLX_WINDOW_BIT
的掩码。
答案 1 :(得分:0)
引用spec:
attrib_list
Specifies a list of attribute/value pairs. The last attribute must be None.
某些GL实现(例如Mesa)更宽松,它们将接受GLX_NONE
(0x8000)终止此属性列表。但是,Nvidia驱动程序不会,并且将返回NULL。指定Xlib的None
(0)是可行的。 glXCreatePixmap
也是这种情况。