1、前言
功夫不负有心人,终于DirectXShaderCompiler库,也就是HLSL的编译器开源项目源码也被我编译通过了,这是个不小的成功!于是我就乘热打铁,把整个编译的过程记录下来,并完整的分享给大家。目前HLSL Shader 已经发展到最新的V6.6版本了,按微软的叫法就是sm6.6,又增加了很多新的光追Shader特性,所以有喜欢研究编译器以及Shader编译原理或工具的网友,就很有必要掌握最新的DirectXShaderCompiler的编译方法了(其它的同学可以直接绕道下载Release版编译好的压缩包解压使用)。
整个DirectXShaderCompiler是基于LLVM项目分支构建的,LLVM项目是一个庞大的开源的跨多种平台的编译器后端自动化构建工具集,几乎可以支持目前所有各类CPU(x86、ARM、RISC、MIPS等)、GPU的机器码、中间码的生成。可以毫不夸张的说,如果再配合Flex+Bison+LLVM几乎就可以构建任何语言的跨任何硬件及操作系统平台的编译器了(当然有兴趣的话你可以自己设计自己的计算机语言!),这对于喜欢鼓捣编译原理以及编译器的同学来说简直就是来自上帝的福音(请原谅我已经热泪盈眶了)!关于这一块扩展的知识我就不多说了,Flex+Bison的基础应用以及标准C/C++语言的词法和语法文件都可以在我的博客中找到,我就不粘贴链接占篇幅了,大家可以直接到编译原理目录下查找。
OK,下面我们就言归正传,进入DirectXShaderCompiler的自编译生成之旅!
2、准备工作
首先,跟之前一篇文章一样,需要我们安装Git客户端工具,这个就不赘述了。
其次需要安装Python3.x以上版本,这里需要注意的是Python2.x版和Python3.x是两个不同分支体系的版本,并不是向下兼容的关系,因此下载和安装时尤其要注意,现在需要的V3.x以上的版本。Python的下载地址:https://www.python.org/getit/。安装成功后,命令行输入:
python --version
当前官方最新的版本是v3.9.4,我系统中的是v3.9.0,也够用了。这里一样提醒大家的是Python基本应用方法也是现代程序员必须掌握的硬核技能之一!
最后一样需要安装VS2019,前一篇文章中已经说过了,也就不再赘述了。重点提醒大家一定要安装VS2019的命令行工具(PowerShell工具)集。
3、下载DirectXShaderCompiler源码
为了整个下载编译过程的丝滑顺畅,后续的操作请大家一定要在VS2019命令行工具“Developer Command Prompt for VS 2019”中运行命令,并且以管理员身份运行这个集成PowerShell命令行工具集,运行正确的话窗口标题显示如下:
这里需要郑重提醒大家的是,请一定一定使用“Developer Command Prompt for VS 2019”集成命令行工具,而不要使用新升级版本的PowerShell7 等工具,这与前一个教程中使用的要求是完全不同的。新版本的PowerShell工具还不能很好的兼容DirectXShaderCompiler库中的命令行脚本。当然这是个问题,就看微软的那些“阿三”同行们什么时候纠正了。
首先从命令行进入到自己的项目目录中,我的项目目录是“Projects_2021”。
接着在“Developer Command Prompt for VS 2019”中运行Git命令下载DirectXShaderCompiler源码:
git clone https://github.com/microsoft/DirectXShaderCompiler.git
因为这个库体积比较大直接从Github下载有些慢,所以也可以从Gitee的克隆地址下载:
git clone https://gitee.com/gamebaby_admin/DirectXShaderCompiler.git
完成后,进入源码目录,同样使用Git命令查看分支并切换到最新的发布分支上:
D:\\Projects_2021\\DirectXShaderCompiler>git branch -a
* (HEAD detached at origin/master)
master
remotes/origin/19h1-rel
remotes/origin/HEAD -> origin/master
remotes/origin/SecureHLSLProto
remotes/origin/doc-extension
remotes/origin/dxcapi-uuid
remotes/origin/dxdia
remotes/origin/dxil-2017-06
remotes/origin/dxil-2017-09
remotes/origin/dxil-2017-10
remotes/origin/dxil-2017-11
remotes/origin/dxil-2017-12
remotes/origin/dxil-2018-03-01
remotes/origin/dxil-2018-05-21
remotes/origin/dxil-2018-09-10
remotes/origin/dxil-2018-1-30
remotes/origin/dxil-2019-03-29
remotes/origin/dxil-2019-05-16
remotes/origin/experimental
remotes/origin/fix-pix-alloca-reg-write-index
remotes/origin/fix-undeclared-id-crash
remotes/origin/hcttest-custom-bin
remotes/origin/hlsl-2021
remotes/origin/master
remotes/origin/merge-dxil-1-5
remotes/origin/pix-inst-numbering
remotes/origin/release-1.4.1907
remotes/origin/release-1.5.1909
remotes/origin/release-1.5.1910
remotes/origin/release-1.5.1911
remotes/origin/release-1.5.2002
remotes/origin/release-1.5.2003
remotes/origin/release-1.5.2003.1
remotes/origin/release-1.5.2005
remotes/origin/release-1.5.2010
remotes/origin/release-1.6.2012
remotes/origin/release-1.6.2102
remotes/origin/release-1.6.2104
remotes/origin/rs5-patched
remotes/origin/version-2005
D:\\Projects_2021\\DirectXShaderCompiler>git checkout remotes/origin/release-1.6.2104
Previous HEAD position was 3be3d15fc [spirv] update SPIRV-Tools submodule (#3694)
HEAD is now at e09a454eb Merge pull request #3684 from tex3d/refactor-exectest-setup-on-release
D:\\Projects_2021\\DirectXShaderCompiler>
4、编译DirectXShaderCompiler
然后进入DirectXShaderCompiler源码目录:
cd DirectXShaderCompiler
紧接着创建一个build目录,但不进入先,后面我们需要进入想象不到的目录:
mkdir build
然后我们进入DirectXShaderCompiler下的\\utils\\hct目录:
cd utils
cd hct
这时我们的命令行目录如下:
紧接着我们需要运行hct下的hctstart命令:
hctstart -x64 D:\\Projects_2021\\DirectXShaderCompiler D:\\Projects_2021\\DirectXShaderCompiler\\build
注意其中-x64是指生成64位版的DirectXShaderCompiler工具,第一个路径是指DirectXShaderCompiler的源码根目录,第二个路径就是最终生成的解决方案、项目、exe、dll、lib等文件的存放目录,也就是我们刚才创建的build子目录。当然高兴的话你可以随便建个目录放进去。
这个命令运行完之后注意命令行当前目录会自动跳回DirectXShaderCompiler源码的根目录:
然后最最重要的步骤到了,就是要安装TAEF库,这个库的安装是个非常蛋疼的事情,首先你需要安装Windows的 Windows 驱动程序开发工具包:
https://download.microsoft.com/download/c/f/8/cf80b955-d578-4635-825c-2801911f9d79/wdk/wdksetup.exe
下载后运行Wdksetup.exe,建议安装选项选择下载到本地某个目录中,而不是选择边下载边安装,防止因过程中断网或出错造成系统中被安装一堆垃圾。这个安装过程我就不再贴图了。
WDK安装完成后,回到“Developer Command Prompt for VS 2019”命令行工具,在DirectXShaderCompiler源码根目录下运行如下命令:
python -v utils\\hct\\hctgettaef.py
#或者
python utils\\hct\\hctgettaef.py
这个命令的执行就比较蛋疼了,没有任何进度提示,你所能做的就是默默的等待直到它自行结束,整个过程就像死机了一样,所以中途不要断网,不要关机,不要关闭命令行窗口,最好不要再动电脑,此时你可以去泡杯茶或咖啡,或者干脆去上厕所(我当时是点了根烟,开始手机上刷抖音)。由于这一步极度无聊,我就不贴图了。(友情提醒:这个之前,显卡驱动最好也更新到最新版,以防止发生意外!如果是不支持光追的显卡建议直接绕到了,不然我估计会出很多稀奇古怪的问题,导致整个编译过程受挫!)
下面就是在“活过来”的“Developer Command Prompt for VS 2019”命令行工具中,依然在DirectXShaderCompiler源码根目录下运行(第一个命令是清理并检查,二次编译时非常有用):
hctcheckin
或者直接运行:
hctbuild -vs2019
进行编译了。也可以输入下面的命令,查看更丰富的编译开关,编译出自己想要的DirectXShaderCompiler工具:
hctbuild -help
详细输出参考如下:
D:\\Projects_2021\\DirectXShaderCompiler>hctbuild -help
Builds HLSL solutions and the product and test binaries for the current
flavor and architecture.
系统找不到指定的文件。
-s creates the projects only, without building
-b builds the existing project
-alldef adds optional projects to the default build
-analyze adds /analyze option
-official will generate official version for build
-fv fixes the resource version for release (utils\\version\\version.inc)
系统找不到指定的文件。
-rel builds release rather than debug
-speak-up enables audible build confirmation
-no-parallel disables parallel build
-no-dxilconv disables build of DXBC to DXIL converter and tools
-vs2017 uses Visual Studio 2017 to build
-vs2019 uses Visual Studio 2019 to build
current BUILD_ARCH=x64. Override with:
-x86 targets an x86 build (aka. Win32)
-x64 targets an x64 build (aka. Win64)
-arm targets an ARM build
-arm64 targets an ARM64 build
Generator:
-ninja use Ninja as the generator
AppVeyor Support
-Release builds release
-Debug builds debug
ARM build support
-tblgen sets path to x86 or x64 versions of clang-tblgen and llvm-tblgen tools
The solution file is at D:\\Projects_2021\\DirectXShaderCompiler\\build\\LLVM.sln
前两个命令的执行过程我也就不再贴图了,因为实在是太多源码编译了,如果所有步骤都顺利的话,你应该自己能够看到整个冗长的检测或编译的过程。最后生成好的DirectXShaderCompiler工具全部在“\\DirectXShaderCompiler\\build\\Debug\\bin”目录中:
lib文件则在“\\DirectXShaderCompiler\\build\\Debug\\lib“中:
最后可以在你的项目中直接按主干教程中的教的,引用头文件库文件并使用函数的方式编译HLSL脚本,或者使用dxc.exe直接编译为GPU中间语言文件,再二次读入程序中运行。
暂无评论内容