Подтвердить что ты не робот

Таинственно недействительный контекст OpenGL в Electron

Я создал движок анимации С++ и OpenGL, поддерживаемый GLX и GLEW, завернутый в модуль Node.js через SWIG. Цель состоит в том, чтобы использовать движок внутри приложения Electron в процессе браузера.

Двигатель выглядит довольно стабильным. Он поддерживает многоконтекст, связывая корректный контекст OpenGL перед всеми соответствующими операциями, проверяя ошибки после почти любой возможной операции и поддерживая довольно большой набор тестов.

За пределами электронного приложения все работает отлично. Однако загадочно, что простые скрипты, которые обычно работают за пределами Electron, терпят неудачу внутри приложения Electron в любом браузере или процессе визуализации.

Симптомы

  • Все, что генерируется glGenX, возвращает 0
  • glGetString(GL_VERSION) возвращает null, after glGetError не возвращает ошибку

Факты

В этом порядке:

  • Контекст OpenGL создается с помощью glXCreateContextAttribsARB с разумной конфигурацией FB. Возвращаемое значение не равно нулю.
  • XSync(display, false) вызывается для ожидания ошибок X. Никакие ошибки не сбой программы, установка обработчика ошибок X не дает никаких результатов.
  • Контекст выполняется с помощью glXMakeCurrent, ошибок, сообщенных glGetError.
  • Контекст прямой, проверяется с помощью glXIsDirect.
  • GLEW инициализируется glewInit, возвращая GLEW_OK.
  • Действия в этом случае происходят в одном потоке. В приложении "Электрон" контекст создается и сразу используется в одном и том же процессе; Создание самого контекста запрашивает версию в рамках одного и того же метода. Те же симптомы до и после приложения Electron "готовы".

Я довольно озадачен этим. Все, что я проверяю, похоже, предполагает, что контекст был создан правильно, но в противном случае он выглядит поврежденным или дисфункциональным.

Что происходит? Что еще я могу проверить?

4b9b3361

Ответ 1

https://github.com/electron/electron/issues/8848 сообщает именно о проблеме с нулевым GL_VERSION и обвиняет электронную версию 1.6.1. Обходной путь состоял в откате к версии 1.4.15.