RFC-0161:風景式 Allocator API

RFC-0161:Sky Allocator API
狀態已接受
領域
  • 圖形
說明

用於 API 校正的 Views Allocator API 設計文件。

毛皮變化
作者
審查人員
提交日期 (年-月-日)2021-03-19
審查日期 (年-月-日)2021-04-05

先前的 API 設計文件

此 RFC 先前是以 API 設計文件的形式提交,並轉換成 RFC。

摘要

本文件提議規劃,將風景照的圖像資源配置擷取到 分別使用不同的通訊協定

目標和用途

Allocator API 的用意是改善現有的圖片配置流程,並讓它相容 這次異動

  • 將分配的 BufferCollection 資源範圍從「Sight::Session」延伸。一 BufferCollection 可用於建立多個 View::Sessions 中的圖片資源、 以及即將推出的 2D API Flatland 講座

  • 將緩衝區配置與 View::Session 區分開來,「通訊協定」和用途明確。 分配器只會處理緩衝區配置,「Sight::Sessions」的作用是 簡報和繪圖。

  • Allocator 可用於 3D API 以及即將推出的 2D API。這樣一來 更複雜的圖形用途

透過這個 API,更複雜的使用者可在各自獨立的兩個機構之間共用圖片資源 資訊:工作階段。這種做法目前不可行,而且通常會強迫進行現實。

設計

我們的建議主要是捨棄緩衝區註冊和停用註冊功能 依序執行:對新的通訊協定進行工作階段如要瞭解提議的通訊協定,請參閱下文。

library fuchsia.ui.composition;

/// A typed wrapper for an eventpair, representing the registry endpoint of a buffer collection.
resource struct BufferCollectionExportToken {
    zx.handle:EVENTPAIR value;
};

/// A typed wrapper for an eventpair, representing the Image import endpoint of a buffer
/// collection.
resource struct BufferCollectionImportToken {
    zx.handle:EVENTPAIR value;
};

protocol Allocator {
    /// A BufferCollection is a set of VMOs created by Sysmem and shared by a number of
    /// participants, one of which is the Flatland Renderer. Some content, such as Images, use a
    /// BufferCollection as their backing memory.
    ///
    /// Clients can send `export_token` to register buffer collections with Allocator to be used
    /// later in [`fuchsia.ui.composition/Flatland`] instances or other Scenic APIs. For
    /// example, by passing a [`BufferCollectionImportToken`] containing the matching peer of
    /// [`BufferCollectionExportToken`], they can create image resources via
    /// [`fuchsia.ui.composition/Flatland.CreateImage`]. Clients should wait for the response
    /// before using `import_token`.
    ///
    /// Flatland participates in the allocation of buffers by setting constraints on the
    /// BufferCollection referenced by `buffer_collection_token`. It will not block on buffers
    /// being allocated until the client creates content using the BufferCollection.
    ///
    /// The buffer collection registered with `export_token` is available and kept alive as long
    /// as the client holds a valid [`BufferCollectionImportToken`]. They will be garbage collected
    /// when all [`BufferCollectionImportToken`]s are closed and all the associated Image resources
    /// are released.
    RegisterBufferCollection(BufferCollectionExportToken export_token,
                             fuchsia.sysmem.BufferCollectionToken buffer_collection_token)
        -> () error RegisterBufferCollectionError;
};

圖 1 - 圖片建立流程 下圖呈現了關係用戶端、Alloycator 和呈現 API。

請注意,不再需要取消註冊緩衝區。方法很簡單 用戶端的所有 BufferCollectionImportToken 執行個體。這是更好的防禦 記憶體流失,因為許多用戶端在非預期的情況下無法執行取消註冊流程 關機。

現有的緩衝區註冊功能需要用戶端定義一個參照的唯一識別碼,以參照 緩衝區集這已由 EVENTPAIR 取代,讓用戶端可以輕鬆複製任意數量的事件 資源長度請參閱下方的現有流程。

protocol Session {
    RegisterBufferCollection(uint32 buffer_id, fuchsia.sysmem.BufferCollectionToken token);

    DeregisterBufferCollection(uint32 buffer_id);
};

Google 開始針對推薦的設計,致力進行必要的重構。 如要瞭解實際異動內容,請參閱 fxr/498558 和 fxr/499479。

可用性

Allocator API 可透過其他方式實現現有功能, 從客戶的觀點來看

  • 用戶端會建立 EVENTPAIR,而不是找出專屬 ID。
  • 用戶端可以捨棄事件組合的另一端,而不必明確呼叫 使用相同的專屬 ID 取消註冊。
  • 用戶端可以在多個 Show:Sessions 中複製事件組合的另一端,並使用該組合的另一端。 用於建立映像檔資源

以下是「Sight::Session」的使用模式範例。

fuchsia::ui::composition::AllocatorPtr scenic_allocator;
fuchsia::sysmem::BufferCollectionTokenSyncPtr token;
auto ref_pair = allocation::BufferCollectionImportExportTokens::New();
scenic::SessionPtr session;
scenic_allocator->RegisterBufferCollection(std::move(ref_pair.export_token), std::move(token),
                                             [&]() {
                                               session->Enqueue(scenic::NewCreateImage3Cmd(
                                                 image_id, width, height,
                                                 std::move(ref_pair.import_token), vmo_index));
                                             });

測試

我們打算針對 API 新增廣泛的單元測試。在這些模型的整合測試中 要求在《Sight::Session》中使用分配器時, 進行樹狀結構內像素測試

效能注意事項

Allocator API 不會新增任何額外的 API 呼叫。可以避免客戶執行 DeregisterBufferCollection 呼叫。

安全性考量

Allocator API 仰賴 EVENTPAIR 功能來解決安全性問題。獨特性 EVENTPAIR 且在建立時與其他端點緊密連結,可確保惡意用戶端 無法綁架並存取基礎緩衝區。若他們是以某種方法獲取 EVENTPAIR 只能展示這張圖片,但無法修改或讀取該圖片。

缺點和替代方案

Allocator API 提案有兩個主要改善要點 現有的通訊協定和流程

  • 我們可以繼續使用不重複的 ID 來參照緩衝區集合,而非事件組合。我們可以 預期客戶會選取不重複的集合 ID,否則系統可能會傳回不重複的集合 ID 從註冊呼叫中取得收集 ID
    • 挑選專屬 ID 需要同步,而無論是在用戶端尋找 並等待 Allocator 確認後才能使用
    • 唯一識別碼可能會遭到惡意用戶端綁架而被綁架。
    • 我們需要明確的 DeregisterBufferCollection() 呼叫。
  • 我們可以將 Allocator 保留在「觀看次數:工作階段」和「平地」這兩個執行個體, 而不是公開新的執行個體 因此效能相當卓越
    • 採用多個工作階段的複雜客戶 使用緩衝區集合,而非其註冊的工作階段。