埃舍尔

概览

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

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

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

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

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

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

相辅相成,这些库可以支持快速迭代和资源生命周期管理,超出单纯使用 Vulkan 时无法可持续地实现这些目标。

跨平台支持

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

  • 开发中的迭代速度更快。在 Linux 上对 Escher 进行重新编译并运行以进行调试比在 Fuchsia 上快得多。
  • 在其他平台上,Vulkan 生态系统提供了丰富多样的开发工具,而这些开发工具在 Fuchsia 上无法实现。例如,在 Escher 开发过程中,RenderDoc 图形调试程序就非常有用。

GLSL 支持

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

源代码

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