How to Use Glslang

文章目录

      • Execution of Standalone Wrapper
      • 构建 (CMake)
      • 依赖关系
      • 构建步骤
      • 如果需要更改 GLSL 语法
      • 测试
      • 运行测试
      • 基本内部操作

Execution of Standalone Wrapper

要使用独立的二进制形式,请执行glslang,它将打印一条使用语句。基本操作是给它一个包含着色器的文件,它会打印出警告/错误以及可选的 AST。

应用的特定于阶段的规则基于文件扩展名:

  • vert 顶点着色器
  • tesc 曲面细分控制着色器
  • tese 曲面细分评估着色器
  • geom 几何着色器
  • frag 片段着色器
  • comp 计算着色器

对于光线追踪管道着色器:

  • rgen 光线生成着色器
  • rint 光线相交着色器
  • rahit 光线任意命中着色器
  • rchit 光线最接近的着色器
  • rmiss 光线缺失着色器
  • rcall 可调用着色器

还有一个非着色器扩展:

  • conf 有关限制的配置文件,请参阅使用阶段的示例

构建 (CMake)

除了手动构建,您还可以直接从 GitHub 上的main-tot 版本下载适合您平台的二进制文件,这些二进制文件在成功测试后由构建机器人自动上传,并且它们始终反映main分支的最新状态。

依赖关系

  • C++17 编译器。(对于 MSVS:使用 2019 或更高版本。)
  • CMake:用于生成编译目标。
  • make: Linux , ninja 是一个替代方案(如果已配置)。
  • Python 3.x:用于执行 SPIRV-Tools 脚本。(如果不使用 SPIRV-Tools 并且“外部”子目录不存在,则可选。)
  • bison:可选,但在更改语法时需要(glslang.y)。
  • googletest:可选,但在对 glslang 进行任何更改时应使用。

构建步骤

以下步骤假设使用 Bash shell。在 Windows 上,可能就是 Git Bash shell 或选择的其他 shell。

  • 检出项目
cd <parent of where you want glslang to be there>
git clone https://github.com/KhronosGroup/glslang.git
  • 检查外部项目
cd <the directory glslang was cloned to, "External" will be a subdirectory>
git clone https://github.com/google/googletest.git External/googletest

临时添加:另外执行以下操作以避免 googletest 中的当前有所损坏:

cd External/googletest
git checkout 0c400f67fcf305869c5fb113dd296eca266c9725
cd ../..

如果您希望确保从 HLSL 生成的 SPIR-V 对于 Vulkan 是合法的,希望调用 -Os 来减少 HLSL 或 GLSL 中的 SPIR-V 大小,或者希望运行集成测试套件,请使用以下命令安装spirv-tools:

./update_glslang_sources.py
  • 配置
    假设源目录为$SOURCE_DIR,构建目录为 $BUILD_DIR。首先确保构建目录存在,然后进入到它:
mkdir -p $BUILD_DIR
cd $BUILD_DIR

对于在 Linux 上构建:

cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX="$(pwd)/install" $SOURCE_DIR
# "Release" (for CMAKE_BUILD_TYPE) could also be "Debug" or "RelWithDebInfo"
  • 构建和安装
# for Linux:
make -j4 install

如果使用MSVC(Microsoft Visual Studio编译器),运行CMake配置后,使用配置管理器检查项目INSTALL。

如果需要更改 GLSL 语法

如果语法 glslang/MachineIndependent/glslang.y 发生变化,则必须使用 bison 重新编译,输出文件将提交到存储库,以避免每个开发人员在语法更改非常罕见时需要配置 bison 来编译项目。对于 Windows,您可以从GnuWin32获取二进制文件 。

重建的命令是:

bison --defines=MachineIndependent/glslang_tab.cpp.h
      -t MachineIndependent/glslang.y
      -o MachineIndependent/glslang_tab.cpp

updateGrammar当从 glslang 存储库的 glslang 子目录执行时,上述命令也可以在 bash 脚本中使用。

测试

目前,glslang 中存在两种测试工具:一种是Google Test,一种是runtestsscript。前者运行单元测试和单着色器单线程集成测试,而后者运行多着色器链接测试和多线程测试。

运行测试

runtests脚本需要将编译的二进制文件安装到**$BUILD_DIR/install**。请确保您**-DCMAKE_INSTALL_PREFIX**在构建时已向 CMake 提供了正确的配置(使用);否则,您可能需要脚本中的路径runtests。

运行Google Test 支持的测试:

cd $BUILD_DIR

# for Linux:
ctest

运行runtests脚本支持的测试:

cd $SOURCE_DIR/Test && ./runtests

基本内部操作

  • 初始词法分析由 中的预处理器完成 MachineIndependent/Preprocessor,然后由 中的 GLSL 扫描器进行细化MachineIndependent/Scan.cpp。目前没有使用flex。
  • MachineIndependent/glslang.y代码是在符号表和 AST 的帮助下使用 bison 进行解析的。符号表不会传递到后端;中间表示是独立的。该树是由语法产生式构建的,其中许多被卸载到ParseHelper.cpp、 和Intermediate.cpp。
  • 中间表示非常高级,并表示为内存中的树。这不会丢失原始程序中的任何信息,并且可以有效地将解析结果传输到后端。在 AST 中,常量被传播和折叠,并且消除了极少量的死代码。
    为了帮助链接和反射,AST 中的最后一个顶级分支列出了所有全局符号。
  • 后端编译器的主要算法是遍历树(高级中间表示),并创建内部目标代码表示。有一个关于如何执行此操作的示例MachineIndependent/intermOut.cpp。
  • 将树简化为线性字节码样式的低级中间表示可能是生成完全优化的代码的好方法。
  • 目前仍然存在一些已失效的旧式链接器类型代码。
  • 内存池:解析使用从 C++std类型派生的类型,使用自定义分配器将它们放入内存池中。这使得单个容器/内容物的分配只需几个周期并且无需重新分配。该池在 AST 生成并处理后弹出。

使用很简单:如果要调用new,则分为三种情况:

  • 该对象来自池(它的基类 POOL_ALLOCATOR_NEW_DELETE中有宏),您不必调用delete
  • 它是一个TString,在这种情况下 call NewPoolTString(),它从池中获取它,并且没有相应的delete
  • 该对象不是来自池,你必须对你的对象进行正常的 C++ 内存管理new
  • 功能可以通过版本/扩展/级别/配置文件进行保护:请参见中的评论glslang/MachineIndependent/Versions.cpp。

你可能感兴趣的:(Glslang,着色器,算法,c++,数据结构,其他)