Vulkan 开发

运行时依赖项

magma 驱动程序和库应已内置到完整的 Fuchsia 映像中。系统将根据构建时选择的主板来构建和加载正确的驱动程序。

组件清单

添加以下内容以启用对 Vulkan 驱动程序的访问权限:

CML

对于使用 .cml 清单声明的组件:

{
  include: [
    "vulkan/client.shard.cml"
  ],
  use: [
      { protocol: "fuchsia.media.ProfileProvider" },
  ],
  ...
}

fuchsia.media.ProfileProvider 功能是可选的,但建议使用。

必需的功能路由

使用 Vulkan 的组件必须具有路由到它的以下 FIDL 服务:

  • fuchsia.sysmem.Allocator
  • fuchsia.sysmem2.Allocator
  • fuchsia.vulkan.loader.Loader
  • fuchsia.tracing.provider.Registry
  • fuchsia.logger.LogSink
  • fuchsia.scheduler.RoleManager - 可选,但强烈建议使用;只有在担心 Vulkan ICD 中使用截止时间线程存在安全问题时,才应省略此标志。如果未指定,Vulkan ICD 将为内部线程使用默认线程优先级,这可能会导致性能欠佳。未包含在 vulkan/client.shard.cml 中,因此必须手动 use
  • fuchsia.media.ProfileProvider - 已弃用;已替换为 fuchsia.scheduler.RoleManager

测试组件可以通过在非密封 realm 中执行来接收这些功能:

# BUILD.gn

fuchsia_test_component("my_test_component") {
  component_name = "my_test"
  manifest = "meta/my_test.cml"
  deps = [ ":my_test_bin" ]

  # This runs the test in "vulkan-tests" non-hermetic realm.
  test_type = "vulkan"
}
  • 对于 vulkan-test,请将 test_type 标记为 vulkan
  • 对于 system-test,请将 test_type 标记为 system

测试组件可以使用 vulkan_envs environment 来确保它们在所有支持 Vulkan 的 buildbot 上运行。

构建时依赖项

树内 build

树内代码应依赖于 //src/lib/vulkan,以便能够包含 Vulkan 头文件并链接到 libvulkan.so

其他实用目标:

  • //src/lib/vulkan:vulkan_validation_layers:需要此权限才能启用 Vulkan 验证层

SDK 客户端

使用 Bazel SDK 的代码应依赖于 @fuchsia_sdk//pkg/vulkan

在屏幕上呈现

您可以通过以下两种方式显示渲染输出:

  1. 系统合成器

    如需了解详情,请参阅 Scenic 文档。

  2. 直接显示在显示屏上

    此方法与具有系统合成器的系统不兼容。

您可以使用自定义版本的 WSI 交换链

如需详细了解 Fuchsia 自定义,请参阅 vkcube 示例。请注意,选项 1 的交换链支持已被移除。

报告问题

密切关注系统日志中各种特定于显卡驱动程序的问题,并在 Magma 项目中提交问题单。 驱动程序应终止与发生这些问题时正在执行的上下文对应的连接;但除此之外,应妥善处理此故障。

如果之后仍无法正常使用,请将此情况也作为问题提交。

GPU 故障

如下所示。这可能是由于用户错误或驱动程序 bug 造成的。请确保您的应用没有 Vulkan 验证层问题。

如果您认为自己的应用没有问题,请提交 Magma 工单,并附上至少这一部分的日志,最好还附上重现步骤:

> [WARNING] GPU fault detected
> ---- device dump begin ----
> RELEASE build
> Device id: 0x1916
> RENDER_COMMAND_STREAMER
> sequence_number 0x1003
> active head pointer: 0x1f328
> ENGINE FAULT DETECTED
> engine 0x0 src 0x3 type 0x0 gpu_address 0x1000000
> mapping cache footprint 11.9 MB cap 190.0 MB
> ---- device dump end ----
> [WARNING] resetting render engine

GPU 挂起

如果命令缓冲区在一定时间内未能完成,GPU 驱动程序应检测到该情况,并将其视为发生了故障。

同样,可能是应用错误或驱动程序 bug。如果您认为自己的应用没有问题,请提交 Magma 工单,并附上至少这一部分的日志,最好还附上重现步骤:

> [WARNING] Suspected GPU hang: last submitted sequence number 0x1007 master_interrupt_control 0x80000000
> ---- device dump begin ----
> DEBUG build
> Device id: 0x1916
> RENDER_COMMAND_STREAMER
> sequence_number 0x1006
> active head pointer: 0x20
> No engine faults detected.
> mapping cache footprint 0.0 MB cap 0.0 MB
> ---- device dump end ----
> [WARNING] resetting render engine