display:weston:weston-simple-egl

写在前面:

客户端渲染

在Wayland架构中,客户端UI的所有呈现均由客户端代码执行,通常由客户端使用的图形工具包执行。

图形工具箱可以使用其希望呈现UI元素的任何方法:在CPU上进行软件呈现使用GLES进行硬件呈现。 Wayland所需要做的就是将客户端渲染的每一帧和窗口的结果像素发送到合成器。 像素数据可能以几种方式传输,具体取决于渲染方式以及客户端和合成器相互支持的内容:

  •      包含实际像素数据的共享内存缓冲区。 如果没有其他机制,则支持这些备用机制。
  •      GPU缓冲区共享(DRM / DRI)。 客户端直接在GPU上渲染窗口,结果像素数据保留在GPU内存中,并将其句柄传递给合成器。 这防止了像素数据的不必要和昂贵的复制

合成器的工作

一旦合成器拥有了所有像素数据(或包含它的GPU缓冲区的句柄),它便可以合成一帧。 与客户端渲染一样,这可以通过几种方式完成:

  •      软件渲染。 CPU密集型,用作备用。 这还需要将像素数据从GPU内存中拉出,这很昂贵

  •      使用GLES进行完整的GPU渲染。 这将获取像素数据并在GPU上对其进行合成,如果动画需要的话,可能会应用着色器和3D转换。

  •      显示控制器上特定于硬件的API。 这些通常是2D合成API,与完整的3D计算相比,它们的资源占用较少,但仍在显示控制器而非CPU上进行处理,并且不需要额外的像素数据副本。[这个动作和crtc里面的合成不是一个概念]

例如,在传统的显卡上,可能有四个硬编码覆盖层:[weston的assign plane函数里面关于plane的分配基本基于下面的策略]

  •     Primary: main overlay
    • By default surfaces belong to the primary plane

    • Only surfaces on the primary plane are composited with the renderer

  •     Scanout: a single, full-screen surface
    • "Disables" composition for fullscreen clients
    • Very low overhead
  •     Sprite: typically a video overlay in a different colour space
    • Use the hardware overlay
  •     Cursor
    • Supports 64x64 surfaces
    • SHM only, contents are copied to an appropriate buffer

 

根据我从weston的assign_plane逻辑里面看到的一样,默认的view都是分给primary;cursor就是corsor,64x64;overlay就是单独的overlay;output_repaint会把所有的primary上的view交给gpu进行合成,变成scan-out;最后调用kms交给kernel

鼠标一个单独的cursor plane;video 占据sprite plane;

像素之旅

作为说明,请考虑一个UI元素从在客户端应用程序中以编程方式创建到出现在用户屏幕上的过程。假定通过将句柄传递给GPU资源(而不是客户端渲染中列出的其他方法)在客户端和合成器之间共享纹理。在本例中,我们使用Weston作为合成器。如果使用了Mutter,则将步骤5–7替换为一个步骤:使用GLES在GPU上合成所有表面,以形成最终的输出帧。

  1.     该程序使用其UI工具包创建一个新的小部件。

  2.     该工具包在其GLES上下文中设置了小部件,并将所有必要的纹理上传到GPU。

  3.     当应用程序接下来渲染帧时(例如,由于部分UI更改),它会通过GPU的GLES管道推送其GLES上下文,从而在GPU中创建一个包含整个应用程序窗口像素数据的输出纹理。
  4.     该应用程序使用Wayland协议向合成器(Weston)通知更新的窗口,并将GPU纹理句柄传递给weston。
  5.     当Weston接下来渲染框架时,它将确定是否需要对任何曲面应用GLES变换,并根据需要将曲面分配给平面和硬件叠加层。
  6.     对于每个平面,Weston会合成该平面中的所有曲面,从而创建该平面的输出像素数据。
    •  如果某个平面需要任何变换,则Weston渲染器将通过GPU GLES管道将该平面中的表面推入。
    • 如果不需要进行任何转换,或者可以使用更高效的特定于硬件的API来实现所需的转换,那么将跳过此步骤。
  7.     Weston使用特定于硬件的API来组合所有平面以形成最终的输出框架。
  8.     输出帧将发送到用户的屏幕。

上面的图很好理解,如果是window composition,势必会跟在primary的plane上,那么就需要gpu把这些view变成一张full-screen的图,另外需要记得,合成完以后,像kernel传递的是这个gpu合成后的fd,而不是之前的多个view的fd;而如果本身就是full-screen或者overlay的,则并不需要这个合成的过程,所以两者在合成方面是有差异的

EGL 使用实践

EGL 的使用要遵循一些固定的步骤,按照这些步骤去配置、创建、渲染、释放。

其中:
Display(EGLDisplay) 是对实际显示设备的抽象
Surface(EGLSurface)是对用来存储图像的内存区域 FrameBuffer 的抽象,包括 Color Buffer, Stencil Buffer ,De
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值