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,并且在完成此过渡后,我们可以减少与显示控制器 API 交互的方式。
新功能
基于 Carnelian 的 Virtcon 将继续支持无闪烁单缓冲模式渲染,同时在显示驱动程序支持充足的设备上引入无撕裂双缓冲输出支持。这样可以改善视觉效果,并更好地与某些不支持单缓冲区模式的硬件(例如 FEMU)集成。
可缩放的文字
Carnelian 支持高效渲染可缩放的矢量图形(包括文字),因此可以轻松调整控制台文字的大小,使其与显示屏的密度相匹配。
启动画面
过渡到 Carnelian 将使 Virtcon 现代化,并实现启动画面功能,现有和未来的产品都将受益于此。例如,可以在启动期间显示动画,并且除非用户按下特殊键或发生错误,否则可以隐藏 debuglog。Carnelian 对 Rive 动画的支持提供了一种无缝设计和集成界面资源的方式,同时保持较低的资源使用率和高效的渲染。
设计
Virtcon 用于启动,对于此用例,它必须继续正常运行。任何会阻止此操作的设计变更都不会被接受。
Carnelian 允许应用在没有 Scenic 或 Root Presenter 的情况下运行,并且在 Vulkan 不可用的情况下,它具有高效的软件渲染器。恢复界面已在使用此功能,并且已完成允许基于 Carnelian 的应用替换 Virtcon 所需的额外步骤。在没有 Scenic 的情况下运行的 Carnelian 应用会直接与显示和输入驱动程序通信,方式与旧版 Virtcon 类似。
基于 Carnelian 的 Virtcon 将设计为尽可能地与终端应用实现代码重用。
Fuchsia 开发者应该不会注意到此过渡带来的显著差异。用于与 Virtcon 交互的硬件要求和 FIDL API 不会发生变化。
实现
基于 Carnelian 的 Virtcon 将类似于恢复界面应用,但会作为 Virtcon 客户端连接到显示控制器,而不是作为主要客户端连接(有关差异的详细信息,请参阅显示协调器 API)。
通过将所有共享逻辑实现为两个组件都可以使用的 Rust 库,可以最大限度地实现代码重用。在某些情况下,这意味着将终端代码提取到库中。
将开发基于 Carnelian 的文本网格,以支持终端应用和 Virtcon。此文本网格将利用 Carnelian 对部分屏幕更新的支持,提供与旧版 Virtcon 相当的性能。
性能
性能和资源使用情况是此项目的一个关键方面。在此过渡期间,性能和内存用量不得显著下降,这一点至关重要。预计双缓冲会增加内存使用量,但该功能应该是可选的。
以下方面不应存在显著差异:
- CPU 使用情况。
- 内存用量。
- 构建时间。
Virtcon 的二进制大小预计会增加,但应保持在 1MiB 以下。
测试
Virtcon 的测试覆盖率应保持不变或有所提高。所有新的 Rust 代码都应包含单元测试,并且现有的集成测试应转换为新版 Virtcon。
文档
在此阶段,我们计划通过此 RFC 和 README.md 来记录基于 Carnelian 的 Virtcon。