RFC-0094:Carnelian Virtcon | |
---|---|
状态 | 已接受 |
领域 |
|
说明 | 将 Virtcon 从 C++ 程序转换为基于 Rust 的 Carnelian 应用。 |
问题 | |
Gerrit 更改 | |
作者 | |
审核人 | |
提交日期(年-月-日) | 2021-04-21 |
审核日期(年-月-日) | 2021-05-04 |
总结
本文档提出了一个计划,用于将虚拟控制台 (Virtcon) 从具有自定义低级别图形库(请参阅 gfx)的 C++ 程序转换为基于 Rust 的 Carnelian 应用。用于工作站和终端产品的终端应用代码将在此过程中与 Virtcon 整合,Virtcon 将能够使用高级矢量图形和可缩放文本,并带有高品质的抗锯齿功能。
设计初衷
降低复杂性和降低代码
Fuchsia 目前在维护两种终端实现:
- Virtcon。
- 工作站产品的终端应用。
Virtcon 实现了自己的受限软件渲染库,而终端应用由 Carnelian 的高级矢量图形渲染后端提供支持。这些实现之间会进行大量代码重复,减少代码量为平台带来的好处。可以删除 Virtcon 目前使用的旧版图形库 (gfx),并且我们可以减少此过渡完成后与 Display Controller API 的交互方式的数量。
新功能
基于 Carnelian 的 Virtcon 将保持对无闪烁单缓冲区模式渲染的支持,同时在具有充分显示驱动程序支持的设备上引入对无撕裂双缓冲输出的支持。这有助于改善视觉外观,并更好地与未很好地支持单一缓冲区模式的某些硬件(例如 FEMU)集成。
可缩放文字
Carnelian 支持高效渲染可伸缩的矢量图形(包括文本),因此可以轻松调整控制台文本的大小以匹配屏幕密度。
启动画面
过渡到 Carnelian 后,我们将对 Virtcon 进行现代化改造,并使现有和未来的产品都能从启动画面功能中受益。例如,可以在启动期间显示动画,并且可以隐藏调试日志,除非用户按特殊键或出现错误。Carnelian 支持 rive 动画,提供了一种顺畅的设计和集成界面资源的方式,同时可以保持低资源用量和高效渲染。
设计
Virtcon 用于启动,对于此用例而言,它必须持续正常运行。任何阻止这种行为的设计变更都不会被接受。
Carnelian 允许应用在没有“Sensing ”或“Root Presenter”的情况下运行,并针对“Vulkan”不可用的情况提供高效的软件渲染程序。此 API 已被恢复界面使用,允许基于 Carnelian 的应用替换 Virtcon 所需的额外步骤已经完成。在没有 View 的情况下运行的 Carnelian 应用会采用与旧版 Virtcon 类似的方式直接与显示和输入驱动程序进行通信。
基于 Carnelian 的 Virtcon 旨在最大程度地通过终端应用重复使用代码。
Fuchsia 开发者应该不会注意到与此转换有何明显不同。用于与 Virtcon 进行交互的硬件要求和 FIDL API 没有变化。
实现
基于 Carnelian 的 Virtcon 与恢复界面应用类似,但会作为 Virtcon 客户端(而不是作为主客户端)连接到屏幕控制器(如需详细了解差异,请参阅 display-coordinator API)。
通过将所有共享逻辑实现为两个组件都可以使用的 Rust 库,可以最大程度地重复使用终端应用的代码。在某些情况下,这意味着将终端代码提取到库中。
我们将开发基于 Carnelian 的文本网格,为终端应用和 Virtcon 提供支持。此文本网格将利用 Carnelian 对部分屏幕更新的支持,提供与旧版 Virtcon 相当的性能。
性能
性能和资源使用是此项目的一个关键方面。在此过渡期间,请务必确保性能和内存用量不会大幅降低。双重缓冲预计会增加内存使用量,但该功能应是可选的。
在以下方面应该没有明显的区别:
- CPU 使用率。
- 内存用量。
- 构建时间。
Virtcon 的二进制文件大小预计会增加,但应保持在 1MiB 以下。
测试
Virtcon 的测试覆盖率应该保持不变或有所改进。所有新的 Rust 代码都应包含单元测试,现有的集成测试都应转换为新版 Virtcon。
文档
在现阶段,我们计划通过此 RFC 和此 README.md 记录基于 Carnelian 的 Virtcon。