![](/img/trans.png)
[英]Can't create OpenCL context sharing with EGL/OpenGLES context
[英]Why can't I create a headless OpenGl context with EGL?
我目前正在開發需要無頭opengl上下文的程序。 理想情況下,可以在沒有X服務器的情況下在Linux上運行。 我的研究告訴我,EGL是執行此操作的唯一方法(請告訴我是否還有另一種方法,因為我非常喜歡C ++ API而不是像EGL這樣的C api)。 通過閱讀本教程和EGL參考,我以最小和完整示例的形式提出了以下代碼:
#include <EGL/egl.h>
#include <glad/glad.h>
#include <iostream>
#include <exception>
class GlException : public std::exception{
public:
GlException(const std::string &message) : m_message(message) {}
const char *what() const noexcept override { return m_message.c_str(); }
private:
std::string m_message;
};
void createOpenGlContext() {
constexpr EGLint configAttribs[] = {
EGL_SURFACE_TYPE, EGL_PBUFFER_BIT,
EGL_BLUE_SIZE, 8,
EGL_GREEN_SIZE, 8,
EGL_RED_SIZE, 8,
EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT,
EGL_NONE
};
constexpr EGLint pbufferAttribs[] = {
EGL_WIDTH, 1600,
EGL_HEIGHT, 900,
EGL_NONE,
};
EGLDisplay m_display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
EGLBoolean result = eglInitialize(m_display, nullptr, nullptr);
if(result != EGL_TRUE){
switch(eglGetError()){
case EGL_BAD_DISPLAY:
throw GlException("Failed to initialize EGL Display: EGL_BAD_DISPLAY");
case EGL_NOT_INITIALIZED:
throw GlException("Failed to initialize EGL Display: EGL_NOT_INITIALIZED");
default:
throw GlException("Failed to initialize EGL Display: unknown error");
}
}
EGLint numConfigs;
EGLConfig eglConfig;
result = eglChooseConfig(m_display, configAttribs, &eglConfig, 1, &numConfigs);
if(result != EGL_TRUE){
switch(eglGetError()){
case EGL_BAD_DISPLAY:
throw GlException("Failed to configure EGL Display: EGL_BAD_DISPLAY");
case EGL_BAD_ATTRIBUTE:
throw GlException("Failed to configure EGL Display: EGL_BAD_ATTRIBUTE");
case EGL_NOT_INITIALIZED:
throw GlException("Failed to configure EGL Display: EGL_NOT_INITIALIZED");
case EGL_BAD_PARAMETER:
throw GlException("Failed to configure EGL Display: EGL_BAD_PARAMETER");
default:
throw GlException("Failed to configure EGL Display: unknown error");
}
}
EGLSurface surface = eglCreatePbufferSurface(m_display, eglConfig, pbufferAttribs);
eglBindAPI(EGL_OPENGL_API);
EGLContext context = eglCreateContext(m_display, eglConfig, EGL_NO_CONTEXT, nullptr);
}
int main(){
createOpenGlContext();
if(!gladLoadGL()){
std::cerr << "Failed to load OpenGl function pointers" << std::endl;
return -1;
}
return 0;
}
當我在該代碼中調用gladLoadGl
時,它失敗了,可以通過其返回值確定,這表明盡管幾乎完全使用了Nvidia博客中的代碼,但尚未創建上下文(大概是Nvidia知道他們正在使用OpenGl。) 。 我試圖用我偏愛的搜索引擎找到其他人,但遇到相同的錯誤,但沒有發現有用的信息。 我的代碼有什么問題?
我正在使用此配置。 我正在使用完全更新的Arch Linux。 我有一台Gtx 1070,帶有來自Nvidia的最新驅動程序。 當在可用的X服務器上運行時,以上代碼失敗。 我沒有在無頭的環境中測試過它。
@GM的建議起作用了,在現有的createOpenGlContext
函數解決了問題之前,添加了對eglMakeCurrent的調用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.