|
Qt+eglf on X11 配置
发表于 2017-11-20 10:24:16
浏览:34971
|
回复:16
打印
只看该作者
[复制链接]
楼主
花了不少时间,终于在ubuntu x11下搞定了qt+opengl es2,虽然回过头来看,其实结论很简单。
这块开发板加上rk给的libmali.so 的库是可以正常在x11桌面下运行opengles2程序的,之前编译一直通不过 eglfs on x11。这里稍微总结一下处理办法。
建议使用qt5.8+的版本,之前用的qt5.6在很多情况下不是很好用,5.6的opengl es2测试文件时,没有加- #define GL_GLEXT_PROTOTYPES
复制代码
opengles2 测试无法通过,自己手工加不知道有多少坑,所以建议使用qt5.8。本人就是在 qt5.8下面测试的。
本人是利用开发板直接编译的qt,需要交叉编译的,仿照我的工作,修改systemroot下的文件即可。
首先把xcb相关的动态库补充完整,这类文章很多,就不重复了
配置命令:
- ./configure -v -nomake examples -opengl es2
复制代码 直接这样配置,可以看到 eglf on x11 是失败的,这样编译的qt无法使用 opengl es2 也无法使用gpu 加速。进入 text文件,打开
5.8/Src/qtbase/config.tests/qpa/egl-x11 文件,或者观察 congiure 的测试报告
- #include <EGL/egl.h>
- #include <xcb/xcb.h>
- #include <X11/Xlib.h>
- #include <X11/Xlib-xcb.h>
- int main(int, char **)
- {
- Display *dpy = EGL_DEFAULT_DISPLAY;
- EGLNativeDisplayType egldpy = XOpenDisplay("");
- dpy = egldpy;
- EGLNativeWindowType w = XCreateWindow(dpy, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
- XDestroyWindow(dpy, w);
- XCloseDisplay(dpy);
- return 0;
- }
复制代码
可以看到是类型转换过程中出现的问题,由于类型转化错误,导致编译不通过,所以qt认为egl on x11是不支持的。但是我在使用opengl-es3的范例程序,在
rk3399上是可以正常运行的,此例子的窗口创建程序如下
- static Display *x_display = NULL;
- EGLBoolean WinCreate(ESContext *esContext, const char *title)
- {
- Window win;
- win = XCreateWindow(
- x_display, root,
- 0, 0, esContext->width, esContext->height, 0,
- CopyFromParent, InputOutput,
- CopyFromParent, CWEventMask,
- &swa );
- esContext->eglNativeWindow = (EGLNativeWindowType) win;
- esContext->eglNativeDisplay = (EGLNativeDisplayType) x_display;
- }
复制代码
opengles3 的范例程序跟qt的测试代码用的是同样的方式创建窗口,缺可以正常工作,证明eglfs on x11 是支持的,只是由于某些问题,导致qt配置测试通过
不了。
打开/usr/include/EGL/eglplatform.h
- struct gbm_device;
- struct gbm_surface;
- typedef struct gbm_device * EGLNativeDisplayType;
- typedef struct gbm_surface * EGLNativeWindowType;
- typedef void * EGLNativePixmapType;
- /* EGL 1.2 types, renamed for consistency in EGL 1.3 */
- typedef EGLNativeDisplayType NativeDisplayType;
- typedef EGLNativePixmapType NativePixmapType;
- typedef EGLNativeWindowType NativeWindowType;
复制代码
里面的内容就只有短短这几句话,和虚拟机上ubuntu比较就会发现,rk的egl头文件并没有添加egl在x11上面的支持。事实上,他们的驱动已经支持egl on
x11了,所以,我们的工作,只要把这个头文件补充完整。
- struct gbm_device;
- struct gbm_surface;
- #if defined(__GBM__)
- typedef struct gbm_device * EGLNativeDisplayType;
- typedef struct gbm_surface * EGLNativeWindowType;
- typedef void * EGLNativePixmapType;
- #elif defined(__unix__)
- #include <X11/Xlib.h>
- #include <X11/Xutil.h>
- typedef Display *EGLNativeDisplayType;
- typedef Pixmap EGLNativePixmapType;
- typedef Window EGLNativeWindowType;
- #endif
- typedef EGLNativeWindowType NativeWindowType;
- typedef EGLNativePixmapType NativePixmapType;
- typedef EGLNativeDisplayType NativeDisplayType;
复制代码
这里增加了 __unix__ 环境下对x11的类型的支持,保存之后重新配置qt,可以看到egl on x11 通过,编译qt。
|
|