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。
相关文章:
How to Use Glslang
文章目录 Execution of Standalone Wrapper构建 (CMake)依赖关系构建步骤如果需要更改 GLSL 语法测试运行测试基本内部操作 Execution of Standalone Wrapper 要使用独立的二进制形式,请执行glslang,它将打印一条使用语句。基本操作是给它一个包含着色器…...

AcWing 24:机器人的运动范围 ← BFS、DFS
【题目来源】https://www.acwing.com/problem/content/description/22/【题目描述】 地上有一个 m 行和 n 列的方格,横纵坐标范围分别是 0∼m−1 和 0∼n−1。 一个机器人从坐标 (0,0) 的格子开始移动,每一次只能向左,右,上&#…...

RF手机天线仿真介绍(一):金属边框天线和LDS天线
目录 简介LDS天线LDS天线仿真 金属边框天线金属边框天线仿真 简介 最早的手机是外置式天线,从NOKIA开始采用内置式天线,开始采用内置金属片(一般是0.1MM厚的不锈钢片冲压而成),随后为降低成本,后来改用FPC…...

动手学深度学习—深度学习计算(层和块、参数管理、自定义层和读写文件)
目录 1. 层和块1.1 自定义块1.2 顺序块1.3 在前向传播函数中执行代码 2. 参数管理2.1 参数访问2.1.1 目标参数2.1.2 一次性访问所有参数2.1.3 从嵌套块收集参数 2.2 参数初始化2.2.1 内置初始化2.2.2 自定义初始化 2.3 参数绑定 3. 自定义层3.1 不带参数的层3.2 带参数的层 4. …...

Pytest学习教程_测试报告生成pytest-html(三)
前言 pytest-html 是一个用于生成漂亮的 HTML 测试报告的 pytest 插件。它可以方便地将 pytest 运行的测试结果转换为易于阅读和理解的 HTML 报告,提供了丰富的测试结果展示功能和交互性。 一、安装 # 版本查看命令 pytest版本: pytest --version pyte…...

模块化原理:source-map
1. webpack打包基本配置 1.安装webpack与webpack-cli npm i webpack webpack-cli 2.配置 "build":"webpack" 3. 新建webpack.config.js const path require(path); module.exports {// mode: "development",// 默认production(什么…...

【C++】开源:ncurses终端TUI文本界面库
😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍ncurses终端文本界面库。 无专精则不能成,无涉猎则不能通。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下,下…...
C语言的_Bool类型
C99 新增了 _Bool 类型,用于表示布尔值,即逻辑值 true 和 false。 _Bool 类型也是一种整数类型。 原则上 _Bool 类型只占用一位存储空间。 C语言将非 0 的数当为 true,0 当为 false。 代码示例: #include<stdio.h> int…...

【python爬虫】获取某一个网址下面抓取所有的a 超链接下面的内容
import requests as rq from bs4 import BeautifulSoup as bs import re# rooturl是传的是我需要查询和抓取的一个网址,可以是html js 等 def gethtml(rooturl, encoding"utf-8"):#默认解码方式utf-8response rq.get(rooturl)response.encoding encodin…...

AutoDL从0到1搭建stable-diffusion-webui
前言 AI绘画当前非常的火爆,随着Stable diffusion,Midjourney的出现将AI绘画推到顶端,各大行业均受其影响,离我们最近的AI绘画当属Stable diffusion,可本地化部署,只需电脑配备显卡即可完成AI绘画工作&…...
手动调整broker扩容后的旧topic分区
在broker扩容了两台机器之后,想让旧topic:quickstart76-events的分区也能铺满broker 1、创建一个topics-to-move.json json文件 $ vim topics-to-move.json json {"topics": [{"topic":"quickstart76-events"}],"v…...
【LeetCode-简单】剑指 Offer 25. 合并两个排序的链表(详解)
题目 入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。 示例1: 输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4 本题与主站 21 题相同:力扣 题目地址&#x…...

Java版工程行业管理系统源码-专业的工程管理软件-em提供一站式服务
Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下: 首页 工作台:待办工作、消息通知、预警信息,点击可进入相应的列表 项目进度图表:选择(总体或单个)项目…...
【Spring】简化事件的使用,Spring提供了2种使用方式
Spring中事件可以配置顺序,利用线程池还可以做异步线程通知。怎么样使用事件?Spring简化事件的使用,Spring提供了2种使用方式:面向接口和面向EventListener注解。 1,面相接口的方式 案例 发布事件 需要先继承ApplicationEventP…...

探究Spring事务:了解失效场景及应对策略
在现代软件开发中,数据的一致性和完整性是至关重要的。为了保证这些特性,Spring框架提供了强大的事务管理机制,让开发者能够更加自信地处理数据库操作。然而,事务并非银弹,存在一些失效的情景,本文将带您深…...
Maven Manifold 条件编译
Maven 配置 通过 Maven 的不同 profile 实现不同环境传递不同符号。另外 lombok 可以 manifold 一同使用,见下方配置。 <properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.targ…...
4.数组与基本数学函数
一、数组 1.概念 数组是存放相同类型对象的容器,数组中存放的对象没有名字,而是要通过其所在的位置访问。数组中的每一个元素都相当于一个普通的变量,可以和普通变量一样进行赋值操作。 数组可以帮助我们批量地处理相同数据类型的相关数据…...

python与深度学习(十六):CNN和宝可梦模型二
目录 1. 说明2. 宝可梦模型的CNN模型测试2.1 导入相关库2.2 加载模型2.3 设置保存图片的路径2.4 加载图片2.5 数据处理和归一化2.6 对图片进行预测2.7 显示图片 3. 完整代码和显示结果4. 多张图片进行测试的完整代码以及结果 1. 说明 本篇文章是对上篇文章宝可梦模型训练的模型…...
PTA 1030 Travel Plan
个人学习记录,代码难免不尽人意。 A traveler’s map gives the distances between cities along the highways, together with the cost of each highway. Now you are supposed to write a program to help a traveler to decide the shortest path between his/h…...

MFC、Qt、WPF?该用哪个?
MFC、Qt和WPF都是流行的框架和工具,用于开发图形用户界面(GUI)应用程序。选择哪个框架取决于你的具体需求和偏好。MFC(Microsoft Foundation Class)是微软提供的框架,使用C编写,主要用于Windows…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...

C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...

搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...

C++ 设计模式 《小明的奶茶加料风波》
👨🎓 模式名称:装饰器模式(Decorator Pattern) 👦 小明最近上线了校园奶茶配送功能,业务火爆,大家都在加料: 有的同学要加波霸 🟤,有的要加椰果…...
第7篇:中间件全链路监控与 SQL 性能分析实践
7.1 章节导读 在构建数据库中间件的过程中,可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中,必须做到: 🔍 追踪每一条 SQL 的生命周期(从入口到数据库执行)&#…...

ubuntu系统文件误删(/lib/x86_64-linux-gnu/libc.so.6)修复方案 [成功解决]
报错信息:libc.so.6: cannot open shared object file: No such file or directory: #ls, ln, sudo...命令都不能用 error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory重启后报错信息&…...