在Wayland 中通过EGL使用OpenGL
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
二、然后就是创建一个 Wayland 窗口 surface = wl_compositor_create_surface( compositor ); wl_shell_surface* shell_surface = wl_shell_get_shell_surface( shell, surface); wl_shell_surface_add_listener( shell_surface, &shell_surface_listener, NULL); wl_shell_surface_set_toplevel(shell_surface); nativeWindow = wl_egl_window_create( surface, width, height );
registry_handle_global, registry_handle_global_remove }; void main() { dpy = wl_display_connect(NULL); registry = wl_display_get_registry(dpy); wl_registry_add_listener(registry, ®istry_listener, &dpy); wl_display_dispatch(dpy); }
在 Wayland 中通过 EGL 使用 OpenGL
摘要 Wayland 窗口显示方式有两种: 共享内存和 EGL。 本文的内容就是记录下 Wayland 中使用 EGL 的方 法。
一、首先,当然是初始化 Wayland 全局对象:wl_display、wl_registry、wl_compositor、wl_shell 等。具 体方法请参见: void registry_handle_global(void *data, wl_registry *registry, uint32_t name, const char *interface, uint32_t version) { if (strcmp(interface, "wl_compositor") == 0) { compositor = (wl_compositor*) wl_registry_bind(registry, name, &wl_compositor_interface, 1); } else if (strcmp(interface, "wl_shell") == 0) { shell = (wl_shell*)wl_registry_bind(registry, name, &wl_shell_interface, 1); } else if (strcmp(interface, "wl_shm") == 0) { shm = (wl_shm*) wl_registry_bind(registry, name, &wl_shm_interface, 1); cursor_theme = (wl_cursor_theme *) wl_cursor_theme_load( NULL, 32, shm ); default_cursor = (wl_cursor *) wl_cursor_theme_get_cursor( cursor_theme, "left_ptr" ); } else if (strcmp(interface, "wl_seat") == 0) { wl_seat *seat = (wl_seat *)wl_registry_bind(registry, name, &wl_seat_interface, 1); keyboard = (wl_keyboard *)wl_seat_get_keyboard( seat ); keyboard_set_listener(keyboard ); } } void registry_handle_global_remove(void *data, wl_registry *registry, uint32_t name) { } const wl_registry_listener registry_listener = {
三、到这一步,已经有 EGLNativeDisplay(wl_display) 和 EGLNativeWdinwo(nativeWindow) 了。 可 以调用 EGL API 进行初始化了。 具体步骤可以自行百度一下 EGL 初始化,此处不做详细说明。
பைடு நூலகம்
四、 主消息循环。 同 Win32 一样,Wayland 也需要消息循环。 run = true; long eclipsed = 0; // nsec long T = 1000000000.0/60.0; 秒) gl_demo1::init( dpy, nativeWindow ); while ( run ) { wl_display_dispatch_pending( dpy ); gl_demo1::redraw( width, height ); framesync( eclipsed, T ); } gl_demo1::terminate(); // Wayland 消息分发 // opengl 绘制 // 同步用,保证 1/60 秒绘制一帧。 // 绘制周期,1/60 秒,单位 纳秒(10E-9