文章目录

  • Wayland 架构
  • Wayland 渲染
  • Wayland的 硬件支持

简 述: 翻译一篇关于和 wayland 有关的技术文章, 其英文标题为Wayland Architecture .

Wayland 架构

若是想要更好的理解 Wayland 架构及其与 X (X11 or X Window System) 结构;一种很好的方法是将事件从输入设备就开始跟踪, 查看期间所有的屏幕上出现的变化。

这就是我们现在对 X 的理解。

  1. 内核是从一个输入设备中获取一个事件,并通过 evdev 输入驱动将其发送到 X。内核通过驱动设备将不同设备的事件协议翻译成 linux evdev 输入事件标准,依靠此来完成所有的工作。
  2. X 服务器确定事件影响到哪个窗口,并将其发送给在该窗口上选择了相关事件的客户端。X 服务器实际上并不知道如何正确地做这件事,因为窗口在屏幕上的位置是由合成器控制的,并且可能会以很多 X 服务器不理解的方式进行转换(缩小、旋转、晃动等)。
  3. 客户端依据这个事件决定该如何操作。通常情况下,UI 通常根据事件来改变,也许是一个复选框被点击了,或者指向了一个必须被显示的按钮。因此,客户端会向X服务器发送一个渲染请求。
  4. 当X服务器收到渲染请求时,它将其发送给驱动程序,让它对硬件进行编程以进行渲染。X服务器还计算出渲染的边界区域,并将其作为damage事件发送给合成器。
  5. damage事件告诉合成器,窗口中发生了一些变化,它必须重新合成该窗口可见的屏幕部分。合成器负责根据它的场景图和X窗口的内容来渲染整个屏幕内容。且它是必须通过X服务器来渲染。
  6. X服务器接收到来自合成器的渲染请求后,要么将合成器的后缓冲区复制到前缓冲区,要么进行翻页。在一般情况下,X服务器必须做这一步,这样它就可以考虑到重叠的窗口,这可能需要剪接,并确定是否可以翻页。然而,对于一个总是全屏的合成器来说,这又是一个不必要的上下文切换。

如上所述,这种方法都有瑕疵。X服务器没有信息来决定哪个窗口应该接收事件,也不能将屏幕坐标转换为窗口局部坐标。而且即使X已经把最终绘制屏幕的责任交给了合成管理器,X仍然控制着前面的缓冲区和模式设置。过去X服务器处理的大部分复杂问题,现在都可以在内核或自带的库中找到(KMS、evdev、mesa、fontconfig、freetype、cairo、Qt等)。总的来说,X服务器现在只是一个中间人,在应用程序和合成器之间多引入了一步,在合成器和硬件之间多引入了一步。

在wayland中,合成器就是显示服务器。我们把KMS和evdev的控制权转移到合成器上。wayland协议让合成器直接向客户端发送输入事件,让客户端直接向合成器发送损坏事件。

  1. 内核获得一个事件并将其发送到合成器。这类似于X的情况,这很好,因为我们可以重复使用内核中所有的输入驱动。
  2. 合成器通过它的场景图来决定哪个窗口应该接收这个事件。场景图对应于屏幕上的内容,而合成器了解它可能已经对场景图中的元素转换。因此合成器可以选择合适的窗口,并通过应用逆向变换,将屏幕坐标转换为窗口局部坐标。只要能计算出输入事件的逆向变换,就可以应用于窗口的变换类型只限于合成器能做的事情。
  3. 如在X案例中,当客户端接收到事件时,它会更新UI作为响应。但在wayland的情况下,渲染发生在客户端,客户端只需向合成器发送一个请求,指示被更新的区域。
  4. 合成器收集客户端的damage请求,然后重新合成屏幕效果。且合成器可以直接发出ioctl,与KMS一起进行翻页。

Wayland 渲染

在上面的概述中,有漏掉了一个细节,那就是客户端在wayland下究竟是如何渲染的。通过将X服务器从画面中移除,我们也移除了X客户端通常的渲染机制。但是我们在X下的DRI2已经使用了另一种机制:直接渲染。通过直接渲染,客户端和服务器共享一个视频内存缓冲区。客户端链接到一个渲染库,比如OpenGL,它知道如何对硬件进行编程,并直接渲染到缓冲区。而合成器则可以在合成桌面时,将缓冲区作为纹理使用。在初始设置之后,客户端只需要告诉合成器使用哪个缓冲区,以及何时何地的将新内容渲染到缓冲区中。

这就给应用程序留下了两种更新窗口内容的方法:

  1. 把新的内容渲染到一个新的缓冲区里 然后告诉合成器使用哪个缓冲区来代替旧的缓冲区。应用程序可以在每次需要更新窗口内容时分配一个新的缓冲区,也可以保留两个(或更多)缓冲区并在它们之间循环。缓冲区的管理完全由应用程序控制。
  2. 将新的内容渲染之前告诉合成器使用的缓冲区。虽然可以直接渲染到合成器共享的缓冲区中,但这可能会与合成器发生竞赛。可能发生的情况是,重新绘制窗口内容可能会被合成器重新绘制桌面所中断。如果应用程序在清除窗口后但在渲染内容之前被打断,那么合成器将从一个空白缓冲区中进行纹理处理。其结果是,应用程序窗口将在空白窗口或半渲染的内容之间闪烁。避免这种情况的传统方法是将新的内容渲染到后置缓冲区,然后从那里复制到合成器表面。后面的缓冲区可以即时分配,并且刚好足够容纳新内容,或者应用程序可以保留一个缓冲区。同样这也是由应用程序所控制的。

无论在哪种情况下,应用程序都必须告诉合成器表面的哪个区域存放新内容。当应用程序直接渲染到共享缓冲区时,需要注意到合成器有新内容。但在交换缓冲区时,合成器也不会认为有什么变化,只有需要应用程序提出请求才会重新绘制桌面。即使应用程序传递给合成器一个新的缓冲区,也可能只有一小部分缓冲区是不同的,比如一个闪烁的光标或一个旋转器。

Wayland的 硬件支持

通常情况下,硬件启用包括 modesetting / display 和 EGL / GLES2。除此之外,Wayland还需要一种在进程之间高效共享缓冲区的方式。这有两个方面,客户端和服务器端。

在客户端,我们定义了一个Wayland EGL平台。在EGL模型中,它由原生类型(EGLNativeDisplayType、EGLNativeWindowType和EGLNativePixmapType)和创建这些类型的方法组成。换句话说,它是将EGL栈及其缓冲区共享机制与通用Wayland API绑定的耦合代码。EGL堆栈有望提供Wayland EGL平台的实现。完整的API在wayland-egl.h头中。mesa EGL协议栈中的开源实现在platform_wayland.c中

在引擎下,EGL堆栈寄希望于被一个特定厂商的协议扩展所定义,让客户端EGL堆栈与合成器通信缓冲区细节,以及共享缓冲区。wayland-egl.h API的意义在于将这些抽象掉,让客户端为Wayland曲面创建一个EGLSurface并开始渲染。开源栈使用了 drm Wayland 扩展,让客户端发现要使用的 drm 设备并进行认证,然后与合成器共享 drm(GEM)缓冲区。

Wayland的服务器端是垂直领域的合成器和核心用户体验,典型的是将任务切换器、应用启动器、锁屏整合在一个单体应用中。服务器运行在模式设置 API(内核模式设置、OpenWF Display或类似)之上,并使 EGL / GLES2 合成器和硬件覆盖(如果有的话)混合合成最终的UI。启用模式设置、EGL/GLES2和覆盖是标准硬件启动的一部分。启用Wayland的额外要求是EGL_WL_bind_wayland_display扩展,它允许合成器从通用Wayland共享缓冲区创建EGLImage。它类似于EGL_KHR_image_pixmap扩展,可从X像素图创建EGLImage。

该扩展有一个设置步骤,您必须将EGL显示与Wayland显示绑定。然后当合成器从客户端接收通用的Wayland缓冲区时(通常在客户端调用eglSwapBuffers时),它将能够将结构wl_buffer指针传递给eglCreateImageKHR作为EGLClientBuffer参数,并以EGL_WAYLAND_BUFFER_WL作为目标。这将创建一个EGLImage,它可以被合成器用作纹理,或传递给模式设置代码作为覆盖平面使用。同样这是由厂商特定的协议扩展来实现的,在服务器端,它将接收驱动程序关于共享缓冲区的具体细节,并在用户调用eglCreateImageKHR时将其转化为EGL图像。

Wayland架构、渲染、硬件支持相关推荐

  1. 国产AI框架再进化!百度Paddle Lite发布:率先支持华为NPU在线编译,全新架构更多硬件支持...

    乾明 边策 发自 凹非寺  量子位 报道 | 公众号 QbitAI 国产AI框架飞桨刚刚带来新进化:Paddle Lite正式发布! 高扩展.高性能.轻量化,还是首个支持华为NPU在线编译的深度学习端 ...

  2. caffe不支持relu6_国产AI框架再进化!百度Paddle Lite发布:率先支持华为NPU在线编译,全新架构更多硬件支持...

    乾明 边策 发自 凹非寺  量子位 报道 | 公众号 QbitAI 国产AI框架飞桨刚刚带来新进化:Paddle Lite正式发布! 高扩展.高性能.轻量化,还是首个支持华为NPU在线编译的深度学习端 ...

  3. kvm架构详解--理解CPU、内存、IO虚拟化技术、处理器硬件支持

    1. 简介 当前的主流虚拟化实现技术分为两种: VMM(虚拟化监控器)运行在硬件平台上,控制所有硬件并管理guest os.guest os运行在比VMM更高的级别.例如xen. VMM运行在宿主操作 ...

  4. 《AI系统周刊》第2期:硬件支持的Tensor-train分解与高效数据处理、清华吴文斐研究组获得NSDI最佳论文奖

    No.02 智源社区 AI系统组 A I 系  统 研究 观点 资源 活动 关于周刊 AI系统是当前人工智能领域极具现实意义与前瞻性的研究热点之一,为了帮助研究与工程人员了解这一领域的进展和资讯,我们 ...

  5. Renderbus瑞云渲染正式支持UE云渲染!离线渲染+实时渲染=渲染起飞!

    2022年已经到了尾声,回顾今年CG圈里最具讨论性的话题,除了AI绘图,就是虚幻引擎了,这两者如同一股风潮,从概念创意到后期制作,一路以"席卷"之势影响到了视觉领域的各个行业. R ...

  6. 【Linux】更新内核和硬件支持到建议版本

    内核版本与硬件支持更新 内核更新 LTS Enablement Stacks 功能快捷键 合理的创建标题,有助于目录的生成 如何改变文本的样式 插入链接与图片 如何插入一段漂亮的代码片 生成一个适合你 ...

  7. OpenStack 企业私有云的若干需求(5):主流硬件支持、云快速交付 和 SLA 保证

    本文转自网络文章,内容均为非盈利,一切版权原作者所有. 文章内容仅代表原作者独立观点,不代表本账号立场,转载此文章在于个人学习收藏,传递更多知识. 如有侵权,马上删除. 原文作者:世民谈云计算(微信公 ...

  8. Linux 内核 4.20 圣诞发布!新增硬件支持,性能有所改进

    就在圣诞节前夕,Linus Torvalds于12月23日正式宣布发布Linux 内核4.20.在官方声明中,Linus Torvalds表示他不会考虑再延迟一周,因为所有人都要休假了. 我鼓励大家及 ...

  9. arduino 串口读取字符串_乐创物联物联网架构之硬件层中间件Arduino模拟量

    0 前言 大家好!我叫乐创物联,我主要是做工业自动化方面和物联网方面的.了解熟悉工业自动化领域的,也开发过物联网相关的产品.我的初衷是做工业物联网的,但这个系统太过于庞大,后续也会自主去学习一下.所以 ...

最新文章

  1. WCFAppFabric :异常消息: 内存入口检查失败
  2. sublime配置python开发环境_win7 下搭建sublime的python开发环境的配置方法
  3. poj 3308(最小割求解最小点权覆盖)
  4. 电子音乐包括电声乐器和计算机音乐,浅谈电子音乐制作的发展方向
  5. d3d9 抓取windows屏幕
  6. 震惊,杨幂的脸竟然出现在了她的身体上
  7. RESTful Web Services简单介绍
  8. e盾服务端源码_学习ZooKeeper源码,就从这篇开始吧
  9. 北京中波(AM-MW)无线广播发射频率/频道表 (转载)
  10. 线性回归-误差项分析
  11. 贝塞尔曲线和B样条曲线
  12. 应用分享:GIF压缩助手
  13. 华为手机微信无法连接到服务器1-500,Wi-Fi 6 路由器买不起?华为新品路由 500 元不到就能买...
  14. 个人职业生涯规划发展的一些图
  15. 高等代数:4 矩阵的运算
  16. lambda表达式:
  17. 【编程小技巧】实现弹窗、选项、关机(文件后缀改成.vbs)
  18. 游戏项目管理经验方法
  19. Android网易新闻评论盖楼效果的实现
  20. stdio.h里的一些函数

热门文章

  1. Windows10安装tomcat【配置环境变量】
  2. 为父母定制云上南京旅行攻略#父亲节#ZStack
  3. 云计算演义(1)衣服再漂亮,总是要脱的:一个单词的演变,见证了一个时代的开端
  4. 骁龙8gen1和骁龙888plus差距大不大 骁龙8gen1和骁龙888plus哪个发热严重
  5. 学习:卷积神经网络发展史
  6. Fireplace Live HD+ Screensaver for Mac(壁炉和篝火燃烧屏保)
  7. 云文档服务器开小差,ACER桌面云解决方案(2020年十二月整理).pdf
  8. 苹果8plus什么用计算机,【苹果iPhone8Plus评测】iOS 11:基础分满分后它要做附加题-中关村在线...
  9. 同步手绘板——android端下笔后颜色变化
  10. 编写Java网络爬虫代码