Wayland Architecture( 二 )


这为应用程序留下了两种更新窗口内容的方法:
将新内容呈现到新缓冲区中,并告知合成器使用该内容代替旧缓冲区 。应用程序可以在每次需要更新窗口内容时分配一个新的缓冲区,也可以保留两个(或多个)缓冲区并在它们之间循环 。缓冲区管理完全在应用程序控制之下 。将新内容呈现到以前告诉合成器使用的缓冲区中 。尽管可以直接渲染到与合成器共享的缓冲区中,但这可能会与合成器竞争 。可能发生的情况是,合成器重新绘制桌面可能会中断重新绘制窗口内容 。如果应用程序在清除窗口后,呈现内容之前被中断,则合成器将从空白缓冲区进行贴图 。结果是应用程序窗口将在空白窗口或半渲染内容之间闪烁 。避免这种情况的传统方法是将新内容呈现到后台缓冲区中,然后从那里复制到合成器表面中 。后台缓冲区可以动态分配,大小足以容纳新内容,或者应用程序可以保留缓冲区 。同样,这在应用程序控制之下 。

Wayland Architecture

文章插图
无论哪种情况,应用程序都必须告诉合成器表面的哪个区域包含新内容 。当应用程序直接呈现到共享缓冲区时,需要注意合成器存在新内容 。而且在交换缓冲区时,合成器不会假设任何更改,并且需要应用程序发出请求才能重新绘制桌面 。即使应用程序将新缓冲区传递给合成器,该缓冲区只有一小部分也可能会有所不同,例如闪烁的光标或微调框 。
for
通常,硬件启用包括模式设置/显示和EGL / GLES2 。最重要的是,需要一种在进程之间高效共享缓冲区的方法 。有两个方面,客户端和服务器端 。
在客户端,我们定义了 EGL平台 。在EGL模型中,该模型由本机类型(,和)和一种创建这些类型的方法组成 。换句话说,是将EGL堆栈及其缓冲区共享机制绑定到通用 API的粘合代码 。EGL堆栈有望提供 EGL平台的实现 。完整的API在-egl.h标头中 。mesa EGL堆栈中的开源实现位于.c中 。
在后台,EGL堆栈有望定义一个特定于供应商的协议扩展,该协议扩展使客户端EGL堆栈可与合成器通信缓冲区详细信息以共享缓冲区 。-egl.h API的要点是将其抽象化,然后让客户端为曲面创建并开始渲染 。开源堆栈使用扩展,该扩展使客户端可以发现要使用和认证的drm设备,然后与合成器共享drm(GEM)缓冲区 。
的服务器端是合成器和垂直领域的核心用户体验,通常将任务切换器,应用程序启动器,锁屏集成在一个整体应用程序中 。服务器在模式设置API(内核模式设置, 或类似功能)之上运行,并结合使用EGL / GLES2合成器和硬件覆盖(如果有)来组合最终的UI 。启用模式设置,EGL / GLES2和叠加层应该成为标准硬件升级的一部分 。启用的额外要求是扩展,该扩展使合成器可以从通用共享缓冲区中创建 。它类似于扩展名,可以从X像素图创建 。
该扩展程序有一个设置步骤,在该步骤中,您必须将EGL显示器绑定到显示器 。然后,当合成器从客户端接收通用缓冲区时(通常在客户端调用时),它将能够将 指针作为参数传递给,并将L作为目标 。这将创建一个,合成器随后可以将其用作纹理,或传递给模式设置代码以用作覆盖平面 。同样,这是由供应商特定的协议扩展实现的,该扩展在服务器端将接收有关共享缓冲区的驱动程序特定的详细信息,并在用户调用时将其转换为EGL映像 。