RFC-0094 - Carnelian Virtcon

RFC-0094:Carnelian Virtcon
狀態已接受
區域
  • 一般
說明

將 Virtcon 從 C++ 程式轉換為以 Rust 為基礎的 Carnelian 應用程式。

問題
Gerrit 變更
作者
審查人員
提交日期 (年-月-日)2021-04-21
審查日期 (年-月-日)2021-05-04

摘要

本文提出一項計畫,將虛擬控制台 (Virtcon) 從使用自訂低階圖形程式庫 (gfx) 的 C++ 程式,轉換為以 Rust 為基礎的 Carnelian 應用程式。在過程中,用於 Workstation 和 Terminal 產品的終端機應用程式碼會與 Virtcon 統一,而 Virtcon 將能使用進階向量圖形和可擴充文字,並提供高品質的反鋸齒效果。

提振精神

減少複雜度和程式碼

Fuchsia 目前維護兩種終端機實作方式:

  1. Virtcon。
  2. 適用於 Workstation 產品的終端機應用程式。

Virtcon 實作了專屬的受限軟體算繪程式庫,而 Terminal 應用程式則採用 Carnelian 的進階向量圖形算繪後端。這些實作項目之間有大量重複的程式碼,減少重複程式碼對平台來說是淨正面影響。Virtcon 目前使用的舊版 gfx 圖像程式庫可以刪除,完成這項轉換後,我們與螢幕控制器 API 互動的方式也會減少。

新功能

以 Carnelian 為基礎的 Virtcon 會繼續支援無閃爍的單一緩衝區模式算繪,並在顯示驅動程式庫支援充足的裝置上,導入無撕裂的雙緩衝區輸出。這項變更可改善視覺外觀,並與某些硬體 (例如 FEMU) 進行更完善的整合,因為這些硬體不支援單一緩衝區模式。

可縮放文字

Carnelian 支援有效率地算繪可縮放向量圖形 (包括文字),因此調整控制台文字大小以配合螢幕密度非常簡單。

啟動顯示畫面

改用 Carnelian 後,Virtcon 將會採用新式架構,並啟用啟動畫面功能,讓現有和日後推出的產品都能受益。舉例來說,啟動期間可以顯示動畫,除非使用者按下特殊鍵或發生錯誤,否則可以隱藏 debuglog。Carnelian 支援 rive 動畫,可順暢設計及整合 UI 資產,同時維持低資源用量和高效轉譯。

設計

Virtcon 用於啟動,因此必須繼續運作,才能用於這個用途。如果設計變更會導致無法達成上述目標,系統將不接受。

應用程式可透過 Carnelian 執行,不必使用 Scenic 或 Root Presenter,且在無法使用 Vulkan 的情況下,還能透過高效的軟體算繪器執行。復原使用者介面已使用這項功能,且允許 Carnelian 型應用程式取代 Virtcon 的額外步驟也已完成。在沒有 Scenic 的情況下,Carnelian 應用程式會直接與螢幕和輸入驅動程式通訊,方式與舊版 Virtcon 類似。

Carnelian 架構的 Virtcon 將盡可能重複使用程式碼,以搭配終端機應用程式。

Fuchsia 開發人員應該不會感受到這項轉換帶來的重大差異。與 Virtcon 介接的硬體需求和 FIDL API 不會變更。

實作

以 Carnelian 為基礎的 Virtcon 與復原 UI 應用程式類似,但會以 Virtcon 用戶端的形式連線至顯示控制器,而不是以主要用戶端的形式連線 (如要瞭解兩者差異,請參閱 display-coordinator API)。

如要盡量重複使用 Terminal 應用程式的程式碼,請將所有共用邏輯實作為兩個元件都能使用的 Rust 程式庫。在某些情況下,這表示要將終端機程式碼擷取到程式庫中。

我們將開發以 Carnelian 為基礎的文字格線,為終端機應用程式和 Virtcon 提供支援。這個文字格線會利用 Carnelian 支援的部分畫面更新功能,提供與舊版 Virtcon 相符的效能。

效能

效能和資源用量是這個專案的關鍵層面。因此,效能和記憶體用量不會大幅倒退,是這項轉換作業的關鍵。雙重緩衝預期會增加記憶體用量,但這項功能應為選用。

以下指標不應有顯著差異:

  • CPU 用量。
  • 記憶體用量。
  • 建構時間。

Virtcon 的二進位大小預計會增加,但應維持在 1 MiB 以下。

測試

Virtcon 的測試涵蓋範圍應相同或有所提升。所有新的 Rust 程式碼都應有單元測試,且現有的整合測試應轉換為新版 Virtcon。

說明文件

在這個階段,我們計畫透過這份 RFC 和 README.md 文件,記錄以 Carnelian 為基礎的 Virtcon。