glXChooseFBConfig w/ GLX_BIND_TO_TEXTURE_*_EXT не возвращает FBConfigs в драйвере Nvidia
У меня есть приложение, которое использует расширение GLX texture_from_pixmap
, для которого требуется цветовой буфер, созданный с использованием FBConfig с GLX_BIND_TO_TEXTURE_RGB_EXT или GLX_BIND_TO_TEXTURE_RGBA_EXT, в соответствии со спецификацией.
Только цветовой буфер растрового изображения GLX, созданный с использованием FBConfig с атрибутом 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.
При использовании glXChooseFBConfig с драйвером Nvidia, соответствующие FBConfigs не возвращаются, и я не могу понять, почему.
Я сделал минимальный пример кода, который воспроизводит эту проблему.
#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
Что я здесь не так делаю?
1 ответ
Процитируем спецификацию:
attrib_list
Specifies a list of attribute/value pairs. The last attribute must be None.
Некоторые реализации GL, такие как Mesa, более разрешительны и принимают GLX_NONE
(0x8000) завершение этого списка атрибутов. Однако драйвер Nvidia этого не делает и возвращает NULL. Указание XlibNone
(0) работает. Это также относится кglXCreatePixmap
.
Я думаю, что проблема связана со списком атрибутов, переданным glXChooseFBConfig (ваш pixmap_config[]).
Я предполагаю, что какой-то драйвер может заполнить обязательные поля значениями по умолчанию, а затем сравнить свои внутренние конфигурации с запрошенными.
Проблема в том, что EXT_texture_from_pixmap
работает только с растровыми изображениями, а не с окнами.
Итак, вы должны установить GLX_DRAWABLE_TYPE
поле с маской, содержащей GLX_PIXMAP_BIT
а не по умолчанию GLX_WINDOW_BIT
,