Linux 使用eGlinilize/使用不带X11的OpenGL分割错误
我正在尝试使用OpenGL并将输出直接写入Imx6处理器(cubox)上的帧缓冲区 原因是我试图避免使用X11 我使用了来自的一个示例应用程序 我修改了代码,使其不包含任何X11头文件或窗口创建函数,并替换了 surface=eglCreatePixmapSurface(显示,配置,(EGLNativePixmapType)Hwnd,NULL); 使用surface=eglCreatePbufferSurface(显示、配置、surfaceAttribs) 然后我使用glReadPixels(..)将OpenGl像素直接输出到帧缓冲区 当我使用VisualGDB运行应用程序时,应用程序运行良好,其输出通过写入/dev/fb0直接显示在屏幕上 但是,当我使用./OpenGL\u Test\u IMX从控制台运行时,我得到以下错误:Linux 使用eGlinilize/使用不带X11的OpenGL分割错误,linux,opengl,x11,egl,Linux,Opengl,X11,Egl,我正在尝试使用OpenGL并将输出直接写入Imx6处理器(cubox)上的帧缓冲区 原因是我试图避免使用X11 我使用了来自的一个示例应用程序 我修改了代码,使其不包含任何X11头文件或窗口创建函数,并替换了 surface=eglCreatePixmapSurface(显示,配置,(EGLNativePixmapType)Hwnd,NULL); 使用surface=eglCreatePbufferSurface(显示、配置、surfaceAttribs) 然后我使用glReadPixels(.
The framebuffer device was opened successfully.
The framebuffer device was opened successfully.
1920x1200, 32bpp
The framebuffer device was mapped to memory successfully.
libEGL warning: DRI2: xcb_connect failed
libEGL warning: DRI2: xcb_connect failed
libEGL warning: GLX: XOpenDisplay failed
Segmentation fault
下面显示了用于我的Egl初始化的代码。我进行了错误检查,以缩短它
eglinitalize(display,&majorVersion,&minorVersion)上的代码失败
分段错误是eglGetError()的输出
我的最后一个问题是运行OpenGL是否需要EGL,或者是否可以运行OpenGL并将其写入内存位置
如果在没有X11的情况下无法运行,我如何启动最小的(例如:Xorg服务器)并让它将其用作上下文?有人能提供一些帮助(或命令)来说明如何使用X11上下文启动程序吗
也许我没有正确启动应用程序?例如,我是否需要事先启动EGL服务器
最后,当我从VisualGDB启动应用程序时,这里有一个用于所有正在运行的进程的pastebin,当我没有启动应用程序时,这里有一个pastebin,
我注意到了一些差异,但我没有看到使用X11上下文启动应用程序所需的任何特定内容 是一个使用gbm表面作为后端的工作示例,它使用libgbm和libdrm来启动eglinitalize所需的显示。
EGLBoolean CreateEGLContext(EGLNativeWindowType hWnd, EGLDisplay* eglDisplay,
EGLContext* eglContext, EGLSurface* eglSurface,
EGLint attribList[])
{
EGLint numConfigs;
EGLint majorVersion;
EGLint minorVersion;
EGLDisplay display;
EGLContext context;
EGLSurface surface;
EGLConfig config;
EGLint contextAttribs[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE, EGL_NONE };
// Get Display
display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
// Initialize EGL
if (!eglInitialize(display, &majorVersion, &minorVersion))
{
printf(eglGetError());
return EGL_FALSE;
}
// Get configs
eglGetConfigs(display, NULL, 0, &numConfigs)
// Choose config
eglChooseConfig(display, attribList, &config, 1, &numConfigs)
int surfaceAttribs[] = {
EGL_WIDTH, 1900,
EGL_HEIGHT, 1088,
EGL_NONE
};
surface = eglCreatePbufferSurface(display, config, surfaceAttribs);
//surface = eglCreatePixmapSurface(display, config, (EGLNativePixmapType)Hwnd, NULL);
// Create a GL context
context = eglCreateContext(display, config, EGL_NO_CONTEXT, contextAttribs);
// Make the context current
eglMakeCurrent(display, surface, surface, context)
*eglDisplay = display;
*eglSurface = surface;
*eglContext = context;
return EGL_TRUE;
}