#shader #spir-v #compile #jit #macro #wgsl #glsl-hlsl-wgsl

jit-spirv-impl

使用简单的宏将 GLSL/HLSL/WGSL 编译成 SPIR-V 并即时执行

2 个版本

0.1.1 2023 年 5 月 14 日
0.1.0 2023 年 5 月 13 日

#29#wgsl

每月 38 次下载
用于 jit-spirv

MIT/Apache 许可

25KB
452

JIT SPIR-V (实现)

Crate Documentation

jit-spirv-impl 实现 jit-spirv 的过程宏代码生成器。

使用方法

请参阅 jit-spirv 的文档 以获取使用方法。

许可证

本项目许可协议为以下之一:

任选其一。


lib.rs:

jit-spirv

第一个参数是包含文本着色器源代码的字符串切片。其他后续参数可以更精细地控制生成的代码以编译您的着色器。

源语言

jit-spirv 目前支持三种源语言

  • glsl: 着色器源代码为 GLSL(默认启用);
  • hlsl: 着色器源代码为 HLSL(默认启用);
  • wgsl: 着色器源代码为 WGSL。

当启用 wgsl 功能时,WebGPU 的实验性 WGSL 支持可用,但您必须使用夜间工具链进行编译。由于 naga 后端限制,大多数额外参数将无效,SPIR-V 中只生成第一个入口点。

着色器阶段

以下着色器阶段受支持

  • vert: 顶点着色器;
  • tesc: 规划控制着色器(Hull 着色器);
  • tese: 规划评估着色器(域着色器);
  • geom: 几何着色器;
  • frag: 片段着色器(像素着色器);
  • comp: 计算着色器;
  • mesh: (网格着色)网格着色器;
  • task: (网格着色)任务着色器;
  • rgen:(光线追踪) 光线生成着色器;
  • rint:(光线追踪) 交点着色器;
  • rahit:(光线追踪) 任意击中着色器;
  • rchit:(光线追踪) 最近击中着色器;
  • rmiss:(光线追踪) 失败着色器;
  • rcall:(光线追踪) 可调用着色器;

指定入口函数

默认情况下,编译器会寻找名为 main 的入口点函数。您也可以显式指定入口函数名称

jit_spirv!(hlsl_source, hlsl, vert, entry="very_main");

优化优先级

决定您希望 SPIR-V 进行多少优化

  • min_size:优化为最小输出大小;
  • max_perf:优化为最佳性能;
  • no_debug:移除所有调试信息(如果您想反映 SPIR-V 并获取变量名称,请不要这样做)。

编译器定义

您也可以定义宏替换

jit_spirv!(glsl_source, vert,
    D USE_LIGHTMAP,
    D LIGHTMAP_COUNT="2");

您可以请求目标环境的特定版本

  • vulkan1_0 对于 Vulkan 1.0(默认,支持 SPIR-V 1.0);
  • vulkan1_1 对于 Vulkan 1.1(支持 SPIR-V 1.3);
  • vulkan1_2 对于 Vulkan 1.2(支持 SPIR-V 1.5)。
  • opengl4_5 对于 OpenGL 4.5 核心配置文件。
  • webgpu 对于 WebGPU。

当然,一旦您开始使用宏,这基本上意味着您正在变得非常动态,这个小小的软件包可能不足以满足需求。那么,可能是一个建立自己的着色器编译管道的好时机!

描述符自动绑定

如果您因为工作太累而懒得指定描述符绑定点,可以开启 auto_bind

jit_spirv!(r#"
    #version 450 core
    uniform sampler2D limap;
    uniform sampler2D emit_map;
    void main() {}
"#, glsl, frag, auto_bind);

但是,如果您没有自动化反射工具来获取实际的绑定点,不建议使用此功能。

WebGPU 的 Flip-Y

如果您打算为 WebGPU 编译 WGSL,由于 WebGPU 和 Vulkan 之间 NDC(归一化设备坐标)的差异,naga 默认会反转 Y 轴。如果这种校正是不希望看到的,您可以通过 no_y_flip 来选择不进行反转。

依赖关系

~300–750KB
~18K SLoC