glXChooseFBConfig возвращает NULL

Я пытаюсь настроить фреймбуфер на компьютере без выделенной видеокарты. Только меса GL.

Я пробовал несколько конфигураций FB, но не могу получить ненулевой результат. Тот же код работает на другом компьютере с драйверами nvidia.

OpenGL vendor string: Tungsten Graphics Inc
OpenGL renderer string: Mesa DRI Intel(R) Ivybridge Desktop
OpenGL version string: 3.0 Mesa 8.0.4
OpenGL shading language version string: 1.30

Примеры mesa, которые работают на другом компьютере, также не работают в той же строке glXFBConfig.

Вот соответствующая часть кода

int fbAttribs[] = {
       None
    };

  int numberOfFramebufferConfigurations = 0;
  GLXFBConfig* fbConfigs = glXChooseFBConfig(self->display, DefaultScreen(self->display), fbAttribs, &numberOfFramebufferConfigurations);

Как я уже сказал, я пробовал разные конфигурации, такие как:

   int fbAttribs[NUM_FB_CONFIGS][100] = {
      {
         /* Single buffered, with depth buffer */
         GLX_RENDER_TYPE, GLX_RGBA_BIT,
         GLX_DRAWABLE_TYPE, GLX_PBUFFER_BIT,
         GLX_RED_SIZE, 1,
         GLX_GREEN_SIZE, 1,
         GLX_BLUE_SIZE, 1,
         GLX_DEPTH_SIZE, 1,
         GLX_DOUBLEBUFFER, 0,
         GLX_STENCIL_SIZE, 0,
         None
      },
      {
         /* Double buffered, with depth buffer */
         GLX_RENDER_TYPE, GLX_RGBA_BIT,
         GLX_DRAWABLE_TYPE, GLX_PBUFFER_BIT,
         GLX_RED_SIZE, 1,
         GLX_GREEN_SIZE, 1,
         GLX_BLUE_SIZE, 1,
         GLX_DEPTH_SIZE, 1,
         GLX_DOUBLEBUFFER, 1,
         GLX_STENCIL_SIZE, 0,
         None
      },
      {
         /* Single buffered, without depth buffer */
         GLX_RENDER_TYPE, GLX_RGBA_BIT,
         GLX_DRAWABLE_TYPE, GLX_PBUFFER_BIT,
         GLX_RED_SIZE, 1,
         GLX_GREEN_SIZE, 1,
         GLX_BLUE_SIZE, 1,
         GLX_DEPTH_SIZE, 0,
         GLX_DOUBLEBUFFER, 0,
         GLX_STENCIL_SIZE, 0,
         None
      },
      {
         /* Double buffered, without depth buffer */
         GLX_RENDER_TYPE, GLX_RGBA_BIT,
         GLX_DRAWABLE_TYPE, GLX_PBUFFER_BIT,
               GLX_RENDER_TYPE, GLX_RGBA_BIT,
         GLX_DRAWABLE_TYPE, GLX_PBUFFER_BIT,
         GLX_RED_SIZE, 1,
         GLX_GREEN_SIZE, 1,
         GLX_BLUE_SIZE, 1,
         GLX_DEPTH_SIZE, 0,
         GLX_DOUBLEBUFFER, 1,
         GLX_STENCIL_SIZE, 0,
         None
      }
   };
  GLX_RED_SIZE, 1,
         GLX_GREEN_SIZE, 1,
         GLX_BLUE_SIZE, 1,
         GLX_DEPTH_SIZE, 0,
         GLX_DOUBLEBUFFER, 1,
         GLX_STENCIL_SIZE, 0,
         None
      }
   };

person hakura    schedule 16.10.2013    source источник


Ответы (2)


Вы проверили, что GLX действительно доступен? Также для работы glXChooseFBConfig сервер должен поддерживать расширение Render. И GLX, и Render в наши дни широко поддерживаются. Но могут и не быть, так что надо проверять. Используйте glXQueryExtension для проверки GLX и XRenderQueryExtension для проверки Render.

person datenwolf    schedule 16.10.2013

Отвечая на мой собственный вопрос с решением.

На самом деле это оказалось контекстом OpenGL, не поддерживающим необходимые расширения. В этом случае я подключался по ssh (с -X) к машине и запускал двоичный файл, который выполняет все вычисления OpenGL. В таких случаях хосты или OpenGL клиента могут использоваться в зависимости от переменной $DISPLAY. Установка переменной DISPLAY на :0.0 означала использование OpenGL хоста, что решило проблемы.

person hakura    schedule 19.10.2013
comment
Я установил переменную DISPLAY в :0 с export DISPLAY=:0. Ранее он был установлен на :1. Я также подключаюсь к машине по ssh, хотя я не указал опцию -X. Нужно ли мне? В любом случае glXChooseFBConfig все равно не работает. - person richizy; 01.09.2014