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,

Другие вопросы по тегам