埃舍尔

概览

Escher 是一个 C++/Vulkan 库,主要由 Views 实现使用;Fuchsia SDK 不会公开该库。它提供了用于以下用途的实用程序:

  1. 使用 Vulkan 对简单操作进行抽象化和优化,例如:

    • 流水线重复使用
    • 使用更少的内存带宽进行色彩校正
      • 在 Escher 中,子通道(以及一般的渲染通道)规范比原始 Vulkan 更方便,但概念基本相同,只是不太抽象。
      • 例如,Escher 支持单个 Vulkan 渲染通道中的子通道。也就是说,当第二个子遍历需要在同一位置访问像素时,它会在缓存的数据内执行转换,而无需离开 GPU 内存层次结构。
    • 更新缓冲区并直接发送绘制命令
    • 资源生命周期管理
      • 例如,如果您提交使用纹理进行渲染的 Vulkan 命令缓冲区,然后在渲染完成之前删除纹理,那么结果将不确定;很可能会发生崩溃。在任何有效的命令缓冲区不再引用纹理(或缓冲区)之前,Escher 不会将其删除。
  2. 特定于网域的高级渲染器,例如:

    a. RectangleCompositor,一种简单的合成器,Flatland 的 VkRenderer 使用它将显示列表内容加载到单个输出图像(称为帧缓冲区)中

    • RectangleCompositor 利用:
      • Flatland 专用的色彩校正顶点和 Fragment 着色器,可在 Vulkan 使用 Vulkan 执行色彩校正时使用
      • Flatland 特定的顶点和片段着色器,适用于将色彩校正委托给显示驱动程序或完全不需要的情况
    • 如需了解如何使用 RectangleCompositor,请参阅 rainfall 示例

    b. PaperRenderer,Gfx 使用的已弃用的合成器,用于构建抽象,用于执行当时构想的高效 3D 用户体验计算。如需了解如何使用 PaperRenderer,请参阅 waterfall 示例。

这些库合力支持快速迭代和资源生命周期管理,超出单纯使用 Vulkan 时所能达到的可持续效果。

跨平台支持

除了少数例外情况,Escher 并不依赖于平台。例如,Escher 示例也可以在 Linux 和 MacOS 上运行。这有以下两种截然不同的好处:

  • 开发中的迭代速度更快。在 Linux 上重新编译 Escher 并运行调试速度要比在 Fuchsia 上快得多。
  • 在其他平台上,Vulkan 生态系统提供各种开发工具,而 Fuchsia 不支持这些工具。例如,RenderDoc 图形调试程序在 Escher 开发期间就非常有用。

GLSL 支持

Vulkan 只接受 SPIR-V 格式的着色器源代码。Escher 可以选择支持使用 GLSL(一种人类可读的格式),然后调用 shaderc::Compiler 以将其编译为 SPIR-V,然后再加载到 Vulkan。

源代码

源代码位于 //src/ui/lib/escher/ 中。