RFC-0161:Sunces Allocator API | |
---|---|
状态 | 已接受 |
领域 |
|
说明 | 用于 API 校准的景观分配器的前 API 设计文档。 |
Gerrit 更改 | |
作者 | |
审核人 | |
提交日期(年-月-日) | 2021-03-19 |
审核日期(年-月-日) | 2021-04-05 |
旧版 API 设计文档
此 RFC 之前是作为 API 设计文档提交的,并已转换为 在 API 设计文档模板被弃用后发布的 RFC。
摘要
本文档提出了一个计划,将景观的图像资源分配提取到 单独的协议
目标和应用场景
Allocator API 旨在改进现有的图片分配流程,并使其兼容 以应对即将发生的变化
扩展为 Anthos::Session 分配的 BufferCollection 资源的范围。一个 BufferCollection 可用于在多个 Crashlytics::Sessions、 还有即将举行的 2D API Flatland 会议
将缓冲区分配与 Sharp 区分开来让协议的目的。 分配器仅处理缓冲区分配,而 Crashlytics::Sessions 用于 和绘图。
我们的 3D API 和即将推出的 2D API 均可以使用分配器。这样, 更为复杂的图形使用。
使用此 API,更复杂的用户可以在其独立 English::Sessions。这目前不可行,而且常常需要重新分配。
设计
我们的建议主要是改变缓冲区注册和注销功能 迁移到新协议请参阅下文,了解建议的协议。
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 实例。这样可以更好地防止 考虑到许多客户端在非预期时间 关闭。
现有的缓冲区注册功能要求客户端定义一个唯一 ID 来引用 BufferCollection它被 EVENTPAIR 取代,客户可以轻松复制任意数量的 次。请参阅下面的现有流程。
protocol Session {
RegisterBufferCollection(uint32 buffer_id, fuchsia.sysmem.BufferCollectionToken token);
DeregisterBufferCollection(uint32 buffer_id);
};
着陆建议设计的工作仍在进行,必要的重构已经开始。 如需了解实际更改,请参阅 fxr/498558 和 fxr/499479。
易用性
Allocator API 允许通过其他方式实现现有功能,这样更容易 从客户的角度来说。
- 客户端会创建 EVENTPAIR,而非找出唯一 ID。
- 客户端可以丢弃事件对的另一端,而不是显式调用 具有相同唯一 ID 的 DeregisterBufferCollection。
- 客户端可以复制并在多个 Anthos::Sessions 中使用事件对的另一端 以创建映像资源。
请参见以下字段的示例使用模式:Snapshots::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 添加大量单元测试。集成测试 需要使用分配器和 Skys::Session。 树内像素测试
性能注意事项
Allocator API 不会添加任何其他 API 调用。它使客户免去了 DeregisterBufferCollection 调用。
安全注意事项
Allocator API 依赖 EVENTPAIR 功能来解决安全问题。唯一性 且在创建时与其他端点紧密关联,可确保恶意客户端 无法劫持和访问底层缓冲区。如果通过某种方式获得了 EVENTPAIR,他们 只能呈现此图片,而不能修改或读取此图片。
缺点和替代方案
Allocator API 提案主要有两个改进之处,其中任何一个都可以替换为 现有协议和流
- 我们可以继续使用唯一 ID 来引用缓冲区集合,而不是事件对。我们可以
要求客户端选择一个唯一的集合标识符,或者我们可以返回一个唯一的
从注册调用中获取的集合标识符
- 选择唯一标识符需要进行同步,这在客户端查找 有效标识符,并等待分配器确认后才能使用。
- 唯一标识符很容易被恶意客户端盗用。
- 我们需要显式调用 DeregisterBufferCollection()。
- 我们可以将分配器保持在 Snapshots::Session 和 Flatland 实例中,
协议。
- 我们处理多个会话的复杂客户仍然会受到限制, 使用缓冲区集合超过其注册的一个会话。