Продолжение для этого вопроса.
Я пытаюсь создать NodeJS собственный аддон, использующий OpenGL.
Я не могу используйте функции OpenGL, потому что CGLGetCurrentContext()
всегда возвращает NULL
.
При попытке создать новый контекст для рисования, CGLChoosePixelFormat
всегда возвращает ошибку kCGLBadConnection
invalid CoreGraphics connection
.
Что меня беспокоит, так это то, что когда я изолирую код, который создает контекст OpenGL, в отдельный CPP проект, он работает! Он просто выдает ошибку, когда я запускаю его внутри NodeJS аддона!
Я создал этот NodeJS собственный проект аддона, чтобы проиллюстрировать мою ошибку: https://github.com/Psidium/node-opengl-context-error-example
Этот код работает при выполнении в автономном проекте и выдает ошибки при запуске внутри NodeJS:
//
// main.cpp
// test_cli
//
// Created by Borges, Gabriel on 4/3/20.
// Copyright © 2020 Psidium. All rights reserved.
//
#include <iostream>
#include <OpenGL/OpenGL.h>
int main(int argc, const char * argv[]) {
std::cout << "Context before creating it: " << CGLGetCurrentContext() << "\n";
CGLContextObj context;
CGLPixelFormatAttribute attributes[2] = {
kCGLPFAAccelerated, // no software rendering
(CGLPixelFormatAttribute) 0
};
CGLPixelFormatObj pix;
CGLError errorCode;
GLint num; // stores the number of possible pixel formats
errorCode = CGLChoosePixelFormat( attributes, &pix, &num );
if (errorCode > 0) {
std::cout << ": Error returned by choosePixelFormat: " << errorCode << "\n";
return 10;
}
errorCode = CGLCreateContext( pix, NULL, &context );
if (errorCode > 0) {
std::cout << ": Error returned by CGLCreateContext: " << errorCode << "\n";
return 10 ;
}
CGLDestroyPixelFormat( pix );
errorCode = CGLSetCurrentContext( context );
if (errorCode > 0) {
std::cout << "Error returned by CGLSetCurrentContext: " << errorCode << "\n";
return 10;
}
std::cout << "Context after being created is: " << CGLGetCurrentContext() << "\n";
return 0;
}
Я уже пробовал:
- Использование
fork()
для создать контекст в подпроцессе (не работает); - Изменение атрибутов
pixelformat
на что-то, что создаст мой контекст (не работает);
У меня есть догадка, что это может иметь какое-то отношение к тому факту, что собственный аддон Node является динамически связанной библиотекой, или, возможно, моя функция OpenGL createContext
может не выполняться в главном потоке (но если это так, то fork()
решил бы это, верно?).