RFC-0094 - 红玉髓 Virtcon

RFC-0094:Carnelian Virtcon
状态已接受
区域
  • 常规
说明

将 Virtcon 从 C++ 程序转换为基于 Rust 的 Carnelian 应用。

问题
Gerrit 更改
作者
审核人
提交日期(年-月-日)2021-04-21
审核日期(年-月-日)2021-05-04

摘要

本文档提出了一项计划,旨在将虚拟控制台 (Virtcon) 从使用自定义底层图形库 (gfx) 的 C++ 程序转换为基于 Rust 的 Carnelian 应用。工作站和终端产品所用的终端应用代码将在该过程中与 Virtcon 统一,并且 Virtcon 将能够使用高级矢量图形和可缩放文本,并实现高质量的抗锯齿效果。

设计初衷

降低复杂性和代码量

Fuchsia 目前维护着两种终端实现:

  1. Virtcon。
  2. 适用于工作站产品的终端应用。

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。