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 - 圖片建立流程
請注意,不再需要取消註冊緩衝區。方法很簡單 用戶端的所有 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 保留在「觀看次數:工作階段」和「平地」這兩個執行個體,
而不是公開新的執行個體
因此效能相當卓越
- 採用多個工作階段的複雜客戶 使用緩衝區集合,而非其註冊的工作階段。