Linux 使用eGlinilize/使用不带X11的OpenGL分割错误

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(.

我正在尝试使用OpenGL并将输出直接写入Imx6处理器(cubox)上的帧缓冲区 原因是我试图避免使用X11

我使用了来自的一个示例应用程序

我修改了代码,使其不包含任何X11头文件或窗口创建函数,并替换了 surface=eglCreatePixmapSurface(显示,配置,(EGLNativePixmapType)Hwnd,NULL); 使用surface=eglCreatePbufferSurface(显示、配置、surfaceAttribs)

然后我使用glReadPixels(..)将OpenGl像素直接输出到帧缓冲区

当我使用VisualGDB运行应用程序时,应用程序运行良好,其输出通过写入/dev/fb0直接显示在屏幕上

但是,当我使用./OpenGL\u Test\u IMX从控制台运行时,我得到以下错误:

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;
 }