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。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/20048.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WordPress做权重站:二级目录伪静态写法

我喜欢用WordPress建站&#xff0c;但是每个网站我都会写3个以上的二级目录&#xff0c;为什么了&#xff0c;因为WordPress数据量过大会导致数据库很大很卡&#xff0c;所以这种做法可以减轻数据库的负荷。我一般每个目录的文章达到15万篇就不会再更新了&#xff0c;3个目录加…

无边界野望:高通也有痛点?

外界给予高通的称呼无非是性价屠夫&#xff0c;因为即可“拳打”联发科&#xff0c;又能四度包下上海ChinaJoy展馆做游戏技术支持的王者&#xff0c;对高通来说它的路是无边界的&#xff0c;也是跨界之路上前行的“诗和远方”。 这里&#xff0c;既有生成式AI在终端侧布局、与…

React之组件的生命周期

React之组件的生命周期 一、概述二、整体说明三、挂载阶段四、更新阶段五、卸载阶段 一、概述 生命周期:一个事务从创建到最后消亡经历的整个过程组件的生命周期&#xff1a;组件从被创建到挂载到页面中运行&#xff0c;再到组件不用时卸载的过程意义&#xff1a;理解组件的生…

使用IPSEC VPN 在有防火墙的场景和有NAT转换的场景下实现隧道通信实验

目录 一、在有防火墙的场景 1、为所有设备配置对应ip地址&#xff1a; 2、进入两个防火墙实现公网互通 3、测试公网是否互通 4、进入SW1配置IPSEC VPN 5、进入SW2配置IPSEC VPN 6、配置策略方向ESP的流量 7、尝试使用PC1访问PC2 二、在有NAT地址转换的场景 1、为新增加…

视频号将不支持添加企业微信:私域流量受阻

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 以前大家一直嚷嚷着说微信视频号企业微信私域流量神器&#xff0c;这下好了&#xff0c;从今日起这个功能没了&#xff0c;以后新的视频号不能绑定企业微信了&#xff0c;但老视频号还可以。 昨天…

golang mongodb

看代码吧 package main// 链接案例 https://www.mongodb.com/docs/drivers/go/current/fundamentals/connection/#connection-example // 快速入门 https://www.mongodb.com/docs/drivers/go/current/quick-start/ import ("context""fmt""log"…

招投标系统简介 招投标系统源码 java招投标系统 招投标系统功能设计

&#xfeff;功能模块&#xff1a; 待办消息&#xff0c;招标公告&#xff0c;中标公告&#xff0c;信息发布 描述&#xff1a; 全过程数字化采购管理&#xff0c;打造从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通供应商门户具备内外协同的能力&…

c++游戏框架

游戏类 class Sprite { public:Sprite(int x, int y, int w, int h, const char* imagePath);~Sprite();void render(SDL_Renderer* renderer);void move(int x, int y); private:SDL_Texture* texture_;SDL_Rect rect_; }; 物理引擎类 class PhysicsEngine { public:Physi…

【数据结构】二叉树、二叉搜索树、平衡二叉树、红黑树、B树、B+树

概述 二叉树&#xff08;Binary Tree&#xff09;&#xff1a;每个节点最多有两个子节点&#xff08;左子节点和右子节点&#xff09;&#xff0c;没有限制节点的顺序。特点是简单直观&#xff0c;易于实现&#xff0c;但查找效率较低。 二叉搜索树&#xff08;Binary Search…

Redis设置hash,为不同的field设置不同的过期时间

Redis设置hash&#xff0c;为不同的field设置不同的过期时间 一、背景需求二、具体要求三、代码实现 一、背景需求 最近做了一个小需求&#xff0c;由于系统对接&#xff0c;导致我们的系统在高峰的时候CPU飙升&#xff0c;所以需要在高峰的时候保护系统进程不受影响。 而且还…

烘焙小程序蛋糕店烘焙店源码点心店小程序源码

本系统开发使用JAVA技术栈开发 使用uniapp技术栈 支持微信小程序 &#xff0c;对接打印机&#xff0c;对接第三方同城跑腿平台 用户端使用&#xff1a;uniapp 管理端使用&#xff1a;vueelementui 后台服务使用&#xff1a;springbootjpa

Java版本工程行业管理系统源码-专业的工程管理软件-提供一站式服务 em

​ 工程项目管理软件&#xff08;工程项目管理系统&#xff09;对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营&#xff0c;全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据字典&#…

科大讯飞-鸟类分类挑战赛-测试【1】

科大讯飞-鸟类分类挑战赛-测试【1】 1. 比赛说明2. EfficientNet测试2.1 **模型搭建:**2.2 **模型训练:**2.3 训练过程可视化2.4 一些报错解决:1. 比赛说明 背景: 随着生态环境的不断变化和人类对自然资源的过度开发,世界各地的鸟类数量和种类正在发生着巨大的变化。为了更…

网络OSI七层模型解析

在整理笔记时发现了该文章&#xff0c;也不记得是当时自己学习时的感悟还是记录的别人的精华了&#xff0c;感觉写的挺好&#xff0c;就放到博客上了&#xff0c;自己闲时可以看看&#xff0c;其他人有需求也可以瞅瞅。 1 物理层【比特】 首先解决两台物理机之间的通信需求&a…

不同语言操作符的优先级

看到标题&#xff0c;可能会心生疑惑: 这么基础且重要的操作&#xff0c;不同语言不应该是一致的吗&#xff1f; 并不一定&#xff0c;比如对于右移运算和加法运算&#xff0c;Go就与其他多数语言表现得不一致&#xff1a; Go: package mainimport "fmt"func main() …

Vault数据备份恢复-MySQL

前言 Vault提供了可靠的功能来保护数据库和其他关键数据。 对于MySQL数据库,Vault提供了一个易于使用的解决方案,可以自动创建和管理定期备份,并支持从备份中快速恢复数据。本文将介绍Vault后端存储MySQL的备份恢复,包括如何设置Vault、如何进行数据备份和还原、如何保护…

分布式天梯图算法在 Redis 图数据库中的应用

分布式天梯图算法在 Redis 图数据库中的应用 一、简介1 天梯图算法2 天梯图算法在Redis的应用 二、Redis分布式天梯图算法设计与优化1 基于天梯图的分布式算法设计2 多节点扩展与负载均衡优化3 数据存储方案与压缩策略 三、技术实现3.1 系统架构设计3.2 技术选型3.3 关键实现细…

前端工作常见数组数据处理的一些场景总结

一.对于数组进行修饰返回一个新的数组&#xff1b; 01.描述。 我们工作常常会发现后端传过来的数据有些不仅仅键值为空&#xff0c;甚至都没有键&#xff0c;也就是我们常说的属性名&#xff0c;那我们就需要去修改一下&#xff0c;返回一个结构正常的数据&#xff1b; 02.代…

iOS——Block two

Block 的实质究竟是什么呢&#xff1f;类型&#xff1f;变量&#xff1f;还是什么黑科技&#xff1f; Blocks 是 带有局部变量的匿名函数 Blocks 由 OC 转 C 源码方法 在项目中添加 blocks.m 文件&#xff0c;并写好 block 的相关代码。打开「终端」&#xff0c;执行 cd XX…

k8s新建集群官方指导文档

官方文档可能标的不清晰&#xff0c;在create cluster里面没有给具体怎么操作。 他主要是用这个kubeadm插件来进行新建集群的&#xff0c;我问过网站作者。 官方的tutorial在这里&#xff0c;其实还是步骤蛮多的。